Como a configuração de baselineAligned para false melhora o desempenho no LinearLayout?

218

Eu estava apenas criando uma interface do usuário em xml, e o Lint me deu um aviso e disse para definir android: baselineAligned como false para melhorar o desempenho no ListView.

Os documentos para as alterações do Lint que adicionaram este aviso dizem

Desempenho do layout: localiza LinearLayouts com pesos onde você deve definir android: baselineAligned = "false" para obter melhor desempenho e também encontra casos em que você aninha pesos que podem causar problemas de desempenho.

Alguém pode explicar por que isso melhora o desempenho, especificamente quando o peso está envolvido?

Christopher Perry
fonte

Respostas:

165

Ao definir android:baselineAligned="false", você está impedindo o trabalho extra que o layout do seu aplicativo precisa realizar para alinhar as linhas de base dos filhos; o que obviamente pode aumentar o desempenho. (Menos operações desnecessárias na interface do usuário => Melhor desempenho)

Nima G
fonte
20
Essa parte é óbvia. O que eu estava tentando entender é por que isso é apenas uma melhoria de desempenho quando o peso está envolvido?
Christopher Perry
185
O que é uma linha de base?
Matt
48
O termo linha de base vem de tipografia. São as letras de linha invisíveis no texto. pt.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany
12
Portanto, se é uma melhoria de desempenho, isso significa que o trabalho que normalmente é feito não está mais sendo feito. Quais são os efeitos colaterais disso? O trabalho que estamos evitando agora tem a capacidade de produzir resultados diferentes?
Lhunath 26/03
30
@lhunath de acordo com a documentação, o padrão está definido como true . isso força a linha de base de qualquer texto da interface do usuário a se alinhar. Por exemplo, pense nos botões, você tem dois botões com a mesma largura / altura na mesma linha, mas um deles tem um texto mais longo; por isso baselineAlined="true", o botão com texto mais longo pode acabar se movendo para alinhar seu texto com outros botões. Para um exemplo melhor, confira este post
Nima G 27/03
20

como android:baselineAligned="false" ajuda Pode não ser a resposta, mas ajuda a obter um conceito.

Acabei de conseguir obter 3 itens (ícone, texto, botão) centralizados verticalmente no LinearLayout horizontal.

Isso pode parecer simples, mas, na realidade, especificar android: gravity = "center_vertical" como o atributo LinearLayout não é suficiente - o ícone está centralizado, mas o texto e o botão não. Isso ocorre porque (presumivelmente) o texto tem uma linha de base e o algoritmo de centralização o utiliza em vez do centro vertical 'real'. Mas o que é pior - o botão (que vem ao lado do texto) é centralizado usando a linha de base do texto!

A especificação de android: baselineAligned = "false" em LinearLayout desativa isso e tudo é centralizado corretamente.

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

água fervida
fonte