Glide詳細使用總結

weixin_34007291發表於2016-08-22

Glide 是一個高效、開源、 Android裝置上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協議釋出。Glide具有獲取、解碼和展示視訊劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發者能夠將Glide應用在幾乎任何網路協議棧裡。建立Glide的主要目的有兩個,一個是實現平滑的圖片列表滾動效果,另一個是支援遠端圖片的獲取、大小調整和展示。

Glide簡單使用

就像 Picasso、Glide 庫是使用流介面(fluent interface)。對一個完整的功能請求,Glide 建造者要求最少有三個引數。

  • with(Context context) - 上下文環境
  • load(String imageUrl) - 需要載入圖片的URL.
  • into(ImageView imageView) - 圖片顯示的ImageView.
Glide.with(context).load(imageUrl).into(imageView);

從其他源載入圖片(資原始檔、檔案、Uri、assets、raw、ContentProvider、sd卡資源)

Glide.with(context).load(R.mipmap.ic_launcher).into(imageView);
Glide.with(context).load(file).into(imageView);
Uri uri = resourceIdToUri(context, R.mipmap.ic_launcher);
Glide.with(context).load("Android.resource://com.frank.glide/raw/raw_1").into(imageView);
Glide.with(context).load("android.resource://com.frank.glide/raw/"+R.raw.raw_1).into(imageView);
Glide.with(context).load("content://media/external/images/media/139469").into(imageView);
Glide.with(context).load("file:///android_asset/f003.gif").into(imageView);
Glide.with(context).load("file://"+ Environment.getExternalStorageDirectory().getPath()+"/test.jpg").into(imageView);

佔點陣圖,錯誤圖,和淡入淡出效果

Glide
    .with(context)
    .load(url)
    .placeholder(R.mipmap.defalut) //設定佔點陣圖
    .error(R.mipmap.error) //設定錯誤圖片
    .crossFade() //設定淡入淡出效果,預設300ms,可以傳參
    //.dontAnimate() //不顯示動畫效果
    .into(imageView);

設定下載優先順序

• Priority.LOW
• Priority.NORMAL
• Priority.HIGH
• Priority.IMMEDIATE

Glide
    .with(context)
    .load(url)
    .priority(Priority.NORMAL)
    .into(imageView);

設定圖片大小和縮放形式

Glide 會根據ImageView的大小,自動限制圖片快取和記憶體中的大小,當然也可以通過呼叫override(horizontalSize, verticalSize)限制圖片的大小:

Glide
    .with(context)
    .load(url)
    .override(200, 200) 
    .into(imageView);

Glide支援兩種圖片縮放形式,CenterCrop 和 FitCenter
CenterCrop:等比例縮放圖片,直到圖片的狂高都大於等於ImageView的寬度,然後擷取中間的顯示。

Glide
    .with(context)
    .load(url)
    .override(200, 200) 
    .centerCrop() 
    .into(imageView);

FitCenter:等比例縮放圖片,寬或者是高等於ImageView的寬或者是高。

Glide
    .with(context)
    .load(url)
    .override(200, 200)
    .fitCenter() 
    .into(imageView);

設定動態轉換,圖片的形狀

<a href="https://youth5201314.github.io/2016/08/09/Glide%E5%8A%A0%E8%BD%BD%E8%87%AA%E5%AE%9A%E4%B9%89%E5%9B%BE%E5%BD%A2%E5%BD%A2%E7%8A%B6/" target="_blank"> [ 我的另一篇部落格傳送門 ]

設定監聽請求介面

設定監聽的用處 可以用於監控請求發生錯誤來源,以及圖片來源 是記憶體還是磁碟

Glide.with(this).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() {
    @Override
    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
    return false;
    }

    @Override
    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
    return false;
    }
}).into(imageView);

Glide優化方法

清除快取的方法

Glide.get(this).clearDiskCache();//清理磁碟快取 需要在子執行緒中執行
Glide.get(this).clearMemory();//清理記憶體快取  可以在UI主執行緒中進行

清除掉所有的圖片載入請求

Glide.clear()

滾動載入,不滾動時不載入,提高listview效率

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    switch (scrollState){
        case SCROLL_STATE_FLING:
            Log.i("ListView","使用者在手指離開螢幕之前,由於滑了一下,檢視仍然依靠慣性繼續滑動");
            Glide.with(getApplicationContext()).pauseRequests();
            //重新整理
            break;
        case SCROLL_STATE_IDLE:
            Log.i("ListView", "檢視已經停止滑動");
            Glide.with(getApplicationContext()).resumeRequests();
            break;
        case SCROLL_STATE_TOUCH_SCROLL:
            Log.i("ListView","手指沒有離開螢幕,檢視正在滑動");
            Glide.with(getApplicationContext()).resumeRequests();
            break;
    }

}

圖片列表預載入,提高載入速度

在圖片顯示在螢幕上之前就預先取出圖片。它提供了一個ListPreloader類, 它被應該事先取出的item數目例項化。然後通過setOnScrollListener(OnScrollListener).被傳遞給ListView。你想在ListView之外也能預先取出圖片嗎?沒問題,使用前面的builder物件就可以了,只需呼叫builder.downloadOnly()。

Glide3.0新特性

動態的GIF圖片載入

Glide.with(context).load(gifUrl).asBitmap().into(imageview); //顯示gif靜態圖片
Glide.with(context).load(gifUrl).asGif().into(imageview); //顯示gif動態圖片

本地視訊快照

Glide.with(context).load("視訊路徑/視訊檔案/本地視訊路徑").into(imageview);   

對縮圖的支援

//載入1/10尺寸的縮圖,然後載入全圖
Glide.with(context).load(url).thumbnail(0.1f).into(imageview)

生命週期整合

同時將Activity/Fragment作為with()引數的好處是:圖片載入會和Activity/Fragment的生命週期保持一致,

  • 請求會在onStop的時候自動暫停,
  • 在onStart的時候重新啟動,gif的動畫也會在onStop的時候停止,以免在後臺消耗電量,

轉碼

Glide的.toBytes()和.transcode()方法允許在後臺獲取、解碼和轉換一個圖片,你可以將一張圖片轉換成更多有用的圖片格式,比如,上傳一張250*250的圖片

Glide.with(context)
    .load("path")
    .asBitmap()
    .toBytes()
    .centerCrop()
    .into(new SimpleTarget<byte[]>(250, 250) {
        @Override
        public void onResourceReady(byte[] data, GlideAnimation anim) {
            // Post your bytes to a background thread and upload them here.
        imageView.setImageDrawable(resource);
    }
    });

動畫:加入了cross fades和View的屬性動畫的支援

Glide  
    .with( context )
    .load( url )
    .animate( android.R.anim.slide_in_left ) 
    .into( imageView );

OR

ViewPropertyAnimation.Animator animationObject = 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  
    .with( context )
    .load( url )
    .animate( animationObject )
    .into( imageView );

網路模組可以選擇OkHttp或者Volley的支援

Volley和OkHttp可以在gradle檔案當中新增依賴,註冊相應的ModelLoaderFactory

記憶體快取

設定跳過記憶體快取

Glide
    .with(context)
    .load(url)
    .skipMemoryCache(true)
    .into(imageView);

設定快取策略(磁碟快取)

策略解說:
all:快取源資源和轉換後的資源
none:不作任何磁碟快取
source:快取源資源
result:快取轉換後的資源

Glide
    .with(context)
    .load(url)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(imageView);

在後臺執行緒當中進行載入和快取

為了保證Glide在後臺執行緒當中載入資原始檔更加容易,Glide除了Glide.with(fragment).load(url).into(view)之外還提供了

downloadOnly(int width, int height)
downloadOnly(Y target)// Y extends Target<File>
into(int width, int height)

1.downloadOnly

Glide的downloadOnly()允許開發者將Image的二進位制檔案下載到硬碟快取當中,以便在後續使用,

在UI執行緒當中非同步下載,在非同步執行緒當中則是使用width和height
在非同步執行緒當中同步呼叫下載,在同步執行緒當中,
downloadOnly使用一個target作為引數
1、 在後臺執行緒當中下載圖片,可以通過如下的方式:

FutureTarget<File> future = Glide.with(applicationContext)
    .load(yourUrl)
    .downloadOnly(500, 500);
File cacheFile = future.get();

當future返回的時候,image的二進位制檔案資訊就存入了disk快取了,值得注意的是downloadOnly API只是保證圖片個bytes資料在disk當中是有效的。

2、下載完畢之後如果想要進行顯示,可以通過如下方式進行呼叫:

Glide.with(yourFragment)
    .load(yourUrl)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(yourView);

Glide.with(yourFragment)
    .load(yourUrl)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(yourView);

通過DiskCacheStrategy.ALL或者DiskCacheStrategy.SOURCE,可以保證程式會去讀取快取檔案

  1. 如果想要在後臺執行緒當中獲取某個URL對應的Bitmap

不通過downloadOnly,可以使用into(),會返回一個FutureTarget物件,比如,想要得到一個URL對應的500*500的centerCrop裁剪圖片,可以通過如下方式實現:

Bitmap myBitmap = Glide.with(applicationContext)
    .load(yourUrl)
    .asBitmap()
    .centerCrop()
    .into(500, 500)
    .get()

注意:上面的呼叫只能在非同步執行緒當中,如果在main Thread當中呼叫.get(),會阻塞主線

相關文章