{Android}一行程式碼起飛,Glide載入gif優化實踐
前言
最近專案中有使用到gif動畫,加上本身已經引入了Glide 3.7.0(支援gif)庫,所以便用Glide來載入了;但在使用過程中還是遇到了不少困難, 在此記錄下,希望可以給遇到類似問題的你一些思考和建議。

一、Glide載入gif
1.在專案中新增依賴
dependencies { compile 'com.github.bumptech.glide:glide:4.0.0' compile 'com.android.support:support-v4:25.3.1' }
Glide需要依賴Support Library v4
2.載入圖片
// For a simple view: @Override public void onCreate(Bundle savedInstanceState) { ... ImageView imageView = (ImageView) findViewById(R.id.my_image_view); Glide.with(this) .load("http://goo.gl/gEgYUd") .into(imageView); }
// For a simple image list: @Override public View getView(int position, View recycled, ViewGroup container) { final ImageView myImageView; if (recycled == null) { myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false); } else { myImageView = (ImageView) recycled; } String url = myUrls.get(position); Glide .with(myFragment) .load(url) .centerCrop() .placeholder(R.drawable.loading_spinner) .into(myImageView); return myImageView; } //不使用它的預設動畫 Glide.with(mContext) .load(url) .dontAnimate() .placeholder(R.drawable.loading_spinner) .into(circleImageview);
提示:不要再非主執行緒裡面使用Glide載入圖片,如果真的使用了,請把context引數換成getApplicationContext
3.載入GIF
如果只是簡單載入gif,其實跟載入普通圖片一樣
Glide.with(this).load(mGifUrl).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
如果希望載入gif時只加載gif的第一幀,把gif當作普通圖片一樣載入,那麼只需要加上asBitmap方法即可
Glide.with(this).load(mGifUrl).asBitmap().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
如果你希望載入的只是gif,如果不是gif就顯示錯誤圖片,那麼只用加上asGif方法即可
Glide.with(this).load(mGifUrl).asGif().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
網路上很多文章上都是從一篇譯文裡面拷貝過來的,裡面說Glide可以載入本地視訊,但是那篇譯文漏翻譯一句了,Glide只會載入本地視訊的第一幀,也就是縮圖,而且其實載入縮圖的時候也無需轉化為Uri,直接把File丟進去就行了
mVideoFile = new File(Environment.getExternalStorageDirectory(), "xiayu.mp4"); Glide.with(this).load(mVideoFile).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);
在大多數情況下,當你使用diskCacheStrategy(DiskCacheStrategy.SOURCE)時,Gif的載入速度會顯著提高(其實就是把gif資源快取到磁碟)->可以解決gif載入慢或載入不出來的情況(NONE是不快取資料,SOURCE是快取原型,原圖)
Glide.with(this).load(mGifUrl).diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder(R.mipmap.place) .error(R.mipmap.icon_photo_error) .into(mIv);
動態顯示gif圖的次數,比如我想顯示一次gif就停止
Glide.with(this).load("url").diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(new GlideDrawableImageViewTarget(iv, 1));
這裡的GlideDrawableImageViewTarget(ImageView view, int maxLoopCount)這個方法,maxloopCount可以控制顯示次數。

二、Glide載入gif優化
1.解決Glide載入Gif非常慢問題
Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);
為其新增快取策略,其中快取策略可以為:Source及None,None及為不快取,Source快取原型.如果為ALL和Result就不行
2.載入第一貞:
Glide.with(context).load(gifUrl).asBitmap().into(imageViewGifAsBitmap);
3.控制動畫次數:
Glide.with(this).load(getResource()).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new GlideDrawableImageViewTarget(imageView, 1));
4.GIF 時間:
Glide.with(FirstActivity.this) .load(file) .asGif() .fitCenter() .diskCacheStrategy(DiskCacheStrategy.SOURCE) .listener(new RequestListener<File, GifDrawable>() { @Override public boolean onException(Exception e, File model, Target<GifDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(final GifDrawable resource, File model, Target<GifDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { new Thread(new Runnable() { @Override public void run() { int duration = 0; try { GifDrawable gifDrawable = (GifDrawable) resource; GifDecoder decoder = gifDrawable.getDecoder(); for (int i = 0; i < gifDrawable.getFrameCount(); i++) { duration += decoder.getDelay(i); } mGifAdTime = duration; } catch (Throwable e) { } } }).start(); return false; } }) .into(mAdImg);

【附】相關視訊資料
連結: ofollow,noindex">https://pan.baidu.com/s/1HEfrULycOX5BNnIbAlGhDA
提取碼:pqnk