15

画面全体を占めるカスタム ビューがあります。(ピアノの鍵盤) ユーザーがキーに触れると、それinvalidate()が呼び出され、キーボード全体が再描画されて、タッチされたキーの新しい状態が表示されます。

現在、ビューは非常にシンプルですが、もう少し素敵なグラフィックを追加する予定です。キーボード全体が動的にレンダリングされるため、キーボード全体を再描画するとコストが高くなります。

そこで、部分的な再描画を見てみましょう。今invalidate(Rect dirty)、正しいダーティ リージョンで呼び出します。onDraw(Canvas canvas)実際に部分的な再描画が必要な場合は、ダーティ リージョンにのみキーを描画するようにメソッドを設定します。これにより、これらのキーが描画されますが、キーボードの残りの部分は完全に黒くなり、まったく描画されません。

呼び出しinvalidate(Rect dirty)が現在の を「キャッシュ」canvasし、ダーティ リージョンでの描画のみを「許可」すると期待するのは間違っていますか?

私が望むものを達成する方法はありますか?(キャンバスを「キャッシュ」して、汚れた領域のみを再描画する方法はありますか?"

4

2 に答える 2

19

現在の適切な回避策は、キャンバス全体を手動でビットマップにキャッシュすることです。

 private void onDraw(Canvas canvas)
 {
     if (!initialDrawingIsPerformed)
     {
          this.cachedBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
            Config.ARGB_8888); //Change to lower bitmap config if possible.
          Canvas cacheCanvas = new Canvas(this.cachedBitmap);
          doInitialDrawing(cacheCanvas);
          canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint());
          initialDrawingIsPerformed = true;
     }
     else
     {
          canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint());
          doPartialRedraws(canvas);
     }
 }

もちろん、何を再描画するかについての情報を保存する必要があり、できればPaint毎回 new を使用しないでください。ただし、それは詳細です。

また、注意: ビットマップは、アプリのメモリ使用量が非常に多くなります。10MB を超えるメモリを使用していたため、デバイスの 5 倍の高さのスクローラーで使用されたビューをキャッシュしたときにクラッシュしました。

于 2010-06-01T12:09:00.483 に答える
5

Peterdk の回答を補完するために、操作をビットマップではなくピクチャに保存できます。

  • ビットマップはすべてのピクセルを保存します。彼が言ったように、大量のメモリが必要になる可能性があります。
  • Picture は、drawRect、drawLine などの呼び出しを保存します。

アプリケーションで何が本当に重いかによって異なります。多くの描画操作、いくつかの描画操作が重い計算によって制御されている、多くの空白/未使用スペース (Picture を優先) など...

于 2011-05-06T09:51:12.627 に答える