通过调用onDraw经常刷新的自定义ImageView的优化

时间:2011-06-01 09:28:14

标签: android android-layout android-imageview

我创建了一个自定义ImageView,在其onDraw方法中,我需要根据用户交互(如触摸)绘制一些位图。随着我开始添加越来越多的位图,应用程序真的变慢了,一切都运行得很好。

这就是我在自定义ImageView的onDraw中所做的事情

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    Log.e(TAG, "onDraw called");

    for (int i=0; i < bitmapList.size(); i++){
        drawBitmap(canvas, bitmapList.get(i));
    }
}

正如你所看到的,每当onDraw被自动调用时,我会重新绘制List中的所有位图,当位图数超过4-5时,操作变得非常昂贵并且减慢了应用程序的速度。

关于如何优化这个问题的任何解决方案?

  1. 可以在不同的线程中调用drawBitmap使操作更便宜吗?

  2. 有没有办法保留上一个画布的副本,然后只需在onDraw中恢复它,而不是再次绘制所有位图?

  3. 问题基本上是刷新视图,其中包含大量动态图像及其优化。

2 个答案:

答案 0 :(得分:3)

您应该创建一个Bitmap,其大小必须等于ImageView的图像大小,并且只在此位图上的bitmapList绘制一次所有位图。在每次onDraw()调用时,您应该只绘制此位图。当bitmapList发生更改时,必须重新创建此附加位图。

答案 1 :(得分:1)

你可以使用后备缓冲图像在你改变时将所有图像绘制成,然后在onDraw()

中仅将后备缓冲图像绘制到屏幕上
// create backbuffer and draw it as seldom as possible
final Bitmap bufferBitmap = Bitmap.createBitmap(320, 240, Bitmap.Config.ARGB_8888);
final Canvas bufferCanvas = new Canvas(bufferBitmap);
for (int i=0; i < bitmapList.size(); i++){
  drawBitmap(bufferCanvas, bitmapList.get(i));
  }

// draw the buffered image as often as needed
canvas.drawBitmap(bufferBitmap ...);