カスタム ビューを 1 つだけ表示するアクティビティを作成しました。
ビューは単純で、ランダムな色を描画して小さい領域を無効にし、ランダムな色を描画してさらに小さい領域を無効にする、など...
期待される結果は次のようになります。ソフトウェア レンダーを使用するとうまく機能し、getClipBounds() は無効化に渡したばかりの領域を返します。しかし、ハードウェア アクセラレーションが有効な場合、ビュー全体が常に新しい色で再描画され、getClipBounds() はビュー全体の領域を返します。
thisやthisのような投稿があることは知っています。回答によると、getClipBounds() はハードウェア アクセラレーションを使用してビューの領域全体を返しますが、ダーティ領域と交差する領域のみが再描画されます。
何か間違っているか、私の誤解がありますか?
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// random color
int color = Color.rgb((int) (Math.random() * 255),
(int) (Math.random() * 255), (int) (Math.random() * 255));
canvas.drawColor(color);
canvas.getClipBounds(rect);
// smaller dirty region
invalidate(0, 0, rect.width() - 1, rect.height() - 1);
}