一、簡介
Glide,一個被google所推薦的圖片加載庫,作者是bumptech。這個庫被廣泛運用在google的開源項目中,包括2014年的google I/O大會上發布的官方app。(PS:眾所周知的簡介就到此為止了)
Glide 對於 Android SDK 的最低要求是 API level 10
Glide滑行的意思,可以看出這個庫的主旨就在於讓圖片加載變的流暢。現在被廣泛使用,當然還是有很多開發者使用Square公司的picasso,也有兩個庫的對比
原文鏈接:http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
譯文鏈接:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html
二、使用
(一)導入
在AndroidStudio上添加依賴非常簡單
dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:support-v4:23.2.1' }
Glide 也支持 Maven 項目形式:
<dependency> <groupId>com.github.bumptech.glide</groupId> <artifactId>glide</artifactId> <version>3.7.0</version> </dependency> <dependency> <groupId>com.google.android</groupId> <artifactId>support-v4</artifactId> <version>r7</version> </dependency>
如果是Eclipse使用去下載Glide的jar在項目中使用就可以了,jar的鏈接https://github.com/bumptech/glide/releases
(二)基礎使用
基本方法
Glide的一個完整的請求至少需要三個參數,代碼如下:
String url = "http://img1.dzwww.com:8080/tupian_pl/20150813/16/7858995348613407436.jpg"; ImageView imageView = (ImageView) findViewById(R.id.imageView); Glide.with(context) .load(url) .into(imageView);
- with(Context context) - 需要上下文,這里還可以使用 Activity、FragmentActivity、android.support.v4.app.Fragment、android.app.Fragment 的對象。將 Activity/Fragment 對象作為參數的好處是,圖片的加載會和 Activity/Fragment 的生命周期保持一致,例如:onPaused 時暫停加載,onResume 時又會自動重新加載。所以在傳參的時候建議使用 Activity/Fragment 對象,而不是 Context。
- load(String url) - 這里我們所使用的一個字符串形式的網絡圖片的 URL,后面會講解 load() 的更多使用方式
- into(ImageView imageView) - 你需要顯示圖片的目標 ImageView
占位圖設置
偶爾出現圖片加載慢或者加載不出來的情況是難以避免的,所以為了 UI 能好看一些,我們會使用占位圖。Glide 也為我們提供這種方法 placeHolder() 和 error()
String url = "http://img1.dzwww.com:8080/tupian_pl/20150813/16/7858995348613407436.jpg"; ImageView imageView = (ImageView) findViewById(R.id.imageView); Glide.with(context) .load(url) .placeholder(R.drawable.place_image)//圖片加載出來前,顯示的圖片 .error(R.drawable.error_image)//圖片加載失敗后,顯示的圖片 .into(imageView);
注:這里需要注意一點,placeholder() 和 error() 的參數都是只支持 int 和 Drawable 類型的參數,這種設計應該是考慮到使用本地圖片比網絡圖片更加合適做占位圖。
縮略圖
Glide 的縮略圖功能在這里不得不說,和占位圖略有不同,占位圖必須使用資源文件才行,而縮略圖是動態的占位圖可以從網絡中加載。縮略圖會在世紀請求加載完成或者處理完之后才顯示。在原始圖片到達之后,縮略圖不會取代原始圖片,只會被抹除。
Glide 為縮略圖提供了2種不同的加載方式,比較簡單的方式是調用 thumbnail() 方法,參數是 float 類型,作為其倍數大小。例如,你傳入 0.2f 作為參數,Glide 將會顯示原始圖片的20%的大小,如果原圖是 1000x1000 的尺寸,那么縮略圖將會是 200x200 的尺寸。為縮略圖明顯比原圖小得多,所以我們需要確保 ImageView 的 ScaleType 設置的正確。
Glide.with( context ) .load( url ) .thumbnail( 0.2f ) .into( imageView );
注:應用於請求的設置也將應用於縮略圖。
使用 thumbnail() 方法來設置是簡單粗暴的,但是如果縮略圖需要通過網絡加載相同的全尺寸圖片,就不會很快的顯示了。所以 Glide 提供了另一種防止去加載縮略圖,先看代碼
private void loadImageThumbnailRequest(){ // setup Glide request without the into() method DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( url ); // pass the request as a a parameter to the thumbnail request Glide.with( context ) .load( url ) .thumbnail( thumbnailRequest ) .into( imageView ); }
與第一種方式不同的是,這里的第一個縮略圖請求是完全獨立於第二個原始請求的。該縮略圖可以是不同的資源圖片,同時也可以對縮略圖做不同的轉換,等等...
動畫開關
動畫效果可以讓圖片加載變得更加的平滑,crossFade() 方法強制開啟 Glide 默認的圖片淡出淡入動畫,當前版本3.7.0是默認開啟的。crossFade() 還有一個重載方法 crossFade(int duration)。可以控制動畫的持續時間,單位ms。動畫默認的持續時間是300ms。既然可以添加動畫,那肯定就可以設置沒有任何淡出淡入效果,調用 dontAnimate()
Glide.with(context) .load(url) .crossFade()//或者使用 dontAnimate() 關閉動畫 .placeholder(R.drawable.place_image) .error(R.drawable.error_image) .into(imageView);
PS:Glide 是可以自定義動畫效果的,這個在后面會講解
圖片大小與裁剪
在項目開發過程中,指定圖片顯示大小長長可能用到,畢竟從服務器獲取的圖片不一定都是符合設計圖的標准的。我們在這里就可以使用 override(width,height) 方法,在圖片顯示到 ImageView 之前,重新改變圖片大小。
Glide.with(context) .load(url) .override(width,height)//這里的單位是px .into(imageView);
在設置圖片到 ImageView 的時候,為了避免圖片被擠壓失真,ImageView 本身提供了 ScaleType 屬性,這個屬性可以控制圖片顯示時的方式,具體的屬性使用還是去搜索吧!Glide 也提供了兩個類似的方法 CenterCrop() 和 FitCenter(),CenterCrop() 方法是將圖片按比例縮放到足矣填充 ImageView 的尺寸,但是圖片可能會顯示不完整;而 FitCenter() 則是圖片縮放到小於等於 ImageView 的尺寸,這樣圖片是顯示完整了,但是 ImageView 就可能不會填滿了。
注:其實 Glide 的 CenterCrop() 和 FitCenter() 這兩個方法分別對應 ImageView 的 ScaleType 屬性中的 CENTER_CROP 和 FIT_CENTER 命名基本一致。
圖片的緩存處理
為了更快的加載圖片,我們肯定希望可以直接拿到圖片,而不是進行網絡請求,所以我們需要緩存。Glide 通過使用默認的內存和磁盤緩存來避免不必要的網絡請求,之后我們再詳細的去看它的實現。
內存緩存
內存緩存是 Glide 默認幫我們做了的,除非你不需要,可以調用 skipMemoryCache(true) 告訴 Glide 跳過內存緩存。這樣 Glide 就不會把這張圖片放到內存緩存中,該方法只影響內存緩存。(不要問調用skipMemoryCache(false)的問題,Glide 是默認將圖片放入內存緩存中的)
磁盤緩存
磁盤緩存也是默認開啟的,當然也是可以關閉的,不過關閉的方式略微有點不一樣。
Glide.with(context) .load(url) .skipMemoryCache(true) .diskCacheStrategy( DiskCacheStrategy.NONE ) .into(imageView);
上面這段代碼將內存緩存和磁盤緩存都禁用了,這里使用枚舉 DiskCacheStrategy.NONE 將磁盤緩存禁用了,這里涉及到了自定義磁盤緩存行為,我們接下來就講解這個。
自定義磁盤緩存行為
使用 DiskCacheStrategy 可以為 Glide 配置磁盤緩存行為。Glide 的磁盤緩存比較復雜,這也是在圖片加載可以比 Picasso 的原因(之一)。Picasso 只緩存了全尺寸的圖片,而 Glide 的不同之處在於,Glide 不僅緩存了全尺寸的圖,還會根據 ImageView 大小所生成的圖也會緩存起來。比如,請求一個 800x600 的圖加載到一個 400x300 的 ImageView 中,Glide默認會將這原圖還有加載到 ImageView 中的 400x300 的圖也會緩存起來。
DiskCacheStrategy 的枚舉意義:
- DiskCacheStrategy.NONE 什么都不緩存
- DiskCacheStrategy.SOURCE 只緩存全尺寸圖
- DiskCacheStrategy.RESULT 只緩存最終的加載圖
- DiskCacheStrategy.ALL 緩存所有版本圖(默認行為)
這只是舉個例子而已
Glide.with(context)
.load(url)
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into(imageView);
圖片請求的優先級
同一時間加載多個圖片,App 將難以避免這種情況。如果這個時候我們希望用戶的體驗更好,往往會選擇先加載對於用戶更加重要的圖片。Glide 可以調用 .priority() 方法配合 Priority 枚舉來設置圖片加載的優先級。
//設置 HIGH 優先級 Glide.with( context ) .load( highPriorityImageUrl ) .priority (Priority.HIGH ) .into( imageView ); //設置 LOW 優先級 Glide.with( context ) .load( lowPriorityImageUrl ) .priority( Priority.LOW ) .into( imageView );
- Priority.LOW
- Priority.NORMAL
- Priority.HIGH
- Priority.IMMEDIAT
這里有一點需要注意,優先級並不是完全嚴格遵守的。Glide 將會用他們作為一個准則,盡可能的處理這些請求,但是不能保證所有的圖片都會按照所有要求的順序加載。
顯示 Gif 和 Video
顯示 GIf 對於 Glide 來說一個比較特別的功能(至少 Picasso 暫時還不行)而且使用起來非常簡單
String gifUrl = "http://i2.mhimg.com/M00/0E/AE/CgAAilTPWJ2Aa_EIACcMxiZi5xE299.gif"; Glide.with( context ) .load( gifUrl ) .placeholder( R.drawable.default ) .error( R.drawable.error ) .into( imageView );
這段代碼還有點問題,如果加載的不是一張 gif 圖的話,是沒有辦法顯示的。
Glide.with( context )
.load( gifUrl )
.asGif()
.error( R.drawable.error )
.into( imageView );
做以上修改,如果圖片類型不是 Gif 圖的話就會當作 load 失敗來處理,因此 error() 會被回調。即使這個url的圖片是好的,也是不會顯示的。當然,如果你想顯示 Gif 但只是向現實靜態的圖片你就可以這么做
Glide.with( context )
.load( gifUrl )
.asBitmap()
.error( R.drawable.error )
.into( imageView );
僅僅是顯示 Gif 的第一幀圖像,這樣就可以保證圖片的正常顯示了。
還有一個神奇的功能,Glide 還能顯示視頻!But...只能夠顯示手機本地的視頻,要是向現實網絡上的視頻的話,還是另尋他法吧!
String filePath = "/storrage/emulated/0/Pictures/video.mp4"; Glide.with( context ) .load( Uri.fromFile( new File( filePath ) ) ) .into( imageView );
Glide 的基礎使用就講解到這了。
(三)進階使用
Target篇
到現在為止,我們所涉及到的代碼都是直接加載圖片到 ImageView 中。Glide 隱藏做了所有的網絡請求和后台的線程處理,圖片准備好之后切回到 UI 線程刷新 ImageView。也就是說 ImageView 在我們代碼的鏈式結構中成為了最后一步,但是如果我們需要獲取到 Bitmap 本身
的話我們就需要用到 Target 了。Target 其實就是整個圖片的加載的生命周期,所以我們就可以通過它在圖片加載完成之后獲取到 Bitmap。
其實對於 Target 可以簡單的理解為回調,本身就是一個 interface,Glide本身也為我們提供了很多 Target
SimpleTarget
直接上代碼
private SimpleTarget<Bitmap> mSimpleTarget = new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> animation) { mImageView.setImageBitmap(resource); } }; private void loadImageSimpleTarget() { Glide.with( thi s) .load( mUrl ) .asBitmap() .into( mSimpleTarget ); }
首先創建了一個 SimpleTarget 的對象並且實現了 onResourceReady() 方法,看方法名能知道是圖片加載完之后會調用該方法,參數就有我們需要的 Bitmap 。而使用 SimpleTarget 的對象的時候就像使用 ImageView 一樣,作為參數傳給 into() 方法就行了,Glide 會內部去處理並返回結果給任何一個對象。這里我們為了防止加載 Gif 、 Video 或者一些位置資源時與 mSimpleTarget 沖突,所以我們調用了 asBitmap() 方法,使其只能返回 Bitmap 對象。
這里就有個問題了,如果我需要改變圖片的大小怎么辦?這點小問題 Glide 還是有考慮到的,加入原尺寸 1000x1000 的圖片,我們顯示的時候只需要是 500x500 的尺寸來節省時間和內存,你可以在 SimpleTarget 的回調聲明中指定圖片的大小。
private SimpleTarget<Bitmap> mSimpleTarget = new SimpleTarget<Bitmap>(500,500) { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> animation) { mImageView.setImageBitmap(resource); } };
從代碼中可以看到 SimpleTarget 的對象的聲明沒有使用匿名對象,而是單獨的聲明了一個變量,這里是故意這么做的,如果使用匿名內部類的方式創建 SimpleTarget 的對象,這樣會增大該對象在 Glide 完成圖片請求之前就被回收的可能性。
還記得前面說過 with() 方法傳入 Activity 或者 Fragment 時 Glide 的圖片加載會與他們的生命周期關聯起來,但是如果我們使用 Target 的話,這個 Target 就有可能獨立於他們的生命周期以外,這時候我們就需要使用 context.getApplicationContext() 的上下文了,這樣只有在應用完全停止時 Glide 才會殺死這個圖片請求。代碼如下
Glide.with(mContext.getApplicationContext())
.load(mUrl)
.asBitmap()
.into(target);
ViewTarget
當我們使用 Custom View 時,Glide 並不支持加載圖片到自定義 view 中的,使用 ViewTarget 更容易實現。
public class CustomView extends FrameLayout { private ImageView mImageView; public CustomView(Context context) { super(context); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFinishInflate() { super.onFinishInflate(); mImageView = new ImageView(getContext()); addView(mImageView , LayoutParams.MATCH_PARENT , LayoutParams.MATCH_PARENT); } public void setImage(Drawable drawable){ mImageView.setImageDrawable(drawable); } }
上面這個例子就沒有辦法直接使用 .into() ,如果我們使用 ViewTarget 實現呢!
public void loadImageTarget(Context context){ CustomView mCustomView = (CustomView) findViewById(R.id.custom_view); ViewTarget viewTarget = new ViewTarget<CustomView,GlideDrawable>( mCustomView ) { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { this.view.setImage(resource); } }; Glide.with(context) .load(mUrl) .into(viewTarget); }
在 target 的 onResourceReady 回調方法中使用自定義 view 自己的方法去設置圖片,可以看到在創建 ViewTarget 的時候傳入了 CustomView 的對象。
還有其他Target的使用這里就不一一講述了,例如 AppWidgetTarget 、 NotificationTarget ...
Transformations篇
圖片顯示之前我們可能還需要對圖片進行處理操作,比如:圖片切圓角,灰階處理等等;這些需求我們通過 Transformations 操作 bitmap 來實現,我們可以修改圖片的任意屬性:尺寸,范圍,顏色,像素位置等等。其實我們之前已經提到過兩個 Transformation 了,即 fitCenter 和 centerCrop ,這兩個是 Glide 已經實現的。
接下來就要講講怎么樣來實現自己的 Transformation ,我們需要創建一個類去實現 Transformation 接口,但是要實現這個方法還是比較復雜的,接口中 transform 方法提供的參數 Resource<T> resource 不是那么好處理的。如果你只是想要對圖片(不是 Gif 和 video)做常規的 bitmap 轉換,我們推薦你使用抽象類 BitmapTransformation。它簡化了很多的實現,這應該能覆蓋 95% 的應用場景啦。
下面的代碼實現了對圖片切圓角的操作,其中 getId() 方法描述了這個 Transformation 的唯一標識,為避免意外我們需要確保它是唯一的。
public class RoundTransformation extends BitmapTransformation { private float radius = 0f; public RoundTransformation(Context context) { this(context, 4); } public RoundTransformation(Context context, int px) { super(context); this.radius = px; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); } private Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } @Override public String getId() { return getClass().getName() + Math.round(radius); } }
現在我們有了自己的 Transformation 就可以來看看怎么使用了。
調用 .transform() 方法,將自定義的 Transformation 的對象作為參數傳遞進去就可以使用你的 Transformation 了,這里也可以使用 .bitmaoTransform() 但是它只能用於 bitmap 的轉換。
Glide.with(context) .load(mUrl) .transform(new RoundTransformation(context , 20)) //.bitmapTransform( new RoundTransformation(context , 20) ) .into(mImageView);
如果我們需要同時執行多個 Transformation 的話,我們不能使用鏈式的形式多次調用 .transform() 或 .bitmapTransform() 方法,即使你調用了,之前的配置就會被覆蓋掉!我們可以直接傳遞多個轉換對象給 .transform() 或 .bitmapTransform() 。
Glide.with(context) .load(mUrl) .transform(new RoundTransformation(context , 20) , new RotateTransformation(context , 90f)) .into(mImageView);
這段代碼中我們把一個圖片切圓角,然后做了順時針旋轉90度處理。
下面是旋轉處理的代碼
public class RotateTransformation extends BitmapTransformation { private float rotateRotationAngle = 0f; public RotateTransformation(Context context, float rotateRotationAngle) { super( context ); this.rotateRotationAngle = rotateRotationAngle; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { Matrix matrix = new Matrix(); matrix.postRotate(rotateRotationAngle); return Bitmap.createBitmap(toTransform, 0, 0, toTransform.getWidth(), toTransform.getHeight(), matrix, true); } @Override public String getId() { return getClass().getName() + Math.round(rotateRotationAngle); } }
注:這里需要注意一點 .centerCrop() 和 .fitCenter() 也都是 Transformation 所以也是遵循同時使用多個 Transformation 的規則的,即:當你使用了自定義轉換后你就不能使用 .centerCrop() 或 .fitCenter() 了。
這里有一個 GLide Transformations 的庫,它提供了很多 Transformation 的實現,非常值得去看,不必重復造輪子對吧!
glide-transformations
這個庫有兩個不同的版本,擴展版本包含了更多的 Transformation ,它是通過設備的 GPU 來計算處理的,需要有額外的依賴,所以這兩個版本的設置有一點不同。還是根據需要再決定使用那個版本吧!
Animate篇
從圖像到圖像的平滑過渡是非常重要,Glide 中有一個標准動畫去柔軟的在你的 UI 中改變,但是我們現在希望設置自己的動畫。
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true"> <scale android:duration="@android:integer/config_longAnimTime" android:fromXScale="0.1" android:fromYScale="0.1" android:pivotX="50%" android:pivotY="50%" android:toXScale="1" android:toYScale="1"/> </set>
這是個 XML 動畫縮放動畫,圖片剛開始小的,然后逐漸增大到原尺寸。我們現在要應用到 Glide 加載圖片中去,調用 .animate() 方法傳入 XML 動畫的 id 即可。
Glide.with(context) .load(mUrl) .transform(new RoundTransformation(this , 20)) .animate( R.anim.zoom_in ) .into(mImageView);
這種加載方式用在常規的 ImageView 上是沒有問題的,但如果使用的 Target 是一些自定義的時候就沒法好好的實現了。這時候我們就可以通過傳入實現了 ViewPropertyAnimation.Animator 接口的類對象來實現。
ViewPropertyAnimation.Animator animator = new ViewPropertyAnimation.Animator() { @Override public void animate(View view) { view.setAlpha( 0f ); ObjectAnimator fadeAnim = ObjectAnimator.ofFloat( view, "alpha", 0f, 1f ); fadeAnim.setDuration( 2500 ); fadeAnim.start(); } };
然后,我們只需要在 Glide 請求中設置這個動畫對象就ok了
Glide.with(context)
.load(mUrl)
.animate( animator )
.into(viewTarget);
在 animate(View view) 中你的動畫對象方法中, 你可以做任何你想要對視圖做的事情。自由的用你創建的動畫吧。
Modules篇
Glide 的 Module 是一個可以全局改變 Glide 的行為的東西,為了定制 Glide 的行為我們要去實現 interface GlideModule 來寫我們自己的代碼。
public class ExampleModule implements GlideModule{ @Override public void applyOptions(Context context, GlideBuilder builder) { // todo } @Override public void registerComponents(Context context, Glide glide) { // todo } }
可以看到 GlideModule 為我們提供了兩個方法,這里我們主要使用的是 applyOptions(Context context, GlideBuilder builder) , 我們自己的需要重新定義的代碼寫在該方法里就可以了。然后我們還需要去 AndroidManifest.xml 中使用 meta 聲明我們上面實現的 Module
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mrtrying.demoglide"> <application> <meta-data android:name="com.mrtrying.demoglide.module.ExampleModule" android:value="GlideModule" /> ... </application> ... </manifest>
到這里我們就完成了 ExampleModule 的聲明,Glide 將會在工作是使用我們所定義的 Module
TIPS
我們需要將 android:name 屬性改成 包名+類名 的形式,這樣的引用才是正確的。如果你想刪掉 Glide Module,只需要刪除在 AndroidManifest.xml 中的聲明就可以了。Java 類可以保存,說不定以后會用呢。如果它沒有在 AndroidManifest.xml 中被引用,那它不會被加載或被使用。
定制 module 的話 Glide 會有這樣一個優點:你可以同時聲明多個 Glide module。Glide 將會(沒有特定順序)得到所有的聲明 module。因為你當前不能定義順序,請確保定制不會引起沖突!
這個過程走通了,接下來我們來看看是怎么自定義的。applyOptions(Context context, GlideBuilder builder) 中有兩個參數, 我們通過使用 GlideBuilder 來實現我們的需求。先看看 GlideBuilder 中可用的方法
- .setMemoryCache(MemoryCache memoryCache)
- .setBitmapPool(BitmapPool bitmapPool)
- .setDiskCache(DiskCache.Factory diskCacheFactory)
- .setDiskCacheService(ExecutorService service)
- .setResizeService(ExecutorService service)
- .setDecodeFormat(DecodeFormat decodeFormat)
可以看到,這個 GlideBuilder 對象給你訪問了 Glide 重要的核心組件。接下來我們就要試着去使用這些方法
增加 Glide 的圖片質量
在 Android 中有兩個主要的方法對圖片進行解碼:ARGB_8888 和 RGB_565 。前者為每個像素使用4個字節,后者每個像素僅使用2個字節。ARGB_8888 的有時就是圖像質量更高以及能儲存一個 alpha 通道。 Picasso 使用的就是 ARGB_8888 , Glide 默認使用低質量的 RGB_565 ,但是現在你就可以使用 Glide module 來改變圖片解碼規則。就象這樣
public class QualityModule implements GlideModule{ @Override public void applyOptions(Context context , GlideBuilder builder){ builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context , Glide glide){ // nothing to do here } }
這樣我們就簡單的增加了 Glide 的圖片質量。
往往我們還會遇到一些情況,希望 Glide 可以使用我們自己的網絡框架,我們就需要做一些事情來實現這個需求了。Glide 的開發者不強制設置網絡庫給你,所以Glide可以說和 HTTPS 無關。理論上,它可以與任何的網絡庫實現,只要覆蓋了基本的網絡能力就行。同樣是需要實現 Glide 的 ModuleLoader 的接口,為了讓我們更加易用,Glide 為 OkHttp 和 Volley 兩個網絡庫提供了實現。
假設我要集成 OkHttp 作為 Glide 的網絡庫,我可以手動實現一個 GlideModule 也可以在 build.gradle 中添加依賴:
dependencies{ //... // Glide compile 'com.github.bumptech.glide:glide:3.7.0' // Glide's OkHttp Integration compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar' compile 'com.squareup.okhttp:okhttp:3.2.0' }
Gradle 會自動合並必要的 GlideModule 到你的 AndroidManifest.xml , Glide 會認可在 manifest 中存在,然后使用 OkHttp 做到的所有網絡連接。
轉自:https://www.jianshu.com/p/7ce7b02988a4
