Leistung: Verhindern, dass requestLayout () die gesamte Hierarchie ausrichtet

8

Ich habe eine ziemlich komplexe Android-Anwendung. Ich habe die Ansichtshierarchien soweit wie möglich geebnet, aber in der Anwendung habe ich immer noch Nachholbedarf. Zum Beispiel gibt es ein Menü mit Einträgen, die zusammenfallen / expandieren, indem ihre Höhe durch ValueAnimator festgelegt wird. In der Regel läuft die Animation beim ersten Mal ein bisschen nach und nach diesem ersten Durchlauf ist sie glatt.

Ich habe bemerkt, dass, wenn ich "requestLayout ()" auf dem Menu-Item anrufe, Android anscheinend einen Layout-Durchlauf durchführt und mehrere Messungen durch die gesamte Hierarchie führt.

  • Da ich weiß, dass, obwohl das Menü-Item (View) die Höhe ändert, das Menü (View) selbst nicht funktioniert, gibt es eine Möglichkeit, dies der Anwendung mitzuteilen?
  • Kann ich irgendwie diesen ersten Durchlauf durchführen, der sich selbst zu verzögern scheint, so dass er nach dem Start der Anwendung und nicht bei der ersten Berührung auftritt?

Hier ist eine Skizze der Animation, die ich mache:

    
Fabian Zeindl 31.01.2013, 11:19
quelle

2 Antworten

6

Ich bin nicht sicher, warum ein Layout in Ihrer Animation ausgelöst wird, aber ich werde Ihre Frage abstrakt beantworten.

Wenn Sie requestLayout (entweder direkt oder indirekt) in Ihrer Animation aufrufen, tun Sie es WRONG.

requestLayout, für die Korrektheit und Sicherheit, kann eine vollständige Sicht Traversal auf der Ansicht Hierarchie b / c konzeptionell ändernden Begrenzungsrechteck eines Knotens in der View-Hierarchie kann in der Grenzen eines anderen Knoten zu ändern. Nicht immer der Fall, aber im Allgemeinen könnte es, deshalb RequestLayout ist eine vollständige Traversal.

All dies ist nur eine andere Art, eine Anfrage zu stellen. LAYOUT wird die Zeit von Ihrem 16,6-ms-Frame-Zeitfenster wegfressen und Ihre Animation unruhig machen. Dies ist besonders schlimm für tiefe und komplexe Hierarchien mit vielen RelativeLayouts, die intern zwei Durchgänge pro Ebene durchführen (was potentiell exponentielle Durchläufe auf einem Teilbaum verursacht)

Wenn Sie nun Änderungen in der Bemaßung animieren möchten, verwenden Sie setScale in einer Hardwareschicht. Und am Ende der Animation rufen Sie munter das Requestlayout auf und zerstören auch die Ebene (um Speicher freizugeben).

Weil es eine Ebene ist, die in Ihrer Animation wiederholt setScale aufruft, führt dies zu einer Änderung der Textur auf der GPU und umgeht damit den Traversierungsmechanismus der Ansichtshierarchie vollständig. Dies sollte es butterweich machen.

    
numan salati 18.06.2013 23:09
quelle
0

Ihre Frage sieht wie meine aus: Nur Kinder und nicht alle Baum

Zunächst können Sie versuchen, eine komplexe Ansichtshierarchie für Ihre Ansicht zu vermeiden. Wenn möglich, explizieren Sie Ansichten auf Ansichten, die nicht von einer anderen abhängen.

Wenn eine Animation ausgeführt wird, vermeiden Sie Layoutanfragen. Starten Sie Ihre Animation mit einer Verzögerung, wenn eine Layoutanforderung aussteht.

Verwenden Sie nach Möglichkeit Hardware-Ebenen für die Animation (möglicherweise verwendet Android sie standardmäßig mit ValueAnimator )

    
olivier_sdg 14.03.2013 09:31
quelle

Tags und Links