【问题标题】:Display multiple image with Glide使用 Glide 显示多个图像
【发布时间】:2019-06-28 12:15:24
【问题描述】:

我想使用 glide 将一张图像显示到两个不同的图像视图中。我知道我可以简单地使用下面的代码来做到这一点。

ImageView imageView = findViewById(R.id.header_image);
Glide.with(this).load(R.drawable.header_image).into(imageView);
ImageView imageView2 = findViewById(R.id.header_image);
Glide.with(this).load(R.drawable.header_image).into(imageView2);

但它需要将相同的图像两次加载到内存中,由于内存问题,我不希望这样做。我想加载一次图像并将其显示到两个图像视图中。我该怎么做才能实现它?

【问题讨论】:

标签: android android-glide


【解决方案1】:

使用 glide 时无需担心内存问题,因为 glide 有自己的缓存系统来优化内存请阅读doc

Glide 提供了许多选项,允许您根据每个请求选择负载将如何与 Glide 的缓存交互。

磁盘缓存策略 DiskCacheStrategy 可以与 diskCacheStrategy 方法一起应用于单个请求。可用的策略允许您阻止您的负载使用或写入磁盘缓存,或者选择仅缓存支持您的负载的未修改的原始数据,仅缓存您的负载生成的转换缩略图,或两者兼而有之。

默认策略 AUTOMATIC 尝试对本地和远程图像使用最佳策略。当您加载远程数据(如从 URL)时,AUTOMATIC 将仅存储支持您加载的未修改数据,因为与调整磁盘上已有数据的大小相比,下载远程数据的成本很高。对于本地数据,AUTOMATIC 将存储转换后的缩略图,因为如果您需要生成第二个缩略图大小或类型,检索原始数据的成本很低。

申请DiskCacheStrategy

GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);

仅从缓存加载 在某些情况下,如果图像尚未在缓存中,您可能希望加载失败。为此,您可以针对每个请求使用 onlyRetrieveFromCache 方法:

GlideApp.with(fragment)
  .load(url)
  .onlyRetrieveFromCache(true)
  .into(imageView);

如果在内存缓存或磁盘缓存中找到图像,则会加载它。否则,如果将此选项设置为 true,则加载将失败。

【讨论】:

  • 很好的解释!尤其是英语。
【解决方案2】:

您可以使用以下代码加载一次图像并在多个图像视图中显示。

Glide.with(this)
    .asBitmap()
    .load(R.drawable.header_image)
    .into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
            imageview.setImageBitmap(resource);
            imageview2.setImageBitmap(resource);
        }
    });

【讨论】:

    【解决方案3】:

    如果您使用的是最新版本的Glide,请创建RequestOptions like

    private RequestOptions simpleOptions = new RequestOptions()
                .centerCrop()
                .placeholder(R.color.color_gray)
                .error(R.color.color_gray)
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE);
    

    使用 RequestOptions 加载设置属性的图片

    Glide.with(context)
                    .load(url)
                    .apply(simpleOptions)
                    .into(imageView);
    

    【讨论】:

      【解决方案4】:

      或者这样……

      RequestBuilder<Drawable> builder = Glide.with(this).load(drawableResId);
      builder.into(imageView0)
      builder.into(imageView1)
      

      【讨论】:

        【解决方案5】:

        试试这个方法……

        setImage(R.drawable.header_image,imageView ,imageView2 );
        
        
        void setImage(int image, ImageView... imageView) {
            for (ImageView imageView : imageView) {
        
                if (imageView != null) {
        
                    Glide.with(this).load(image).into(imageView);
        
                }
        
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2019-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-20
          • 2018-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多