Glide加载gif遇到的几个坑

Glide本身支持gif格式的动画加载,但是大多数情况下我们用Glide都是去加载一些静态图片,加载gif动态图的需求不是很多,因此这次使用Glide加载gif就遇到了一些令人匪夷所思的问题

问题一:加载gif图片会有明显的卡顿

通常情况下我们使用Glide去加载gif或一张图片都是通过如下代码来实现的,我们不需要考虑太多的参数

java 复制代码
Glide.with(this)
                .asGif()
                .load(R.drawable.lucky_draw_anim)
                .into(ivAward);

因此,如果你直接这样做了,结果发现显示出来的gif图片会格外卡顿,但是却找不到任何原因,而且原gif图在浏览器上面也是足够流畅的,几乎看不到卡顿的现象

其实Glide还有一些额外的参数可以增加加载的流畅性,例如可以通过

复制代码
diskCacheStrategy(DiskCacheStrategy.ALL)

方法开启硬盘的缓存,并且Glide中通过

复制代码
override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)

方法用于指定加载的图片尺寸,这样可以使得gif的加载效率和显示效果更流畅。

具体来说,Target.SIZE_ORIGINAL 表示使用图片的原始尺寸进行加载。这在某些情况下非常有用,例如当你希望图片以原始分辨率显示时,或者当你需要确保图片的清晰度和细节时。

ps:其他的一些缓存参数及解释如下

java 复制代码
DiskCacheStrategy 的几种常见策略
DiskCacheStrategy.ALL
行为:缓存原始数据和转换后的数据。
适用场景:适用于需要在不同尺寸和格式下都能快速加载图片的情况。
DiskCacheStrategy.NONE
行为:不缓存任何数据。
适用场景:适用于不需要缓存图片的情况,例如临时图片或敏感信息。
DiskCacheStrategy.DATA
行为:仅缓存原始数据。
适用场景:适用于需要缓存原始图片数据但不需要缓存转换后的数据的情况。
DiskCacheStrategy.RESOURCE
行为:仅缓存转换后的数据。
适用场景:适用于需要缓存转换后的图片数据但不需要缓存原始数据的情况。
DiskCacheStrategy.AUTOMATIC
行为:根据图片的来源自动选择缓存策略。
适用场景:适用于大多数情况,Glide 会根据图片的来源自动选择最合适的缓存策略。

所以加载gif的完整代码如下

java 复制代码
Glide.with(APP.getContext())
                .asGif()
                .load(R.drawable.lucky_draw_anim)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                .placeholder(R.drawable.center_bg_default).into(ivAward)

如果大家仔细看会发现with中传递的context使用的是Application的context,这便是下面我要说遇到的问题2

问题二:gif图片会自动重复播放

我通过setLoopCount(1)方法将gif的播放次数设置为1,即播放一次停止播放(不设置的话默认则会连续循环播放动画),但是会发现如果仅是这样设置,当with方法传递的context是当前Activity则会导致如果已经播放过一次动画,然后跳转到其他页面再回来,动画会自动再次播放...

后来联想到Glide本身会跟随生命周期于是想到是context导致的问题,于是with使用Application的Context便解决了这个问题,动画不会再重复播放了。

实现完整代码如下:

java 复制代码
Glide.with(APP.getContext())
                .asGif()
                .load(R.drawable.lucky_draw_anim)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                .placeholder(R.drawable.center_bg_default)
                .listener(new RequestListener<GifDrawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<GifDrawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(@NonNull GifDrawable resource, @NonNull Object model, Target<GifDrawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
                        if (gifDrawable == null) {
                            gifDrawable = resource;
                            // 设置播放次数
                            gifDrawable.setLoopCount(1);
                            gifDrawable.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
                                @Override
                                public void onAnimationStart(Drawable drawable) {
                                    super.onAnimationStart(drawable);

                                }

                                @Override
                                public void onAnimationEnd(Drawable drawable) {
                                    super.onAnimationEnd(drawable);
                                    // GIF播放完毕后的处理逻辑
                                    luckyDrawDialog.show();
                                }
                            });
                            gifDrawable.start();
                        }
                        return false;
                    }
                })
                .into(ivAward);
相关推荐
RainbowSea13 分钟前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·spring
RainbowSea15 分钟前
15. MySQL 多版本并发控制
java·sql·mysql
倔强的石头10623 分钟前
飞算JavaAI:重构软件开发范式的智能引擎
java·数据库·重构
Q_9709563939 分钟前
java+vue+SpringBoo足球社区管理系统(程序+数据库+报告+部署教程+答辩指导)
java·开发语言·数据库
要开心吖ZSH44 分钟前
微服务架构的演进:迈向云原生
java·微服务·云原生
为了更好的明天而战1 小时前
Java 中的 ArrayList 和 LinkedList 区别详解(源码级理解)
java·开发语言
JosieBook1 小时前
【Java编程动手学】Java中的数组与集合
java·开发语言·python
N_NAN_N2 小时前
类图+案例+代码详解:软件设计模式----单例模式
java·单例模式·设计模式
weixin_399380692 小时前
k8s一键部署tongweb企业版7049m6(by why+lqw)
java·linux·运维·服务器·云原生·容器·kubernetes
lang201509282 小时前
Reactor ConnectableFlux支持多订阅者
java·网络