Как установка baselineAligned в false улучшает производительность в LinearLayout?

218

Я просто создавал некоторый пользовательский интерфейс в xml, и Lint предупредил меня и сказал установить для android: baselineAligned значение false, чтобы повысить производительность в ListView.

Документы для изменений Lint, которые добавили это предупреждение, говорят

Производительность макета: находит LinearLayouts с весами, где вы должны установить android: baselineAligned = "false" для повышения производительности, а также находит случаи, когда у вас есть вложенные веса, которые могут вызвать проблемы с производительностью.

Может кто-нибудь объяснить, почему это улучшает производительность, особенно когда речь идет о весе?

Кристофер Перри
источник

Ответы:

165

Установив android:baselineAligned="false", вы предотвращаете дополнительную работу, которую должен выполнять макет вашего приложения, чтобы выровнять базовые уровни своих детей; что, очевидно, может увеличить производительность. (Меньше ненужных операций в пользовательском интерфейсе => Лучшая производительность)

Нима Г
источник
20
Эта часть очевидна. То, к чему я стремился, это то, почему это только улучшение производительности, когда задействован вес?
Кристофер Перри
185
Что такое базовый уровень?
Мэтт
48
Термин базовый уровень происходит от типографии. Это невидимые строчки букв в тексте сидят на. ru.wikipedia.org/wiki/Baseline_%28typography%29
Жолт Сафрани,
12
Так что, если это улучшение производительности, это означает, что обычно выполняемая работа больше не выполняется. Каковы побочные эффекты этого? Может ли работа, которую мы сейчас избегаем, давать разные результаты?
июня
30
@lhunath в соответствии с документацией, по умолчанию установлено значение true . это заставляет базовую линию любого текста пользовательского интерфейса выравниваться друг с другом. Например, подумайте о кнопках, у вас есть две кнопки с одинаковой шириной / высотой на одной строке, но одна из них имеет более длинный текст, потому baselineAlined="true"что кнопка с более длинным текстом может в конечном итоге перемещаться, чтобы выровнять ее текст с другими кнопками. Для лучшего примера, проверьте этот пост
Nima G
20

как android:baselineAligned="false" помочь Это может быть не ответ, но поможет получить концепцию.

Мне только что удалось получить 3 элемента (иконка, текст, кнопка) по центру вертикально по горизонтали LinearLayout.

Это может показаться простым, но в действительности указание android: gravity = "center_vertical" в качестве атрибута LinearLayout недостаточно - значок находится по центру, а текст и кнопка - нет. Это связано с тем, что (предположительно) текст имеет базовую линию, а алгоритм центрирования использует его вместо «реального» вертикального центра. Но что еще хуже - кнопка (которая идет рядом с текстом) центрируется с использованием базовой линии текста!

Указание android: baselineAligned = "false" в LinearLayout отключает это, и все центрируется правильно.

Zar E Ahmer
источник
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

кипяченая вода
источник