Comment le fait de définir baselineAligned sur false améliore les performances dans LinearLayout?

218

Je construisais juste une interface utilisateur en xml, et Lint m'a donné un avertissement et a dit de définir android: baselineAligned sur false pour améliorer les performances dans ListView.

Les documents pour les changements Lint qui ont ajouté cet avertissement disent

Performances de mise en page: recherche LinearLayouts avec des poids où vous devez définir android: baselineAligned = "false" pour de meilleures performances, et trouve également les cas où vous avez des poids imbriqués qui peuvent causer des problèmes de performances.

Quelqu'un peut-il expliquer pourquoi cela améliore les performances, en particulier lorsque le poids est impliqué?

Christopher Perry
la source

Réponses:

165

En définissant android:baselineAligned="false", vous empêchez le travail supplémentaire que la mise en page de votre application doit faire pour aligner les lignes de base de ses enfants; ce qui peut évidemment augmenter les performances. (Moins d'opérations inutiles sur l'interface utilisateur => Meilleures performances)

Nima G
la source
20
Cette partie est évidente. Ce que j'essayais de comprendre, c'est pourquoi est-ce seulement une amélioration des performances lorsque le poids est impliqué?
Christopher Perry
185
Qu'est-ce qu'une ligne de base?
Matt
48
Le terme de référence vient de la typographie. Ce sont les lignes de texte invisibles dans le texte. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany
12
Donc, s'il s'agit d'une amélioration des performances, cela signifie que le travail qui est normalement effectué ne l'est plus. Quels en sont les effets secondaires? Le travail que nous évitons maintenant a-t-il la capacité de produire des résultats différents?
lhunath
30
@lhunath selon la documentation, la valeur par défaut est true . cela force la ligne de base de tout texte d'interface utilisateur à s'aligner les uns avec les autres. Par exemple, pensez aux boutons, vous avez comme deux boutons de même largeur / hauteur sur la même ligne, mais l'un d'eux a un texte plus long, car baselineAlined="true"le bouton avec du texte plus long peut finir par se déplacer pour aligner son texte avec d'autres boutons. Pour un meilleur exemple, consultez cet article
Nima G
20

comment android:baselineAligned="false" aider. Ce n'est peut-être pas la réponse, mais aider à obtenir le concept.

Je viens de réussir à obtenir 3 éléments (icône, texte, bouton) centrés verticalement en LinearLayout horizontal.

Cela peut sembler simple, mais en réalité, spécifier android: gravity = "center_vertical" comme attribut LinearLayout ne suffit pas - l'icône est centrée, mais le texte et le bouton ne le sont pas. En effet, le texte a (vraisemblablement) une ligne de base et l'algorithme de centrage l'utilise à la place du centre vertical «réel». Mais ce qui est pire - le bouton (qui vient à côté du texte) est centré en utilisant la ligne de base du texte!

Spécifier android: baselineAligned = "false" dans LinearLayout désactive cela, et tout se centre correctement.

Zar E Ahmer
la source
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

eau bouillante
la source