网站域名备案转接入手续,城阳网站建设电话,中国互联网巨头排名,北京互联网网站建设价格Glide本身支持gif格式的动画加载#xff0c;但是大多数情况下我们用Glide都是去加载一些静态图片#xff0c;加载gif动态图的需求不是很多#xff0c;因此这次使用Glide加载gif就遇到了一些令人匪夷所思的问题
问题一#xff1a;加载gif图片会有明显的卡顿
通常情况下我们…Glide本身支持gif格式的动画加载但是大多数情况下我们用Glide都是去加载一些静态图片加载gif动态图的需求不是很多因此这次使用Glide加载gif就遇到了一些令人匪夷所思的问题
问题一加载gif图片会有明显的卡顿
通常情况下我们使用Glide去加载gif或一张图片都是通过如下代码来实现的我们不需要考虑太多的参数
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其他的一些缓存参数及解释如下
DiskCacheStrategy 的几种常见策略
DiskCacheStrategy.ALL
行为缓存原始数据和转换后的数据。
适用场景适用于需要在不同尺寸和格式下都能快速加载图片的情况。
DiskCacheStrategy.NONE
行为不缓存任何数据。
适用场景适用于不需要缓存图片的情况例如临时图片或敏感信息。
DiskCacheStrategy.DATA
行为仅缓存原始数据。
适用场景适用于需要缓存原始图片数据但不需要缓存转换后的数据的情况。
DiskCacheStrategy.RESOURCE
行为仅缓存转换后的数据。
适用场景适用于需要缓存转换后的图片数据但不需要缓存原始数据的情况。
DiskCacheStrategy.AUTOMATIC
行为根据图片的来源自动选择缓存策略。
适用场景适用于大多数情况Glide 会根据图片的来源自动选择最合适的缓存策略。
所以加载gif的完整代码如下
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便解决了这个问题动画不会再重复播放了。
实现完整代码如下
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 RequestListenerGifDrawable() {Overridepublic boolean onLoadFailed(Nullable GlideException e, Nullable Object model, NonNull TargetGifDrawable target, boolean isFirstResource) {return false;}Overridepublic boolean onResourceReady(NonNull GifDrawable resource, NonNull Object model, TargetGifDrawable target, NonNull DataSource dataSource, boolean isFirstResource) {if (gifDrawable null) {gifDrawable resource;// 设置播放次数gifDrawable.setLoopCount(1);gifDrawable.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {Overridepublic void onAnimationStart(Drawable drawable) {super.onAnimationStart(drawable);}Overridepublic void onAnimationEnd(Drawable drawable) {super.onAnimationEnd(drawable);// GIF播放完毕后的处理逻辑luckyDrawDialog.show();}});gifDrawable.start();}return false;}}).into(ivAward);