前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >{Android}一行代码起飞,Glide加载gif优化实践

{Android}一行代码起飞,Glide加载gif优化实践

作者头像
Android技术干货分享
发布2019-03-27 11:34:27
10K0
发布2019-03-27 11:34:27
举报
文章被收录于专栏:Android技术分享Android技术分享

前言

最近项目中有使用到gif动画,加上本身已经引入了Glide 3.7.0(支持gif)库,所以便用Glide来加载了;但在使用过程中还是遇到了不少困难, 在此记录下,希望可以给遇到类似问题的你一些思考和建议。

一、Glide加载gif

1.在项目中添加依赖

代码语言:javascript
复制
dependencies {
 compile 'com.github.bumptech.glide:glide:4.0.0'
 compile 'com.android.support:support-v4:25.3.1'
}

Glide需要依赖Support Library v4

2.加载图片

代码语言:javascript
复制
// 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);
}
代码语言:javascript
复制
// 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,其实跟加载普通图片一样

代码语言:javascript
复制
Glide.with(this).load(mGifUrl).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

如果希望加载gif时只加载gif的第一帧,把gif当作普通图片一样加载,那么只需要加上asBitmap方法即可

代码语言:javascript
复制
Glide.with(this).load(mGifUrl).asBitmap().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

如果你希望加载的只是gif,如果不是gif就显示错误图片,那么只用加上asGif方法即可

代码语言:javascript
复制
 Glide.with(this).load(mGifUrl).asGif().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

网络上很多文章上都是从一篇译文里面拷贝过来的,里面说Glide可以加载本地视频,但是那篇译文漏翻译一句了,Glide只会加载本地视频的第一帧,也就是缩略图,而且其实加载缩略图的时候也无需转化为Uri,直接把File丢进去就行了

代码语言:javascript
复制
 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是缓存原型,原图)

代码语言:javascript
复制
Glide.with(this).load(mGifUrl).diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder(R.mipmap.place)
.error(R.mipmap.icon_photo_error)
.into(mIv);

动态显示gif图的次数,比如我想显示一次gif就停止

代码语言:javascript
复制
Glide.with(this).load("url").diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(new GlideDrawableImageViewTarget(iv, 1)); 

这里的GlideDrawableImageViewTarget(ImageView view, int maxLoopCount)这个方法,maxloopCount可以控制显示次数。

二、Glide加载gif优化

1.解决Glide加载Gif非常慢问题

代码语言:javascript
复制
 Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView); 

为其添加缓存策略,其中缓存策略可以为:Source及None,None及为不缓存,Source缓存原型.如果为ALL和Result就不行

2.加载第一贞:

代码语言:javascript
复制
Glide.with(context).load(gifUrl).asBitmap().into(imageViewGifAsBitmap);

3.控制动画次数:

代码语言:javascript
复制
Glide.with(this).load(getResource()).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new GlideDrawableImageViewTarget(imageView, 1));

4.GIF 时间:

代码语言:javascript
复制
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);

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.01.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、Glide加载gif
  • 二、Glide加载gif优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档