【问题标题】:Too much time on onmeasure method after setImageBitmap of ImageViewImageView 的 setImageBitmap 之后 onmeasure 方法的时间过长
【发布时间】:2011-10-10 21:38:44
【问题描述】:

长期阅读,第一次提问,所以请轻点;)

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

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

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

我怀疑 ImageView 测量,所以我创建了 CustomImageView 并覆盖 onMeasure 只是为了调用超级方法并编写 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++;
        }
    }
}

【问题讨论】:

  • 您的代码的 sn-p 怎么样,让我们​​能够复制并帮助您解决问题?这似乎不是一个任何人都可以在没有代码上下文的情况下跳入的明显问题。
  • Snippent 不会改变匹配,因为当经常这样做时,问题只出在一行 setImageBitmap 上。我通过自定义图像视图和 requestlayout 方法的覆盖来解决它。我改变了这个方法,所以它会调用 super 10 次而不是更多,它可以工作并节省大量时间。仍然对适当的解决方案感兴趣,因为我不确定这是否会让我在其他地方感到头疼。
  • 随机图片基本上只做10次setImageBitmap,看看如何改善滞后?我只是对滞后感到惊讶,因为 10 张照片不算什么。这就是为什么我要求使用代码 sn-p 来查看是否还有其他问题导致了这个问题。作为长期阅读者,您应该知道代码 sn-p 如何帮助任何人回答特定问题并更好地理解上下文
  • 当然感谢您的参与 :)

标签: android android-imageview


【解决方案1】:

当我遇到类似问题时,我做了以下操作:

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()

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多