57

この質問に対する私の答えは受け入れられたばかりですが、ビューを無効にする必要があるのはいつですか、それが必要ないのはいつですか?

少し考えた後、私はそれが多かれ少なかれこのように機能するはずだと気づきました:

  • 「すべて」の実際の描画は後に発生しますonResume()
  • invalidated「自由な」時間に画面の一部を再描画できますが、再描画された部分(およびその下のすべて)のみが再描画されます。

したがって、後で何かを変更した場合onResume()(たとえば、ボタンクリックへの応答として)、変更する必要invalidate()があるように見えますView

ただし、この質問のscanaの内容からすると、それよりも複雑である必要があり、使用する方法によって異なります。

たとえば、使用するかどうか

lastClicked.setImageBitmap();

また

lastClicked.setImageResource();

では、ビューでinvalidate()を実行する必要がある場合、それは実際にどのように機能しますか?

4

4 に答える 4

95

(いくつかの回答を受け入れることを検討してください)

一般に、invalidate()「画面上で再描画」を意味し、結果はビューのonDraw()メソッドの呼び出しになります。したがって、何かが変更され、画面に反映する必要がある場合は、 を呼び出す必要がありますinvalidate()。ただし、組み込みウィジェットの場合は、自分で呼び出す必要はほとんどありません。ウィジェットの状態を変更すると、必要に応じて内部コードが呼び出さinvalidate()れ、変更が画面に反映されます。たとえば、 を呼び出すとTextView.setText()、多くの内部処理 (テキストが画面に収まるか、省略される必要があるかなど) を行った後、が返される前TextViewに呼び出されます。他のウィジェットについても同様です。invalidate()setText()

カスタム ビューを実装する場合はinvalidate()、バッキング モデルが変更され、ビューを再描画する必要があるたびに呼び出す必要があります。invalidate()また、状態を変更して を呼び出し、再度状態を変更するなどの簡単なアニメーションの作成にも使用できます。

于 2012-05-18T06:27:54.230 に答える
30

通常、システムはウィジェットのサイズ変更、非表示、表示、およびその他の多くのことを自動的に処理しますが、描画されたピクセルまたはバッキング データの基礎となるバッファーが変更されたり、古くなったりすると、問題が発生することがあります (View または生のデータセットが変更されます)。これは、データが特定の方法で変更されたことを OS が認識できないために発生します。

描画を扱っているこれらのケースでは、基になるデータがWidget.invalidate()で良好な状態にないことをシステムに伝える必要があり、再描画はあなたが述べたようにメインスレッドでキューに入れられます。システムの実装と Android のバージョンに応じて、システムによって変更が追跡されるものは異なりますが、私が通常行うことは、システム リソース (バイト配列、文字配列、リソース インデックス、コンテキストでの手動描画) が追跡されず、無効化が必要であると想定することです。それ以外はすべてシステムによって処理されます。

于 2012-05-18T06:37:01.453 に答える
0

画面への描画は頻繁に行われるプロセスであることを覚えておいてください。ビューを更新するたびに、その変更を反映して再描画し、そのような変更を正しく通知する必要があります。invalidate()変更を表示したいビューの再描画を強制することを知らせるトリガーメソッドです。

于 2017-09-15T16:00:38.880 に答える