Glide - 无法停止 gif onClick - 获取 TransitionDrawable 而不是 Animate/GifDrawable

Glide - Cannot stop gif onClick- Getting TransitionDrawable instead of Animate/GifDrawable

我正在使用容器 recyclerview 在 Imageview 中加载 gif 图像。 目前 recyclerview 只有 1 个 gif,其他是位图。 我正在加载 gif 作为

Glide.with(context).
load("https://media.giphy.com/media/TcKmUDTdICRwY/giphy.gif").
asGif().
override(params.width, params.height).
diskCacheStrategy(DiskCacheStrategy.RESULT).
placeholder(R.drawable.placeholder).
error(R.drawable.error).
listener(new RequestListener<Uri, GifDrawable>() {
        @Override
        public boolean onException(Exception e, Uri model, Target<GifDrawable> target, boolean isFirstResource) {
                 return false;
        }

        @Override
        public boolean onResourceReady(GifDrawable resource, Uri model, Target<GifDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
               resource.stop(); //Stoping gif animation on complete download
                return false;
               }
        }).
        into(feed.imgFeed);

我想要按需 gif 加载,即当 gif 图像完全下载时,我不想自己启动它,而是在用户单击它时启动它。 在单击事件中,我正在检查可绘制实例是否为 Animated/GifDrawable 以启动动画。 但是我收到了不允许动画的 TransitionDrawable。

好的

我不得不更改加载 gif 的步骤,因为即使加载第一帧也需要很多时间并且需要 1 mb 数据(任意值),所以用户将浪费 5 mb 来加载 5 个 gif 的帧。 因此改变了流程,从服务器获取 2 个图像版本

  1. Gif,实际图片
  2. Gif 第一帧,最大 100 kb

在点击图片时加载 Gif 有效并节省数据。

这是另一种方法:

  • 使用.diskCacheStrategy(SOURCE)可以快速显示GIF。
  • 一旦拥有 SOURCE 缓存,您就可以使用 .asBitmap() 强制显示第一帧来显示图像。
  • SOURCE 还将确保在加载第一帧和动画时文件不会被下载两次。
  • onClick 中加载具有不同参数的相同图像,即 .asGif() 到 "start the animation" 如果您有多个 GIFs,这可以节省大量内存和处理。

这里是我们的代码:

final Uri uri = Uri.parse("https://media.giphy.com/media/TcKmUDTdICRwY/giphy.gif");
final BitmapRequestBuilder<Uri, GlideDrawable> thumbRequest = Glide
        .with(context)
        .load(uri)
        .asBitmap() // force first frame for Gif
        .transcode(new BitmapToGlideDrawableTranscoder(context), GlideDrawable.class)
        .override(params.width, params.height)
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .placeholder(R.drawable.image_placeholder)
        .error(R.drawable.image_error)
        .fitCenter();

thumbRequest.into(feed.imgFeed);

feed.imgFeed.setOnClickListener(new OnClickListener() { 
    @Override public void onClick(View v) {
        Glide
                .with(context)
                .load(uri) // load as usual (Gif as animated, other formats as Bitmap)
                .override(params.width, params.height)
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .placeholder(R.drawable.image_placeholder)
                .error(R.drawable.image_error)
                .thumbnail(thumbRequest)
                .dontAnimate()
                .into(feed.imgFeed);
    }
});