Glide加载图片非常方便,使用也非常广泛,但是并不能直接支持webp动图。
可能很多人会使用Fresco来加载webp,但是对于已经使用Glide的项目,总感觉再使用Fresco有点冗余,如果能用Glide来加载webp那将非常方便。
而github上也确实存在webpdecoder这样一个库支持加载webp。
具体使用方式总结如下:
一、首先加入依赖
//Glide库
//implementation 'com.github.bumptech.glide:glide:4.7.1'//support
implementation 'com.github.bumptech.glide:glide:4.12.0'//androidx
annotationProcessor "com.github.bumptech.glide:compiler:4.12.0"//androidx
//Glide支持webp动图的库
implementation "com.github.zjupure:webpdecoder:2.0.4.12.0"
二、使用
使用方法跟Glide的使用非常相似
//webp动图
Transformation<Bitmap> transformation = new CenterInside();
Glide.with(mAnimView)
.load(R.drawable.webp_anim)//不是本地资源就改为url即可
.optionalTransform(transformation)
.optionalTransform(WebpDrawable.class, new WebpDrawableTransformation(transformation))
.into(mAnimView);
三、动画播放完成监听
关于动画播放完成的监听,网上也有做法是通过反射拿到webp每一帧动画的时间,再累加起来得到动画总时长,最后通过Handler的postDelay进行延迟作为动画播放结束的回调,这样想想就知道不是很精确,如果误差可以接受那就可以。
监听其实就是在资源加载成功的回调里面,对WebpDrawable进行监听,不过要注意webp的循环次数如果是无限循环,那将不会有结束回调,可以通过代码设置循环次数为有限的即可。
为什么我知道是通过WebpDrawable进行监听,因为我之前用过Fresco,它的监听大概这样:
animatedDrawable.setAnimationListener(...)
所以我猜到了。其实进去WebpDrawable类里面看看,就知道它其实也实现了这么个接口
而Animatable2Compat接口就有结束的接方法。
所以动画播放完成回调的做法如下,只不过在上面的做法加多一点代码而已:
//webp动图
Transformation<Bitmap> transformation = new CenterInside();
Glide.with(mAnimView)
.load(R.drawable.webp_anim)//不是本地资源就改为url即可
.optionalTransform(transformation)
.optionalTransform(WebpDrawable.class, new WebpDrawableTransformation(transformation))
.addListener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
WebpDrawable webpDrawable = (WebpDrawable) resource;
//需要设置为循环1次才会有onAnimationEnd回调
webpDrawable.setLoopCount(1);
webpDrawable.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
@Override
public void onAnimationStart(Drawable drawable) {
super.onAnimationStart(drawable);
}
@Override
public void onAnimationEnd(Drawable drawable) {
super.onAnimationEnd(drawable);
webpDrawable.unregisterAnimationCallback(this);
}
});
return false;
}
})
.into(mAnimView);