使用 Glide 显示 GIF 文件(图像加载和缓存库)

Posted

技术标签:

【中文标题】使用 Glide 显示 GIF 文件(图像加载和缓存库)【英文标题】:Show GIF file with Glide (image loading and caching library) 【发布时间】:2015-09-13 22:44:51 【问题描述】:

我尝试在图像视图中显示 GIF 图像作为加载占位符 - 使用 Glide Library:

Glide.with(context)
    .load(ImageUrl())
    .placeholder(R.drawable.loading2)
    .asGif()
    .crossFade()
    .into(image);

我尝试显示这个文件

loading2.gif

但得到这个错误:

错误:(54, 86) 错误: 找不到符号方法 asGif()

如何在 imageView 中使用 Glide 显示 GIF 文件?

【问题讨论】:

看起来您可能缺少正确版本的 Glide?真是奇怪,没找到符号也试试o个干净。 【参考方案1】:

上面的答案对我不起作用。下面的代码有效。

ImageView imageView = (ImageView) findViewById(R.id.imageView);
GlideDrawableImageViewTarget imageViewTarget = new GlideDrawableImageViewTarget(imageView);
Glide.with(this).load(R.raw.sample_gif).into(imageViewTarget);

【讨论】:

我不知道为什么,但这确实 对我有用,而 asGif() 只是让整个事情消失了。 你能解释一下 GlideDrawableImageViewTarget 的用途吗? 这个答案只显示了 gif 文件。它不像占位符那样工作。当图像像占位符一样加载时,我如何使用这个答案来显示 gif 文件? @Jaydev 我关注了 Nick Butcher 的“Plaid”应用程序源代码。我尝试了 Glide doc 中的所有内容,但都没有成功。 @Jaydev 你可以在这里找到 Plaid 应用的源代码:github.com/nickbutcher/plaid【参考方案2】:

对于 Glide 4.+

ImageView imageView = (ImageView) findViewById(R.id.imageView);
Glide.with(this).asGif().load(R.raw.image_gif).into(imageView);

【讨论】:

非常感谢,Glide 比 Ion 好太多了,因为 Ion 一直落后于我的声音,可能是因为 Ion 占用更多内存或其他什么但它使我的声音出现故障,而且我更喜欢 Glide 语法,感觉更合理对我来说很高兴我找到 Glide 来解决我的问题。 :) 我看不到 gif ImageView imageView = (ImageView) v.findViewById(R.id.gif); Glide.with(this).asGif().load(R.raw.steam4).into(imageView);代码:【参考方案3】:

对于 Glide 3.0,您需要提前设置 asGif():

Glide.with(context)
    .load(imageUrl)
    .asGif()
    .placeholder(R.drawable.loading2)
    .crossFade()
    .into(imageView);

请记住,仅使用 load() 将根据数据类型加载 GIF 或位图。如果给定的 url 不是 gif,除非您希望加载失败,否则您不需要指定 asGif()

【讨论】:

【参考方案4】:

我遇到了同样的问题。您可以通过移动 asGif() 所在的位置来解决它。它必须直接出现在 .load() 之前。

所以改变:

Glide.with(context)
    .load(ImageUrl())
    .placeholder(R.drawable.loading2)
    .asGif()  
    ....

Glide.with(context)
     .asGif()         
     .load(ImageUrl())
     .placeholder(R.drawable.loading2)
    ....

【讨论】:

请说明您的解决方案可以与 Glide 4+ 一起使用 @marc:感谢它工作,但错误和占位符不起作用【参考方案5】:

这是另一个例子。我观察到 Glide 有时不会自动播放 Gif。这个解决方案对我有用:

在示例中,imageView 是 RecyclerView 的 ViewHolder 类中的成员之一。

Glide.with(itemView.getContext())
    .asGif()
    .load(thumbPath)                             
    .placeholder(ResourcesCompat.getDrawable(context.getResources(), 
                     R.drawable.image_loading_placeholder, null))
    .centerCrop()
    .into(new ImageViewTarget<GifDrawable>(imageView) 
         @Override
         protected void setResource(@Nullable GifDrawable resource) 
             imageView.setImageDrawable(resource);
         
     );

.asGif()方法需要提前使用,否则无法识别

【讨论】:

哇。谢谢@Ram lyer。【参考方案6】:

使用 GlideDrawableImageViewTarget。这段代码对我有用。

GlideDrawableImageViewTarget imageViewTarget = new GlideDrawableImageViewTarget(imageView);

Glide.with(this).load(R.drawable.logo_gif).into(imageViewTarget);

【讨论】:

【参考方案7】:

Glide自动播放动画gif文件,无需额外方法

使用下面的代码

Glide.with(this)
   .load(R.drawable.logo)
   .into(imageView);

【讨论】:

你真的应该添加一些解释为什么这应该工作 - 你也可以添加代码以及代码本身中的 cmets - 在当前的形式中,它没有提供任何可以帮助的解释社区的其他人了解您为解决/回答问题所做的工作。这对于较早的问题和已经有答案的问题尤其重要。 新的滑翔版本只是播放动画 gif【参考方案8】:

从 Glide v4 版本开始:

依赖:

implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

访问this link创建GlideApp类:

你可以直接在GlideApp上给drawable参考

GlideApp.with(this).load(R.drawable.ic_loader).into(mBinding.progressBar);

如果您有任何错误,请告诉我。

【讨论】:

【参考方案9】:

我使用的是 Glide 4.11 版,对我来说,它确实在 Glide.with(context) 之后设置了 .asGif()

但是我还有一个问题,我在加载 gif 到 ImageView 时也设置了.dontAnimate()。显然这不起作用,所以我不得不从我的设置中删除.dontAnimate(),并且在更改之后一切正常。

这里是更多信息的问题https://github.com/bumptech/glide/issues/3395

【讨论】:

【参考方案10】:

把你的 gif 文件放在 raw 文件夹中,使用下面的代码还可以添加下面的代码 gradle 中的依赖项

        //for glide
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
   ImageView layoutAnim;

 //load gif file to imageView where layoutanim is my imageView

    Glide.with(this).asGif().load(R.raw.backloader).into(layoutAnim);

  

【讨论】:

【参考方案11】:

这是最好的方法

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

【讨论】:

为什么对答案投了反对票?它对我有用,是由于双重Glide.with(...【参考方案12】:

试试这个。它对我有用,也适用于您的代码。它也适用于图像和 gif。

ImageView imageView = (ImageView) findViewById(R.id.test_image); 
    GlideDrawableImageViewTarget imagePreview = new GlideDrawableImageViewTarget(imageView);
    Glide
            .with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() 
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource)                        
                    return false;
                

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) 
                    return false;
                
            )
            .into(imagePreview);

【讨论】:

【参考方案13】:

这个解决方案是一种解决方法

<RelativeLayout
    android:layout_
    android:id="@+id/ImageContainer"
    android:background="#fff"
    android:layout_>
    <ImageView
        android:layout_
        android:id="@+id/loadingImageView"
        android:layout_centerInParent="true"
        android:layout_/>
    <ImageView
        android:id="@+id/mainImageView"
        android:layout_
        android:layout_
        android:scaleType="centerCrop"
        android:layout_centerInParent="true"
     />
</RelativeLayout>

    不要使用一个,而是使用 2 个 ImageView

    使用@Preetam给出的解决方案将加载gif放入第一个ImageView

    ImageView loadingImageView = (ImageView) findViewById(R.id.loadingImageView);
    GlideDrawableImageViewTarget loadingImageViewTarget = new GlideDrawableImageViewTarget(loadingImageView);
    Glide.with(this).load(R.raw.spinner).into(loadingImageViewTarget);  
    

    在第二个 ImageView 中从网络加载图像 (如果您不想隐藏加载 gif 一次,顺序很重要 网络图片已加载)

    ImageView mainImageView = (ImageView) findViewById(R.id.mainImageView);
    GlideDrawableImageViewTarget mainImageViewTarget = new GlideDrawableImageViewTarget(mainImageView);
    Glide.with(this).load(imageUrl).into(mainImageViewTarget);
    

【讨论】:

【参考方案14】:
Instead of GlideDrawableImageViewTarget use DrawableImageViewTarget     
ImageView imageView =findViewById(R.id.imageView);
     DrawableImageViewTarget imageViewTarget = new DrawableImageViewTarget (imageView);
     Glide.with(this).load(R.raw.image_loader).into(imageViewTarget);

    library: implementation 'com.github.bumptech.glide:glide:4.8.0'
        annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

【讨论】:

以上是关于使用 Glide 显示 GIF 文件(图像加载和缓存库)的主要内容,如果未能解决你的问题,请参考以下文章

Android开发笔记(一百八十)使用Glide加载特殊图像

Android开发笔记(一百八十)使用Glide加载特殊图像

Android 平滑图片加载和缓存库 Glide 使用详解

为啥 Glide 只第二次加载图像? (安卓)

Android开发——优化Glide加载超大gif图

JAVA UIHarmonyOS Glide简单使用