1

カスタム ビューを 1 つだけ表示するアクティビティを作成しました。

ビューは単純で、ランダムな色を描画して小さい領域を無効にし、ランダムな色を描画してさらに小さい領域を無効にする、など...

期待される結果は次のようになります。ソフトウェア レンダーを使用するとうまく機能し、getClipBounds() は無効化に渡したばかりの領域を返します。しかし、ハードウェア アクセラレーションが有効な場合、ビュー全体が常に新しい色で再描画され、getClipBounds() はビュー全体の領域を返します。

thisthisのような投稿があることは知っています。回答によると、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);
}
4

1 に答える 1

2

残念ながら、これは少なくとも Android 5 の Android のハードウェア アクセラレーションの制限です。ビューの一部だけを描画しようとすると、以前にビューに描画されたものはすべて消えてしまいます。

Android がビュー全体を再レンダリングするのではなく、変更された部分のみを再レンダリングすると主張されている投稿を読んだことがありますが、無効にするために渡した四角形にある領域のみをレンダリングしようとすると、ビューの残りの部分は消えます。Android が変更された領域のみを再レンダリングしたことが本当なら、ビュー内の残りのカスタム描画は表示されたままになると思います。

iOS は、drawRect メソッドと setNeedsDisplayInRect により、パフォーマンスが大幅に向上します。Android も同じように動作することを期待していましたが、残念ながらそうではありません。

于 2015-10-02T16:18:37.917 に答える