1

我创建了一个自定义 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. 问题本质上是用大量动态图像刷新视图及其优化。

4

2 回答 2

3

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

于 2011-06-01T09:48:00.487 回答
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 ...);
于 2011-06-01T09:56:03.517 回答