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 个图像版本
- Gif,实际图片
- 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);
}
});
我正在使用容器 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 个图像版本
- Gif,实际图片
- 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);
}
});