web-dev-qa-db-fra.com

Comment définir baselineAligned sur false améliore-t-il les performances dans LinearLayout?

Je construisais simplement une interface utilisateur au format xml, et Lint m'a averti et a dit de définir Android: baselineAligned sur false pour améliorer les performances dans ListView.

Les docs pour les changements de peluches qui ont ajouté cet avertissement disent

Mise en forme: recherche LinearLayouts avec des poids pour lesquels vous devez définir Android: baselineAligned = "false" pour de meilleures performances, et recherche également les cas où vous avez des poids imbriqués pouvant entraîner des problèmes de performances.

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

205
Christopher Perry

En mettant 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 la performance. (Moins d'opérations inutiles sur l'interface utilisateur => Meilleures performances)

154
Nima G

comment Android:baselineAligned="false" Aidez-moi . Ce n'est peut-être pas la solution, mais aide à comprendre le concept.

J'ai juste réussi à obtenir 3 éléments (icône, texte, bouton) centrés verticalement dans 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. Ceci est dû au fait que (vraisemblablement) le texte a une ligne de base et que 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é sur la ligne de base du texte!

Spécification d'Android: baselineAligned = "false" dans LinearLayout désactive cette option et tout est correctement centré.

19
Xar E Ahmer
// 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#L109

14
boiledwater