说明
最近项目中有使用到gif动画,加上本身已经引入了Glide 3.7.0(支持gif)库,所以便用Glide来加载了;但在使用过程中还是遇到了不少困难, 在此记录下,希望可以给遇到类似问题的你一些思考和建议。
简单使用
如果你还不了解Glide库, 可移步https://github.com/bumptech/glide
同加载普通图片一样,使用如下代码即可加载gif动画
Glide.with(this).load(...).asGif().into(...)
需要注意的是如果加载的图片不是gif,则asGif()会报错, 当然,asGif()不写也是可以正常加载的。
Gif动画播放的一些控制
- 有的时候我们需要控制动画的播放次数,而默认的加载则是循环播放的,而Glide也没有开放单独的api接口用来控制gif,这时可以通过
GlideDrawableImageViewTarget(view, int)
来实现, 其中第二个参数表示播放的次数:
Glide.with(this).load(...).into(new GlideDrawableImageViewTarget(iv, 1));
- 如果需要监听动画播放完成呢?我的思路是添加一个
RequestListener
,获取加载的gif的播放时间time,延时time时长后发起播放结束消息,大致可以实现播放的监听。完整例子如下:
Glide.with(this).load(R.drawable.third_animation).listener(new RequestListener<Integer, GlideDrawable>() {
@Override
public boolean onException(Exception e, Integer model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, Integer model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
Observable.just(resource)
.flatMap(new Func1<GlideDrawable, Observable<?>>() {
@Override
public Observable<?> call(GlideDrawable glideDrawable) {
int duration = 0;
try {
GifDrawable gifDrawable = (GifDrawable) glideDrawable;
GifDecoder decoder = gifDrawable.getDecoder();
for (int i = 0; i < gifDrawable.getFrameCount(); i++) {
duration += decoder.getDelay(i); }
} catch (Throwable e) {
}
return Observable.just(null).delay(duration, TimeUnit.MILLISECONDS);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
// 加载完成后的处理...
}
});
return false;
}}).into(new GlideDrawableImageViewTarget(welcomeGif2, 1));
别再评论说代码报错了
好多个同学都留言说代码有问题,GlideDrawableImageViewTarget
报错...遇到错误先排查下自己代码有没有问题...附代码截图: