35

拡張ビューの onDraw() に Log.d() 呼び出しを入れたので、呼び出される頻度と時期を確認できました。ビューのインスタンス化時に呼び出されますが、これは当然のことです。しかし、その後、onTouchEvent() によって処理されるすべてのタップで呼び出されることに気付きました。これは、私のコードがグラフィックスに関連するリモート操作を行っていない場合でもです。ただし、ビューのドキュメントでは、 onDraw() が実際に呼び出されるタイミングについて何も見つけられないようです。私はここで私の特定のプロジェクトについてあまり心配していません (これは私にとって問題を引き起こしません)。どこかにリストがあるか、ビューの操作の順序を示す何かがあるかどうか、特に何が原因かを知りたいだけです。 onDraw() を呼び出します。

4

6 に答える 6

62

私の知る限り、ビューの onDraw() は次の場合に呼び出されます。

  1. ビューは最初に描画されます
  2. ビューでinvalidate()が呼び出されるたびに

Invalidate は、必要に応じてユーザーまたはシステムから呼び出すことができます。たとえば、EditText がアウトラインとカーソルを取得したり、ボタンが押された状態になったりするなど、多くの View は onTouch の外観を変更します。このため、ビューはタッチ時に再描画されます。

ビューの動作を詳しく説明したドキュメントがあればいいと思います。ドキュメントが存在し、その場所を知っている人がいる場合は、お知らせください。

于 2012-08-11T06:23:20.073 に答える
9
  • ビューにバックグラウンド ドローアブルを設定すると、ビューは onDraw() メソッドをコールバックする前にそれを描画します。

  • onAttachedToWindow () は、ビューがウィンドウにアタッチされたときに呼び出されます。この時点で Surface があり、描画を開始します。この関数は onDraw(android.graphics.Canvas) の前に呼び出されることが保証されていますが、onMeasure(int, int) の前後を含め、最初の onDraw の前であればいつでも呼び出すことができます。

  • invalidate() は、dirty によって定義された領域を描画する必要があるとマークします。ビューが表示されている場合、将来のある時点で onDraw(android.graphics.Canvas) が呼び出されます。

于 2012-08-11T06:43:17.437 に答える
0

上記に追加: ソフト キーボードは、ウィンドウのサイズを変更した後、 View.invalidate()-->View.onDraw()シーケンスを引き起こし、「キーボード」に適切に対応します。カスタムView.onDraw()は、この可能性を予期する状態のままにしておく必要があります。
このような現象は、ブルートゥース キーボードを備えたタブレットで開発およびテストしたアプリが、現実世界に到達すると犬に渡った理由を説明しています (-:

于 2017-09-01T08:02:25.177 に答える