Glide在首次加载时缩小图像

9
当我使用Glide将图像加载到ImageView中时,它会缩小图像。当我旋转或重新打开相同的活动时,图像大小就正确了。我已经尝试过可能重复的解决方法。我已经在xml中给ImageView传递了固定的大小,并且也尝试过覆盖大小。centerCrop()和fitCenter()对缩小没有影响。 我还尝试调试图像大小。无论是缩小还是不缩小,它返回相同的宽度和高度。
视图:
<ImageView
      android:id="@+id/thumbnail"
      android:layout_width="@dimen/episode_detail_img_width"
      android:layout_height="@dimen/episode_detail_img_height"
      android:layout_marginTop="@dimen/episode_detail_img_margin_top" />

Glide

Glide.with(getActivity())
            .load(url)
            .placeholder(R.drawable.thumb_placeholder)
            .centerCrop()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(thumbnail);

1
尝试暂时删除此代码:.placeholder(R.drawable.thumb_placeholder) .centerCrop() .diskCacheStrategy(DiskCacheStrategy.ALL),并在运行之前请清除缓存内存。 - Dharvik shah
当我使用占位符时,它会缩小图片。所有其他选项都很好。有任何想法为什么会发生这种情况吗?我确信每个可绘制资源都是正确的。 - parohy
1
好的,明白了。将占位图设置为比您的ImageView高度和宽度更大的尺寸或任何颜色。 - Dharvik shah
1
我使用了一个大小为400x200像素的占位符资源。我将其替换为400x400的占位符,它解决了问题。谢谢你的帮助! - parohy
4个回答

14

我很高兴你得到了答案。更详细地描述你的问题是:

Glide在开始加载图片之前计算了ImageView的高度和宽度,但当图片加载完成时,它会替换你的占位符drawable。因此,如果你的占位符drawable的高度或宽度很小,Glide将使用占位符的尺寸渲染已下载的位图。

因此,为了在不同的屏幕大小和布局中没有延迟,我建议在占位符中使用高尺寸的drawable。

还有一个技巧是在占位符中使用颜色,因为颜色没有高度或宽度,所以可以在整个视图区域内呈现。


1

可以通过以下方式解决:

1)添加 .dontAnimate()

2)找到与图像比例匹配的占位符

Explanation: https://github.com/bumptech/glide/issues/1295

第一次加载图像时,将使用默认的.crossFade()效果,此时占位符的宽高比与加载的图像的宽高比不匹配。第二次从内存缓存中加载图像时,会跳过动画,直接正确地加载图像。您可以通过.dontAnimate()禁用动画,或强制使用淡入动画.animate(R.anim.fade_in),或找到一个与图像宽高比匹配的占位符(在您的情况下为正方形,因为是512x512)。

感谢您提供的文档片段,非常有用 :) 但是我们希望能够实现动画效果,因此在这种情况下不使用dontAnimate标志无法帮助我们。这是我们较早的项目之一,所以记不清了...但在这种情况下,相同的纵横比占位符是解决问题的方法 :) - parohy

1
您定义了一个placeHolder()方法,它将在初始时间加载,并且当Glide根据给定的URL加载图像时,Glide将使用placeHolder图像替换已加载的图像。该图像将显示在imageView中。这个加载的图像是根据指定的方法设置到imageView中的。
例如:cropCenter()、fitCenter()等 请勿使用cropCenter()方法,它会从中心裁剪图像并将其适应于您的imageView,因此图像质量会降低。
请使用fitCenter()方法。
<ImageView
            android:id="@+id/conversation_team_photo"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:scaleType="fitCenter"
             />

我已经定义了最佳使用Glide的方法,可以在这里找到最佳使用Glide的方法。


0
与Picasso相比,Glide在内存方面更加高效。Glide自动限制图像在缓存和内存中的大小为ImageView的尺寸。
清理您的项目并尝试此代码:
Glide
  .with(context)
  .load(url)
  .override(400, 200) // resizes the image to these dimensions (in pixel).does not respect aspect ratio
  .into(thumbnail);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接