gpt4 book ai didi

android - 来自网络的具有不同高度的图像的 ListView 导致 "flickers"

转载 作者:行者123 更新时间:2023-11-30 03:13:26 27 4
gpt4 key购买 nike

场景如下:我有一些信息要显示在 ListView 上。每行都可以有标题、正文、日期、头像和更多数据。还有一个来自网络的 ImageView。 ImageView 的每一行都有不同的高度。我知道下载后它的高度(以像素为单位)是多少。

我现在正在做的是调整图像的宽度以填充它的父级,并自动调整它的高度。

我在下载图像时加载固定占位符。

这是 ImageView 的代码:

public class ResizableImageView2 extends ImageView {

public ResizableImageView2(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
Drawable d = getDrawable();

if(d!=null){
// ceil not round - avoid thin vertical gaps along the left/right edges
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
setMeasuredDimension(width, height);
}else{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}

问题是:占位符以固定大小加载,下载后我们放置 ImageView,布局会自行重新计算,这会导致 CPU 浪费,滚动缓慢。

我已经预先缓存传入的行以“最小化”这个问题。这样,应用程序会在 80% 的时间内从磁盘/内存加载图像(如果您处于良好的网络中并且以正常速度滚动)并且 ListView 不会“闪烁”。

我正在寻找的解决方案是将占位符的大小预设为与下载图像相同的大小。但出于某种原因,我很难做到这一点。

如果需要,我可以对图像进行一些裁剪(一些小像素),但没有办法让所有图像都以相同的尺寸裁剪 :P

想法?例子?

最佳答案

最后对我来说解决方案是:

public class ResizableImageView2 extends ImageView {

private int fixedHeight = -1;
private int fixedWidth = -1;

public ResizableImageView2(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (BuildConfig.DEBUG) Log.e("ResizableImageView2", "onMeasure called!");

if (fixedHeight != -1 && fixedWidth != -1) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) Math.ceil((float) width * (float) fixedHeight / (float) fixedWidth);
setMeasuredDimension(width, height);
} else {
Drawable d = getDrawable();
if (d != null) {
// ceil not round - avoid thin vertical gaps along the left/right edges
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
setMeasuredDimension(width, height);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}

public void setFixedHeight(int fixedHeight) {
this.fixedHeight = fixedHeight;
}

public void setFixedWidth(int fixedWidth) {
this.fixedWidth = fixedWidth;
}

我可以在使用 setFixedHeight 和 setFixedWidth 下载位图之前设置高度和宽度。占位符应该是 9 补丁,以便更好地拉伸(stretch)。在布局中我有 android:scaleType="fitXY"。

有了这个我可以在下载之前预先设置 ImageView 的大小,一旦下载 ImageView 将填充宽度并具有正确的宽高比的高度。

关于android - 来自网络的具有不同高度的图像的 ListView 导致 "flickers",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20548319/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com