¿Cómo establece baselineAligned en false mejorar el rendimiento en LinearLayout?

218

Estaba creando una interfaz de usuario en xml, y Lint me dio una advertencia y me dijo que configurara android: baselineAligned a false para mejorar el rendimiento en ListView.

Los documentos para los cambios de pelusa que agregaron esta advertencia dicen

Rendimiento del diseño: encuentra LinearLayouts con pesos donde debe configurar android: baselineAligned = "false" para un mejor rendimiento, y también encuentra casos en los que tiene pesos anidados que pueden causar problemas de rendimiento.

¿Alguien puede explicar por qué esto mejora el rendimiento, específicamente cuando se trata de peso?

Christopher Perry
fuente

Respuestas:

165

Al configurar android:baselineAligned="false", está evitando el trabajo adicional que tiene que hacer el diseño de su aplicación para alinear las líneas de base de sus hijos; lo que obviamente puede aumentar el rendimiento. (Menos operaciones innecesarias en la interfaz de usuario => Mejor rendimiento)

Nima G
fuente
20
Esa parte es obvia. A lo que estaba tratando de llegar es por qué esto es solo una mejora de rendimiento cuando se trata de peso.
Christopher Perry
185
¿Qué es una línea de base?
Matt
48
El término línea base proviene de la tipografía. Son las líneas invisibles en las que se sientan los textos. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany
12
Entonces, si se trata de una mejora del rendimiento, eso significa que el trabajo que normalmente se realiza ya no se realiza. ¿Cuáles son los efectos secundarios de esto? ¿El trabajo que ahora estamos evitando tiene la capacidad de producir resultados diferentes?
lhunath
30
@lhunath de acuerdo con la documentación, el valor predeterminado se establece en verdadero . esto obliga a la línea de base de cualquier texto de la interfaz de usuario a alinearse entre sí. Por ejemplo, piense en los botones, tiene dos botones con el mismo ancho / alto en la misma línea, pero uno de ellos tiene un texto más largo, debido a que baselineAlined="true"el botón con texto más largo puede terminar moviéndose para alinear su texto con otros botones. Para un mejor ejemplo, mira esta publicación
Nima G
20

que android:baselineAligned="false" ayuda Puede que no sea la respuesta, sino ayudar a obtener el concepto.

Acabo de obtener 3 elementos (icono, texto, botón) centrados verticalmente en LinearLayout horizontal.

Esto puede parecer simple, pero en realidad especificar android: gravity = "center_vertical" como atributo LinearLayout no es suficiente: el icono está centrado, pero el texto y el botón no. Esto se debe a que (presumiblemente) el texto tiene una línea base, y el algoritmo de centrado lo usa en lugar del centro vertical 'real'. Pero lo que es peor: ¡el botón (que viene junto al texto) se centra usando la línea de base del texto!

Si especifica android: baselineAligned = "false" en LinearLayout, esto se desactiva y todo se centra correctamente.

Zar E Ahmer
fuente
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

agua hervida
fuente