You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()方法,或保留但不在点击事件中直接调用

关键说明

  1. 动画结束监听:通过GifDrawable.registerAnimationCallback注册回调,只有当GIF完成一次循环播放后,才会触发onAnimationEnd方法,此时再加载静态图,保证播放流程完整。
  2. 避免提前覆盖:去掉点击事件中直接调用afterListeners()的代码,防止静态图直接替换未播放完成的GIF。
  3. 内存泄漏防护:动画结束后调用unregisterAnimationCallback移除回调,避免持有Activity引用导致内存泄漏。

额外注意事项

  • 若GIF资源较大,可保留diskCacheStrategyOf(DiskCacheStrategy.NONE)避免缓存干扰,也可根据需求调整缓存策略。
  • 请将代码中的YourActivity.this替换为你实际的Activity类名,或使用getApplicationContext()(前者更贴合Glide生命周期管理)。

内容的提问来源于stack exchange,提问作者ElTakTiko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:01:16