为什么我的图像在使用 glide 库加载后会缩小
Why do my images shrink after loading with glide library
您好,当它们第一次被调用到我的片段中时,我正在使用 glide 图像加载器库填充 gridview,它们看起来像这样
但在上下滚动后,它们会调整大小,看起来像这样
这是我正在用我的 gridview、glide 库做的事情,还是像我的占位符图像一样的东西?在第二张截图上,如果我按下一张图片,它会亮起,表明它实际上填满了整个 space,有人知道我在这里做错了什么吗?我试过在 glide playing with centercrop 等中更改调用,但它似乎没有什么区别,我不确定我将如何计算出每个单元格的宽度和高度,欢迎任何建议
编辑
这是我调用 glide
的方式
Glide.with(getActivity())
.load(mThumbIds[position])
.placeholder(R.drawable.placeholder)
.error(R.drawable.ic_drawer)
.centerCrop()
.override(500,300)
.into(imageView);
总之有 .fitCenter() 或 .centerCrop() 之类的方法。尝试在
中使用这些方法
Glide.with(getApplicationContext())
.load("")
.centerCrop()
.placeholder(R.drawable.ic_launcher)
.crossFade()
.override(1000,1000)
.into(myImageView);
.
实际上,您必须为图像容器 (ImageView) 指定固定的宽度和高度。
<ImageView
android:id="@+id/channelImage"
android:layout_width="65dp"
android:layout_height="65dp"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:src="@drawable/sama" />
然后当你调用 glide 时,你必须使用 override 方法动态地覆盖你的宽度和高度。这是您容器的最大宽度和高度。
Glide.with(getActivity())
.load("your url")
.placeholder(R.drawable.tv2v_icon)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.fitCenter()
.override(500,500)
.into(channelImage);
希望对您有所帮助。
使用.dontAnimate() 方法解决问题。
Glide.with(context)
.using(new FirebaseImageLoader())
.load(pathReference)
.dontAnimate()
.placeholder(R.drawable.place_holder)
.into(holder.logo);
对于几乎相同的问题我所要做的就是添加 .override(maxItemWidth, maxItemHeight)。这似乎可以防止 Glide 所做的任何导致图像缩小的事情。
注意:maxItemWidth / maxItemHeight 是我用于回收器视图项目容器的值,但保存图像的 ImageView 实际上更小(因为有边框和标签) .
Glide
.with(context)
.load(categoryItem.getThumbnail())
.asBitmap()
.fitCenter()
.override(itemWidth, itemHeight)
.into(holder.imgIcon);
如果好奇,这是我的 xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/item_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:orientation="vertical"
android:padding="4dp">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/rounded_white_rectangle"
android:padding="2dp"
>
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
/>
</FrameLayout>
</FrameLayout>
我找到了适用于版本 Glide V4 (4.8.0) 的解决方案
import 'Glide' in gradle(目前最新版本是4.8.0):
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
您的 RecycleView 项目中的 ImageView 应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher_background" />
</RelativeLayout>
并在您的适配器中:
final Content content = getItem(position);
ImageViewHolder viewHolder = (ImageViewHolder) holder;
RequestOptions options = new RequestOptions();
options.optionalFitCenter();
Glide.with(Application_News16.getAppContext())
.load(content.getValue())
.apply(options)
.apply(new RequestOptions()
.placeholder(R.drawable.img_loading_s)
.error(R.drawable.img_error_s))
.into(viewHolder.image);
当高度有时较大而宽度有时较大时,覆盖矩形图像可能会导致图像无法正确显示。
这是我所做的,以防万一有人想探索。这修复了 RecyclerView 上下滚动时缩小图像的 Glide 错误。
仅供参考:我使用的是 androidx 而不是支持库,但它也应该与 ImageView 和 AppCompatImageView 小部件一起使用。
这是 RecyclerView 的项目布局的片段:
<RelativeLayout...
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/attachment_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:adjustViewBounds="true"
android:background="@drawable/camera_image_preview_default"
android:minWidth="400dp"
android:scaleType="centerCrop" />
</RelativeLayout>
这是我的适配器 onBindViewHolder 覆盖中的代码:
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
....
....
attachmentImage.layout(0, 0, 0, 0);
Glide.with(context)
.load(Uri.fromFile(new File(AppGlobals.IMAGES_THUMBNAIL_STORE_PATH + packet.getImageFileName())))
.placeholder(ResourcesCompat.getDrawable(context.getResources(), R.drawable.image_loading_placeholder, null))
.centerCrop()
.error(ResourcesCompat.getDrawable(context.getResources(), R.drawable.missing_thumbnail, null))
.into(attachmentImage);
....
....
}
如果你注意到,
在 Glide 绑定之前,ImageView 已经设置为布局 0, 0, 0, 0。这将确保 Glide 将其解释为新布局 inflation 并且不使用缓存策略.
minWidth
已设置为400dp
,而layout_width
已设置为match_parent
,layout_height
已设置设置为 wrap_content
。您可以将 minWidth
操纵到您选择的极限。
绑定将在运行时使用 centerCrop()
,因此您在设计时在 xml 布局中设置的 scaleType
并不重要。
仅供参考:此示例使用从本地设备的 public 外部存储目录加载图像。使用其他实现从网络加载或 URL
致谢:TWiStErRob 在 Glide Github 社区论坛中提到并推荐了将布局设置为全零。
@https://github.com/TWiStErRob
对于问题#1591
https://github.com/bumptech/glide/issues/1591
附带说明一下,如果您在 xml 布局中使用绝对 layout_height
和 layout_width
设置 ImageView - 分别说 400dp 和 300dp,Glide 可以完美运行。只有当每张图片的尺寸都不同时,才能看出问题。
以下帮助了我:
1) 在图像视图中使用 adjustViewBounds = "true" -> 这将使图像视图在 draws/redraws/resizes
时根据其图像保持其宽高比
2) 设置layout_width = match_parent 和layout_height = wrap_content 用于recycler view 的item view xml,还有Image View。
原因:
假设 Recycler 视图设置有 2 列垂直方向的网格布局管理器
它将强制回收器视图的项目行的 xml 为屏幕宽度的一半。
由于项目行的 match_parent 及其 chid 的 (imageview) layout_height 属性的值,这将导致图像变为屏幕宽度的一半。
现在,由于 adjustViewBounds = true,图像视图将自行调整其高度以保持纵横比。
您好,当它们第一次被调用到我的片段中时,我正在使用 glide 图像加载器库填充 gridview,它们看起来像这样
编辑 这是我调用 glide
的方式 Glide.with(getActivity())
.load(mThumbIds[position])
.placeholder(R.drawable.placeholder)
.error(R.drawable.ic_drawer)
.centerCrop()
.override(500,300)
.into(imageView);
总之有 .fitCenter() 或 .centerCrop() 之类的方法。尝试在
中使用这些方法 Glide.with(getApplicationContext())
.load("")
.centerCrop()
.placeholder(R.drawable.ic_launcher)
.crossFade()
.override(1000,1000)
.into(myImageView);
.
实际上,您必须为图像容器 (ImageView) 指定固定的宽度和高度。
<ImageView
android:id="@+id/channelImage"
android:layout_width="65dp"
android:layout_height="65dp"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:src="@drawable/sama" />
然后当你调用 glide 时,你必须使用 override 方法动态地覆盖你的宽度和高度。这是您容器的最大宽度和高度。
Glide.with(getActivity())
.load("your url")
.placeholder(R.drawable.tv2v_icon)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.fitCenter()
.override(500,500)
.into(channelImage);
希望对您有所帮助。
使用.dontAnimate() 方法解决问题。
Glide.with(context) .using(new FirebaseImageLoader()) .load(pathReference) .dontAnimate() .placeholder(R.drawable.place_holder) .into(holder.logo);
对于几乎相同的问题我所要做的就是添加 .override(maxItemWidth, maxItemHeight)。这似乎可以防止 Glide 所做的任何导致图像缩小的事情。
注意:maxItemWidth / maxItemHeight 是我用于回收器视图项目容器的值,但保存图像的 ImageView 实际上更小(因为有边框和标签) .
Glide
.with(context)
.load(categoryItem.getThumbnail())
.asBitmap()
.fitCenter()
.override(itemWidth, itemHeight)
.into(holder.imgIcon);
如果好奇,这是我的 xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/item_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:orientation="vertical"
android:padding="4dp">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/rounded_white_rectangle"
android:padding="2dp"
>
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
/>
</FrameLayout>
</FrameLayout>
我找到了适用于版本 Glide V4 (4.8.0) 的解决方案
import 'Glide' in gradle(目前最新版本是4.8.0):
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
您的 RecycleView 项目中的 ImageView 应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher_background" />
</RelativeLayout>
并在您的适配器中:
final Content content = getItem(position);
ImageViewHolder viewHolder = (ImageViewHolder) holder;
RequestOptions options = new RequestOptions();
options.optionalFitCenter();
Glide.with(Application_News16.getAppContext())
.load(content.getValue())
.apply(options)
.apply(new RequestOptions()
.placeholder(R.drawable.img_loading_s)
.error(R.drawable.img_error_s))
.into(viewHolder.image);
当高度有时较大而宽度有时较大时,覆盖矩形图像可能会导致图像无法正确显示。
这是我所做的,以防万一有人想探索。这修复了 RecyclerView 上下滚动时缩小图像的 Glide 错误。
仅供参考:我使用的是 androidx 而不是支持库,但它也应该与 ImageView 和 AppCompatImageView 小部件一起使用。
这是 RecyclerView 的项目布局的片段:
<RelativeLayout...
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/attachment_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:adjustViewBounds="true"
android:background="@drawable/camera_image_preview_default"
android:minWidth="400dp"
android:scaleType="centerCrop" />
</RelativeLayout>
这是我的适配器 onBindViewHolder 覆盖中的代码:
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
....
....
attachmentImage.layout(0, 0, 0, 0);
Glide.with(context)
.load(Uri.fromFile(new File(AppGlobals.IMAGES_THUMBNAIL_STORE_PATH + packet.getImageFileName())))
.placeholder(ResourcesCompat.getDrawable(context.getResources(), R.drawable.image_loading_placeholder, null))
.centerCrop()
.error(ResourcesCompat.getDrawable(context.getResources(), R.drawable.missing_thumbnail, null))
.into(attachmentImage);
....
....
}
如果你注意到,
在 Glide 绑定之前,ImageView 已经设置为布局 0, 0, 0, 0。这将确保 Glide 将其解释为新布局 inflation 并且不使用缓存策略.
minWidth
已设置为400dp
,而layout_width
已设置为match_parent
,layout_height
已设置设置为wrap_content
。您可以将minWidth
操纵到您选择的极限。绑定将在运行时使用
centerCrop()
,因此您在设计时在 xml 布局中设置的scaleType
并不重要。
仅供参考:此示例使用从本地设备的 public 外部存储目录加载图像。使用其他实现从网络加载或 URL
致谢:TWiStErRob 在 Glide Github 社区论坛中提到并推荐了将布局设置为全零。
@https://github.com/TWiStErRob
对于问题#1591
https://github.com/bumptech/glide/issues/1591
附带说明一下,如果您在 xml 布局中使用绝对 layout_height
和 layout_width
设置 ImageView - 分别说 400dp 和 300dp,Glide 可以完美运行。只有当每张图片的尺寸都不同时,才能看出问题。
以下帮助了我:
1) 在图像视图中使用 adjustViewBounds = "true" -> 这将使图像视图在 draws/redraws/resizes
时根据其图像保持其宽高比2) 设置layout_width = match_parent 和layout_height = wrap_content 用于recycler view 的item view xml,还有Image View。
原因:
假设 Recycler 视图设置有 2 列垂直方向的网格布局管理器 它将强制回收器视图的项目行的 xml 为屏幕宽度的一半。 由于项目行的 match_parent 及其 chid 的 (imageview) layout_height 属性的值,这将导致图像变为屏幕宽度的一半。 现在,由于 adjustViewBounds = true,图像视图将自行调整其高度以保持纵横比。