7

私はAndroid開発に不慣れで、ドキュメントを読んでAPIを試しています。invalidate(Rect)を呼び出した後、ImageViewがコンテンツの一部だけを描画する方法については混乱しています。

ImageView.javaを確認しましたが、onDraw(Canvas)以外の描画メソッドは見つかりませんでしたが、onDraw(Canvas)は、ビューの表示境界を超えている場合にのみ描画可能オブジェクトをカットします。View.invalidate(Rect)の実装も読みました。この関数の鍵は、mParent.invalidateChild(this、r);を呼び出すことだと思います。ただし、親ビューは、指定されたRectで子を描画する方法を知らないと思います。最終的に、子のメソッドを呼び出してペイントする必要があります。

誰かがコードのこの部分を調査しましたか?ガイドをお願いします。

4

3 に答える 3

3

私が収集できる限り、2 つの最適化が 1 つになっています。たとえば、子がビューグループの場合、無効化された領域と交差するこのグループの子のみが再描画されます。また、キャンバスはこの四角形の境界にクリップされます。これは、バスを介してフレームバッファにシャッフルする必要のあるピクセルが少なくなり、完全にクリップされた描画操作をスキップできることを意味します。

これは半ば知識に基づく推測です。私は数か月前にソースを参照しましたが、ViewGroup のことはかなり確信しています。2 つ目は、onDraw でクリッピングをオーバーライドし、すべてを再描画するかどうかを確認することでテストできます。

于 2011-02-06T21:24:42.610 に答える
1

Viewそのコードはクラスにあると思います。

google グループの Romain Guy からの興味深い回答が 2 つあります。

于 2010-12-19T14:37:15.733 に答える
0

Androidはj2meのキャンバスと同じようにビューを描画すると思います。すべての描画コードはハードウェア( screen )に直接描画されるのではなく、バッファまたはドローアブルなどに描画するだけです。View.invalidate(Rect) を呼び出すと、システムはバッファー (またはドローアブル) の rect 内の画像をハードウェア (画面) にコピーします。

于 2011-01-24T07:05:20.717 に答える