Wie verbessert das Festlegen von baseAligned auf false die Leistung in LinearLayout?

218

Ich habe gerade eine Benutzeroberfläche in XML erstellt, und Lint gab mir eine Warnung und sagte, ich solle android: baseelineAfligned auf false setzen, um die Leistung in ListView zu verbessern.

In den Dokumenten für die Lint-Änderungen, die diese Warnung hinzugefügt haben, heißt es

Layoutleistung: Findet LinearLayouts mit Gewichten, bei denen Sie android: basisAligned = "false" festlegen sollten, um eine bessere Leistung zu erzielen, und findet auch Fälle, bei denen Sie verschachtelte Gewichte haben, die Leistungsprobleme verursachen können.

Kann jemand erklären, warum dies die Leistung verbessert, insbesondere wenn es um Gewicht geht?

Christopher Perry
quelle

Antworten:

165

Durch das Festlegen android:baselineAligned="false"verhindern Sie die zusätzliche Arbeit, die das Layout Ihrer App leisten muss, um die Basislinien der Kinder auszurichten. was offensichtlich die Leistung erhöhen kann. (Weniger unnötige Operationen auf der Benutzeroberfläche => Bessere Leistung)

Nima G.
quelle
20
Dieser Teil ist offensichtlich. Ich habe versucht zu erreichen, warum dies nur eine Leistungsverbesserung ist, wenn es um Gewicht geht.
Christopher Perry
185
Was ist eine Basislinie?
Matt
48
Der Begriff Baseline stammt aus der Typografie. Es sind die unsichtbaren Zeilenbuchstaben im Text. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany
12
Wenn es sich also um eine Leistungsverbesserung handelt, bedeutet dies, dass die normalerweise geleistete Arbeit nicht mehr erledigt wird. Was sind die Nebenwirkungen davon? Hat die Arbeit, die wir jetzt vermeiden, die Fähigkeit, unterschiedliche Ergebnisse zu erzielen?
lhunath
30
@lhunath gemäß der Dokumentation, Der Standardwert ist true . Dadurch wird die Grundlinie eines UI-Textes gezwungen, sich aneinander auszurichten. Denken Sie beispielsweise an Schaltflächen, Sie haben zwei Schaltflächen mit derselben Breite / Höhe in derselben Zeile, aber eine davon hat einen längeren Text, da sich baselineAlined="true"die Schaltfläche mit längerem Text möglicherweise bewegt, um den Text an anderen Schaltflächen auszurichten. Ein besseres Beispiel finden Sie in diesem Beitrag
Nima G
20

wie android:baselineAligned="false" helfen. Es ist vielleicht nicht die Antwort, aber es hilft, ein Konzept zu bekommen.

Ich habe es gerade geschafft, 3 Elemente (Symbol, Text, Schaltfläche) vertikal im horizontalen LinearLayout zu zentrieren.

Dies mag einfach erscheinen, aber in Wirklichkeit reicht es nicht aus, android :vity = "center_vertical" als LinearLayout-Attribut anzugeben - das Symbol ist zentriert, Text und Schaltfläche jedoch nicht. Dies liegt daran, dass (vermutlich) Text eine Grundlinie hat und der Zentrierungsalgorithmus diese anstelle der "echten" vertikalen Mitte verwendet. Aber was ist schlimmer - die Schaltfläche (die neben dem Text steht) wird anhand der Grundlinie des Textes zentriert!

Wenn Sie android: baseelineAligned = "false" in LinearLayout angeben, wird dies deaktiviert und alles wird korrekt zentriert.

Zar E Ahmer
quelle
15
// Baseline alignment requires to measure widgets to obtain the
                // baseline offset (in particular for TextViews). The following
                // defeats the optimization mentioned above. Allow the child to
                // use as much space as it wants because we can shrink things
                // later (and re-measure).
                if (baselineAligned) {
                    final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                    child.measure(freeSpec, freeSpec);
                }

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/LinearLayout.java#L1093

Gekochtes Wasser
quelle