2016-03-27 5 views
1

invalidate(l,t,r,b)を使用してViewのいくつかの領域を無効にすると、onDraw()メソッドでクリップ領域を使用してそれらの領域を指定する必要がないことが示されているようです。一方、私はカスタムビューの多くの例を見てきましたが、領域を無効にするために汚れた領域を並行して維持してから、汚れた領域を使ってonDraw()メソッドでキャンバスをクリップします(たとえば、 the KeyBoardView classinvalidate(l、t、r、b)の後でクリップ領域を明示的に設定する必要がありますか?

この問題に関する文書は不完全ですか? invalidate()clipRect()を手で使うべきですか?

答えて

0

clipRect()と同時にinvalidate()を使用する必要はありません。あなたがそれらを独立して使うことができる時と、それらを一緒に使うことができる時があります。

Viewのメソッドであるため、invalidate()はView全体のレベルで機能します。このような領域を無効にすると、Androidは無効化された領域だけを再描画するため、変更の結果としてより少ないピクセルを押します。

canvasのメソッドであるため、clipRect()は、そのCanvasでの後続の描画操作の有効な描画スペースを変更します。これにより、限られたスペースにのみ影響を与えるように計算を調整することなく描画操作を実行できます。キャンバスは、そのスペースの外に描画すると効果がないことを保証します。クリップリージョンを累積して、非矩形のクリップリージョンを作成することもできます。

キャンバスをビューに関連付ける必要はありません。多くの場合、後で使用するためにビットマップに描画したいだけです。したがって、CanvasでclipRect()を使用すると、Viewと何か関係がない場合もあれば、そうでない場合でも、そのビューの無効化とは何の関係もない場合があります。非常に大きな描画スペースの最適化として2つを一緒に使用する場合は、ビューの無効化された領域がキャンバスのクリップされた領域と等価であることを確認する必要があります。クリップ領域は、必ずしも単純な長方形ではありません。

+1

キャンバスの部分は私には明らかです。説明を無効にすることはあまりありません。 'invalidate(...)'と言うと、アンドロイドはリージョンを再描画します。どうしたの? 'onDraw()'の中から無効化された領域をどのように描くのですか?または、全体のビューを描画するためにコードを作成し、アンドロイドが無効化された領域を描画しますか? (これは 'clipRect()'と非常によく似ています) – ilomambo

関連する問題