Android中实现GIF播放一次后显示静态图片的问题
解决方案:GIF播放一次后切换为静态图
你的问题核心在于点击按钮后立即调用了afterListeners()加载静态图,这会直接覆盖还在加载/播放的GIF,而且没有监听GIF动画结束的时机。要实现播放完一次后切换静态图,需要监听GifDrawable的动画结束事件,在动画真正完成后再替换为静态图。
修改后的核心代码
public void setListeners() throws InterruptedException { binding.LayoutSend.setOnClickListener(view -> { try { Glide.with(this) .asGif() .load(R.drawable.fuseev4) .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE)) .listener(new RequestListener<GifDrawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) { // 设置GIF仅循环一次 resource.setLoopCount(1); // 注册动画结束回调 resource.registerAnimationCallback(new Animatable2.AnimationCallback() { @Override public void onAnimationEnd(Drawable drawable) { super.onAnimationEnd(drawable); // 动画结束后加载静态图 Glide.with(YourActivity.this) .asBitmap() .load(R.drawable.fuseev4) .into(imageView); // 移除回调避免内存泄漏 resource.unregisterAnimationCallback(this); } }); return false; } }) .into(imageView); } catch (Exception e){ e.printStackTrace(); } // 移除原有的afterListeners()立即调用,确保GIF能完整播放 }); } // 可删除原afterListeners()方法,或保留但不在点击事件中直接调用
关键说明
- 动画结束监听:通过
GifDrawable.registerAnimationCallback注册回调,只有当GIF完成一次循环播放后,才会触发onAnimationEnd方法,此时再加载静态图,保证播放流程完整。 - 避免提前覆盖:去掉点击事件中直接调用
afterListeners()的代码,防止静态图直接替换未播放完成的GIF。 - 内存泄漏防护:动画结束后调用
unregisterAnimationCallback移除回调,避免持有Activity引用导致内存泄漏。
额外注意事项
- 若GIF资源较大,可保留
diskCacheStrategyOf(DiskCacheStrategy.NONE)避免缓存干扰,也可根据需求调整缓存策略。 - 请将代码中的
YourActivity.this替换为你实际的Activity类名,或使用getApplicationContext()(前者更贴合Glide生命周期管理)。
内容的提问来源于stack exchange,提问作者ElTakTiko
相关产品推荐
相关产品推荐

