2012-05-18 12 views
26

Meine Antwort auf this question wurde gerade akzeptiert, aber ich begann mich zu fragen, wann genau man eine View ungültig machen() und wann es nicht notwendig ist?Wenn es notwendig ist, invalidate() in einer View auszuführen?

Nach einem bisschen Denk ich Erkenntnis kam, dass es sollte Arbeit mehr oder weniger wie folgt aus:

  • eigentliche Zeichnung von „alles“ tritt nach onResume()
  • in „freien“ Zeit Teilen kann der Bildschirm neu gezeichnet werden, sondern nur

es wäre daher diejenigen, die invalidated waren (darunter und alles) erscheinen, wenn ich etwas nachändern(z.B. als Antwort auf einen Knopf klicken, sollte ich invalidate() die geänderten View).

Allerdings, was scana in this question sagt, muss es komplexer sein als das und es hängt manchmal davon ab, welche Methode man verwendet.

z. ob ein

lastClicked.setImageBitmap(); 

oder

lastClicked.setImageResource(); 

Also, wenn es notwendig ist auszuführen invalidate() auf einem View verwendet und wie funktioniert es wirklich?

Antwort

13

Normalerweise behandelt das System Größenänderung, Verbergen, Anzeigen und eine Menge anderer Dinge für Ihre Widgets automatisch aber Es treten manchmal Probleme auf, wenn der zugrunde liegende Puffer für gezeichnete Pixel oder Hintergrunddaten geändert wurde oder veraltet ist (Sie tauschen die Bildressource in einer Ansicht aus, oder die Rohdatei ändert sich). Dies geschieht, weil das Betriebssystem auf keinen Fall wissen kann, dass sich die Daten in der bestimmten Weise geändert haben.

In diesen Fällen, in denen Sie mit dem Zeichnen zu tun hat, müssen Sie das System sagen, dass die zugrunde liegende Daten sind einfach nicht in einem guten Zustand mit Widget.invalidate() und der Wieder Zeichnung wird auf dem Haupt-Thread der Warteschlange wie du erwähnt hast.Abhängig von der Systemimplementierung und Android-Version variiert, was für Änderungen durch das System verfolgt wird, aber was ich normalerweise tue, wird davon ausgegangen, dass Systemressourcen (Byte-Arrays, Char-Arrays, Ressourcenindizes, manuelle Zeichnung auf dem Kontext) nicht verfolgt werden und benötigen annullieren und alles andere wird vom System behandelt.

+0

Einige korrigieren Sätze, aber falsche Vorgehensweise. !! -1 – ncm

54

(Sehen Sie einige Antworten zu akzeptieren)

, im Allgemeinen invalidate() bedeutet ‚auf dem Bildschirm neu zu zeichnen‘ und führt zu einem Aufruf der onDraw() Methode Sicht. Wenn sich also etwas ändert und auf dem Bildschirm angezeigt werden muss, müssen Sie invalidate() anrufen. Bei integrierten Widgets müssen Sie es jedoch selten oder nie selbst aufrufen. Wenn Sie den Status eines Widgets ändern, ruft der interne Code bei Bedarf invalidate() auf und Ihre Änderung wird auf dem Bildschirm angezeigt. Zum Beispiel, wenn Sie TextView.setText() aufrufen, nach vielen internen Verarbeitung (wird der Text auf dem Bildschirm passen, muss es ellipsentiert werden, etc.), TextView ruft invalidate() vor setText() zurück. Ähnlich für andere Widgets.

Wenn Sie eine benutzerdefinierte Ansicht implementieren, müssen Sie invalidate() aufrufen, wenn sich das Backing-Modell ändert und Sie Ihre Ansicht neu zeichnen müssen. Es kann auch verwendet werden, um einfache Animationen zu erstellen, wo Sie Status ändern, dann invalidate() aufrufen, den Status ändern, etc.

+1

um diese Antwort zu vervollständigen, würde ich sagen, dass viele Male wichtig ist, den Code der verschiedenen Methoden zu überprüfen, die Sie auf einem Widget verwenden können, um zu verstehen, wenn ein Aufruf ungültig ist und ein Layout implementieren, um sie zu minimieren. Wenn Sie beispielsweise ein komplexes Layout haben, wird ein einzelnes TextView mit wrap_content() immer Ihr Layout am Ende jedes Aufrufs von setText() invalidieren, am anderen Ende, wenn Sie eine feste Dimension erhalten Die Ansicht wird mit dem Ergebnis einer viel flüssigeren GUI geändert. –

0

Bitte denken Sie daran, dass das Zeichnen auf dem Bildschirm ein häufiger Prozess ist. Wenn Sie eine Ansicht aktualisieren, sollte diese Änderung propagiert und neu gezeichnet werden, um eine solche Änderung zu melden. invalidate() ist eine Auslösemethode, die das Erzwingen der Neuzeichnung jeder Ansicht, für die Änderungen angezeigt werden sollen, signalisiert.

Verwandte Themen