2012-02-16 11 views
180

Estaba construyendo alguna interfaz de usuario en xml, y Lint me dio una advertencia y me dijo que estableciera android: baselineAligned en false para mejorar el rendimiento en ListView.¿Cómo mejora baselineAligned to false el rendimiento en LinearLayout?

la documentación para los cambios de pelusa que han añadido este aviso dicen rendimiento

Diseño: Encuentra LinearLayouts con pesas donde se debe conjunto androide: baselineAligned = "false" para un mejor rendimiento, y también encuentra casos donde ha anidado pesos que pueden causar problemas de rendimiento .

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

Respuesta

138

Al establecer android:baselineAligned="false", está impidiendo el trabajo adicional que tiene que hacer el diseño de su aplicación para Alinear las líneas de base de sus hijos; que obviamente puede aumentar el rendimiento. (Menos operaciones innecesarias de una IU => mejor rendimiento)

+14

Esa parte es obvia. Lo que estaba tratando de decir es por qué esto es solo una mejora en el rendimiento cuando se trata de peso? –

+3

Debido a que linearlayout solo necesita calcular la línea de base cuando hay pesos involucrados. Es como una característica inteligente que en realidad puede ser molesto. – Warpzit

+163

¿Qué es una línea de base? – Matthew

13
// 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

15

cómo android:baselineAligned="false" ayuda. Puede que no sea la respuesta, pero ayuda a obtener el concepto.

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

Esto puede parecer simple, pero en realidad especificando androide: gravedad = "center_vertical" como atributo LinearLayout no es suficiente - icono se centra, pero el texto y el botón no lo son. Esto es porque (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 utilizando la línea base del texto!

Especificar android: baselineAligned = "false" en LinearLayout desactiva este , y todo se centra correctamente.

Cuestiones relacionadas