在ImageView的setImageBitmap之后的onmeasure方法上花了太多时间

时间:2011-10-10 21:38:45

标签: android android-imageview

长时间读者,第一次询问,请轻轻一点;)

我有一个Android代码,在ImageView上显示大约10张图片。 (在ImageView上调用setImageBitmap来设置新的位图) 这导致显示滞后,所以我试图尽可能加快速度。

我发现(使用traceview)应用程序在方法上花费了大量时间:

ViewRoot.performTraversals
View.measure
FrameLayout.onmeasure
ViewGrou.measureChildWithMargins

我怀疑在ImageView测量,所以我创建了CustomImageView并覆盖onMeasure只是为了调用super方法并编写sysout。

似乎每次调用setImageBitmap onmeasure 3次后。 位图总是大小相同,所以没有变化。实际上,当图像源发生变化时,它可能会不时发生变化,但只有这样才能重新测量。

我可以改变哪些方面来消除这种测量对应用速度的影响?

如果您需要进一步的信息,请告诉我,我会提供。

示例代码

final Bitmap bitmapScaled = Bitmap.createScaledBitmap(bitmap2, width, height, false);
imageView2.setScaleType(ScaleType.CENTER_INSIDE);
if (setSize) {
    setSize(imageView2, width, height);
}
imageView2.setImageBitmap(bitmapScaled);

我改变以使其更快地工作的方法(可能不安全?!)

boolean layout=true;

int noL=1;

@Override
public void requestLayout() {
    if (layout){
        super.requestLayout();              
        if (noL>10){
            layout=false;
        }else{
            noL++;
        }
    }
}

1 个答案:

答案 0 :(得分:6)

当我遇到类似的问题时,我做了以下事情:

public class ImageViewEx extends ImageView{
    private boolean makeRequest;
    public ImageViewEx(Context context){
        super(context);makeRequest=true;
    }
    public ImageViewEx(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public ImageViewEx(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         makeRequest=true;
    }
    public void setImageBitmapNoRequestLayout(Bitmap bitmap) {
        makeRequest = false;
        setImageBitmap(bitmap);
        makeRequest = true;
    }
    @Override public void requestLayout(){
        if(makeRequest)super.requestLayout();
    }
}

现在使用setImageBitmapNoRequestLayout(...)更改位图不会调用requestLayout()