Glide加载webp动画及监听动画播放结束

该博客介绍了如何在已使用Glide的项目中集成WebPDecoder库,实现Glide加载WebP动图的功能。文章详细阐述了依赖引入、加载方式以及如何监听动画播放完成。通过设置WebpDrawable的监听,可以在动画结束后进行回调,无需依赖Fresco。
摘要由CSDN通过智能技术生成

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);

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值