Google推薦——Glide使用詳解(圖片加載框架)


 

零、前言

本文所使用的Glide版本為3.7.0

一、簡介

Glide,一個被google所推薦的圖片加載庫,作者是bumptech。這個庫被廣泛運用在google的開源項目中,包括2014年的google I/O大會上發布的官方app。(PS:眾所周知的簡介就到此為止了)Glide 對於 Android SDK 的最低要求是 API level 10Glide滑行的意思,可以看出這個庫的主旨就在於讓圖片加載變的流暢。現在被廣泛使用,當然還是有很多開發者使用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>
github地址:https://github.com/bumptech/glide     如果是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
所有Targets
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 做到的所有網絡連接。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM