In che modo l'impostazione baselineAligned su false migliora le prestazioni in LinearLayout?


218

Stavo solo costruendo un'interfaccia utente in xml e Lint mi ha dato un avvertimento e mi ha detto di impostare android: baselineAligned su false per migliorare le prestazioni in ListView.

Dicono i documenti per le modifiche Lint che hanno aggiunto questo avviso

Prestazioni del layout: trova LinearLayouts con pesi in cui dovresti impostare android: baselineAligned = "false" per prestazioni migliori e trova anche casi in cui hai pesi nidificati che possono causare problemi di prestazioni.

Qualcuno può spiegare perché questo migliora le prestazioni, in particolare quando è coinvolto il peso?

Risposte:


165

Impostando android:baselineAligned="false", stai impedendo il lavoro extra che il layout della tua app deve fare per allineare le linee di base dei suoi figli; che può ovviamente aumentare le prestazioni. (Meno operazioni non necessarie sull'interfaccia utente => Prestazioni migliori)


20
Quella parte è ovvia. Quello che stavo cercando di capire è perché questo è solo un miglioramento delle prestazioni quando è coinvolto il peso?
Christopher Perry,

185
Che cos'è una linea di base?
Matt,

48
Il termine baseline deriva dalla tipografia. Sono le lettere invisibili nel testo a sedere. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany

12
Quindi, se si tratta di un miglioramento delle prestazioni, ciò significa che il lavoro normalmente svolto non viene più svolto. Quali sono gli effetti collaterali di questo? Il lavoro che stiamo evitando adesso ha la capacità di produrre risultati diversi?
lhunath,

30
@lhunath secondo la documentazione, L'impostazione predefinita è true . questo costringe la linea di base di qualsiasi testo dell'interfaccia utente ad allinearsi a vicenda. Ad esempio, pensa ai pulsanti, hai come due pulsanti con la stessa larghezza / altezza sulla stessa linea ma uno di essi ha un testo più lungo, a causa del fatto che baselineAlined="true"il pulsante con un testo più lungo può finire per spostarsi per allinearlo con altri pulsanti. Per un esempio migliore, dai un'occhiata a questo post
Nima G

20

come android:baselineAligned="false" aiuto. Potrebbe non essere la risposta, ma aiutare a ottenere il concetto.

Sono appena riuscito a ottenere 3 elementi (icona, testo, pulsante) centrati verticalmente in LinearLayout orizzontale.

Questo può sembrare semplice, ma in realtà specificare android: gravity = "center_vertical" come attributo LinearLayout non è abbastanza - icona è centrata, ma testo e pulsante non lo sono. Questo perché (presumibilmente) il testo ha una linea di base e l'algoritmo di centraggio lo utilizza al posto del centro verticale "reale". Ma ciò che è peggio - il pulsante (che viene accanto al testo) è centrato usando la linea di base del testo!

Specificare android: baselineAligned = "false" in LinearLayout lo disattiva e tutto centra correttamente.


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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.