Glide - 加载 GIF 作为占位符

Glide - Load a GIF as a placeholder

我在我的 Android 项目中使用 Glide,我有一个 RecyclerView,其中包含 CardView 的列表。我想做的是为每个 CardView 加载图像,同时显示 GIF 加载图像,直到加载真实图像。现在,如果它尝试加载 GIF 作为主图像,没问题:

Glide.with(context)
        .load(R.raw.gif_loading_bar)
        .into(imageView);

上面的代码工作正常并且 GIF 被加载。但是当我尝试加载另一个图像并将 GIF 设为占位符时 Android Studio 显示错误 "Expected resource of type drawable":

Glide.with(mContext)
        .setDefaultRequestOptions(new RequestOptions()
                .placeholder(R.raw.gif_loading_bar))
        .load(imageUrl)
        .into(imageView);

我应该怎么做才能解决这个问题?

这应该可以完成工作:

ImageView imageView = (ImageView) findViewById(R.id.imageView);
GlideDrawableImageViewTarget imageViewTarget = new 
GlideDrawableImageViewTarget(imageView);

Glide.with(context)
    .asGif()
    .setDefaultRequestOptions(new RequestOptions()
            .placeholder(R.raw.gif_loading_bar))
    .load(imageUrl)
    .into(imageView);

更多信息here and here

很遗憾,Glide 不支持 GIF 占位符,如 this Github issue, and this one 中所述。

Glide 支持 GIF 作为占位符。我最近遇到了这种情况并像下面这样解决了。希望对遇到这种情况的我有帮助。

    var builder = Glide.with(mContext).load(path).apply(options).thumbnail(Glide.with(mContext).load(R.raw.loader2))
if (listener == null) {
    builder = builder.addListener(object : RequestListener<Drawable> {
        override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {

            //TODO; your code here
            return false
        }

        override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
            //TODO; your code here
            return false
        }
    })
} else {
    builder = builder.addListener(listener)
}
builder.into(myImageView)

What it does

它加载您的 gif 作为缩略图,直到从源下载图像。 在 onResourceReady 方法中,它将在资源准备就绪时为您提供回调。确保将 gif 文件放在 R.raw 包下并且 不在 drawable 包下。如果您遇到任何问题,请告诉我。

只需确保根据您的代码更改 getContext()。例如,在我的例子中,我将它传递为 holder.img.getContext()

Glide.with(getContext()).load(item[position])
                .thumbnail(Glide.with(getContext()).load(R.drawable.gif_image))
                .fitCenter()
                .crossFade()
                .into(imageView);