为什么Glide加载的图像会在RecyclerView中下采样到低分辨率?

时间:2015-11-21 14:46:01

标签: android android-layout android-recyclerview android-glide

我在我的应用中从Picasso切换到Glide。我有一个RecyclerView,每个项目都是CustomView。此CustomView根据不同的数据源动态添加TextViewImageView

FillWidthImageView用于显示这些图像,它会自动填充屏幕宽度。当我使用Picasso时,效果很好。但是,当我使用Glide加载图片时,FillWidthImageView中显示的图片看起来像分辨率极低的马赛克,因为它会严重下采样。<​​/ p>

如果我改为使用普通ImageView,则加载图像的大小与占位符相同,图像看起来仍像马赛克。如果没有占位符,则屏幕上的图像看起来很小。如果我以空Activity显示图像,它们将以完整分辨率和正确尺寸加载。

在我的ImageView中添加CustomView的代码(扩展LinearLayout),在RecyclerView.onCreateViewHolder()中调用

public void addImageView() {
    ImageView imageView = new FillWidthImageView(getContext());
    imageView.setPadding(0, 0, 0, 10);
    imageView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    addView(imageView);
}

代码FillWidthImageView

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    Drawable drawable = getDrawable();
    if (drawable != null) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int diw = drawable.getIntrinsicWidth();
        if (diw > 0) {
            int height = width * drawable.getIntrinsicHeight() / diw;
            setMeasuredDimension(width, height);
        } else
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    } else
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

加载图片的代码,在RecyclerView.onBindItemViewHolder()

中调用
Glide.with(getContext()).load(url).into(imageView);

1 个答案:

答案 0 :(得分:1)

感谢@Hitesh Kr Sahu,但我自己已经解决了这个问题。这是因为Glide没有得到我的CustomView包装器的正确尺寸。我通过调用.override(int,int).fitCenter()来应用维度来解决这个问题。我将屏幕的宽度和高度传递给它,因此它将根据屏幕尺寸进行缩放。