为什么我的图像在使用 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);
    ....
    ....
}

如果你注意到,

  1. 在 Glide 绑定之前,ImageView 已经设置为布局 0, 0, 0, 0。这将确保 Glide 将其解释为新布局 inflation 并且不使用缓存策略.

  2. minWidth已设置为400dp,而layout_width已设置为match_parentlayout_height已设置设置为 wrap_content。您可以将 minWidth 操纵到您选择的极限。

  3. 绑定将在运行时使用 centerCrop(),因此您在设计时在 xml 布局中设置的 scaleType 并不重要。

仅供参考:此示例使用从本地设备的 public 外部存储目录加载图像。使用其他实现从网络加载或 URL

致谢:TWiStErRob 在 Glide Github 社区论坛中提到并推荐了将布局设置为全零。

@https://github.com/TWiStErRob

对于问题#1591

https://github.com/bumptech/glide/issues/1591

附带说明一下,如果您在 xml 布局中使用绝对 layout_heightlayout_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,图像视图将自行调整其高度以保持纵横比。