2012-08-11 14 views
21

Log.d()コールを拡張ビューのonDraw()に入れて、どのくらいの頻度でコールされているかを確認できます。それはビューのインスタンス化時に呼び出されますが、これは驚くべきことではありません。しかし、私が気づいたのは、onTouchEvent()によって処理されるすべてのタップで呼び出されます。私のコードでは、グラフィックスに関連するものは何も遠隔操作していません。しかし、documentationのビューでは、onDraw()が実際に呼び出されたときには何も見つかりませんでした。私は実際に私の特定のプロジェクトについては心配していません(これは私のために問題を引き起こしません)、私はちょうどどこか、またはビューの操作の順序を示す何かのリストがあるかどうかを知りたいと思います。 onDraw()は呼び出されます。ときView.onDraw()---呼び出されるのはいつですか?

答えて

45

私の知る限り、ビューのonDraw()が呼び出されます。

  1. ビューが最初に描かれているinvalidate()がビューで呼び出されるたび
無効化は、あなたやで呼び出すことができます

必要に応じていつでも使用できます。たとえば、多くのビューでは、アウトラインとカーソルを取得するEditText、または押された状態にあるボタンのように、オンにする方法を変更します。これにより、ビューは再描画されます。

私は、ビューの動作を詳細に記述したドキュメントを用意しておき、それが存在し、誰かがどこにそれを見つけるかを知っていることがうれしいことに同意します。

+0

これは 'ViewGroup'sには当てはまりません。 ://stackoverflow.com/a/34367199/1642079 –

7
  • あなたはビューの背景描画可能に設定した場合は、[表示はバックそのonDraw()メソッドを呼び出す前に、あなたのために にそれを描画します。

  • ビューがウィンドウにアタッチされると、onAttachedToWindow()が呼び出されます。 これはサーフェスを持ち、描画を開始します。この 関数は、 onDraw(android.graphics.Canvas)より前に呼び出されることが保証されていますが、最初のonDrawの前にいつでも という名前で呼び出すことができます(onMeasure(int、 int)前後)。

  • invalidate()は、ダーティーで定義された領域を描画する必要があるとマークします。 ビューが表示されている場合、onDraw(android.graphics.Canvas)は で呼び出されます。心に留めておくべき

+0

onDraw()を呼び出す前に傍受する方法ですが、私の質問を確認したいですか?http://stackoverflow.com/questions/19052952/bitmap-change-will -make-view-auto-refresh-before-ondraw-and-regardless-invalid – VinceStyling

1

一つ重要なことは、それが引数なしで無効()関数の呼び出しを最小化しようとしています。 代わりに4つの引数を指定してinvalidate()関数を最大化しようとします。描画全体が非常に高価です。第2の変形では、ビューの一部のみが更新されます。

8

onDraw()は、invalidate()が呼び出されたときに呼び出されます。

しかし、あなたはViewGroupsについて知っておくべきです:onDraw()は、期待通りにと呼ばれることはありません。むしろ、onDispatchDraw()

ただし、ViewGroupではsetWillNotDraw(false)をコンストラクタに呼び出してonDraw()invalidate()に呼び出すことができます。

上記に追加this answer

0

を見てみましょう:ソフトキーボードがView.invalidateを(原因) - > View.onDraw()ウィンドウをリサイズ後のシーケンスが賢明「キーボード」を対応するために、 。カスタムView.onDraw()は、この可能性を予期する状態にしておく必要があります。
このような現象は、ブルートゥースキーボードを搭載したタブレットで開発してテストしたアプリが実際に犬に届いた理由を説明しています( - :

関連する問題