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));
    }
}

ご覧のとおり、ビットマップの数が4〜5を超えると、onDrawが自然に呼び出されるたびに、リスト内のすべてのビットマップを再描画しています。操作が非常に高価になり、アプリケーションの速度が低下します。

これをどのように最適化できるかについて、この問題に対する解決策はありますか?

  1. 別のスレッドでdrawBitmapを呼び出すと、操作のコストを下げることができますか?

  2. 以前のキャンバスのコピーを保持してから、すべてのビットマップを再度描画するのではなく、単にonDrawで復元する方法はありますか?

  3. 問題は本質的に、ビューを更新して動的な画像をたくさん表示し、その最適化を行うことです。

4

2 に答える 2

3

の画像サイズとBitmap等しくなければならないサイズを作成し、このビットマップからすべてのビットマップを1回だけ描​​画する必要があります。すべての呼び出しで、このビットマップのみを描画する必要があります。変更する場合は、この追加のビットマップを再作成する必要があります。ImageViewbitmapListonDraw()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 に答える