15

嗨,当他们第一次被调用到我的片段中时,我正在使用 glide 图像加载器库填充一个 gridview,它们看起来像这样完美的 但是在向上和向下滚动之后,它们被调整大小并看起来像这样这太小 是我正在用我的 gridview 做的事情,滑行图书馆,还是像我的占位符图像一样的东西?在第二个屏幕截图上,如果我按下图像,它会亮起以显示它实际上填充了整个空间,有人知道我在这里做错了什么吗?我已经尝试在使用 centercrop 等的滑行中更改呼叫,但似乎没有什么区别,我不确定如何计算每个单元格的宽度和高度,欢迎提出任何建议

编辑这里是我如何调用 glide

   Glide.with(getActivity())
                .load(mThumbIds[position])
                .placeholder(R.drawable.placeholder)
                .error(R.drawable.ic_drawer)
                .centerCrop()
                .override(500,300)
                .into(imageView);
4

7 回答 7

18

实际上,您必须为图像容器(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);

希望这可以帮到你。

于 2016-04-07T11:45:51.487 回答
6

使用.dontAnimate()方法解决问题。

Glide.with(上下文)
                .using(新的 FirebaseImageLoader())
                .load(路径参考)
                .dontAnimate()
                .placeholder(R.drawable.place_holder)
                .into(holder.logo);
于 2017-05-18T10:08:10.143 回答
5

以下帮助了我:

1)在您的图像视图中使用了adjustViewBounds =“true” - >这将使图像视图在绘制/重绘/调整大小时根据其图像保持其纵横比

2) 为回收站视图的项目视图 xml 设置 layout_width = match_parent 和 layout_height = wrap_content,也为图像视图设置。

原因:

假设 Recycler 视图设置为具有垂直方向的 2 列的 Grid Layout Manager 它将强制回收器视图的项目行的 xml 为屏幕宽度的一半。由于 item 行的 match_parent 的值和它的 chid 的 (imageview) layout_height 属性,它会导致图像变成屏幕宽度的一半。现在,由于 adjustViewBounds = true,图像视图本身会调整其高度以保持纵横比。

于 2019-09-27T09:08:19.200 回答
2

无论如何,有 .fitCenter() 或 .centerCrop() 之类的方法。尝试在

    Glide.with(getApplicationContext())
                            .load("")
                            .centerCrop()
                            .placeholder(R.drawable.ic_launcher)
                            .crossFade()
.override(1000,1000)
                            .into(myImageView); 
           .
于 2015-08-03T12:14:46.900 回答
1

对于一个几乎相同的问题,我所要做的就是添加 .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>
于 2017-09-11T03:57:31.790 回答
0

我找到了适用于 Glide V4 (4.8.0) 版本的解决方案

在 gradle 中导入“Glide”(目前最新版本为 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);
于 2018-10-08T13:40:11.603 回答
-1

当高度有时更大而宽度有时更大时,覆盖矩形图像可能会导致图像无法正确显示。

这是我所做的,以防万一有人想探索。这修复了在 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 将其解释为新的布局膨胀,而不是使用缓存策略。

  2. minWidth已设置为400dp,而已layout_width设置为match_parentlayout_height已设置为wrap_content。您可以minWidth根据您选择的限制进行操作。

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

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

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

@ https://github.com/TWiStErRob

对于问题 #1591

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

附带说明一下,如果您在 xml 布局中将 ImageView 设置为绝对layout_heightlayout_width- 分别为 400dp 和 300dp,Glide 可以完美运行。只有当每个图像的尺寸不同时,人们才会看到问题。

于 2019-06-18T10:33:12.480 回答