Как установка baselineAligned в false улучшает производительность в LinearLayout? - PullRequest
202 голосов
/ 17 февраля 2012

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

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

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

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

Ответы [ 3 ]

153 голосов
/ 17 февраля 2012

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

19 голосов
/ 14 июля 2014

как android:baselineAligned="false" помочь. Возможно, это не ответ, но поможет понять концепцию.

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

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

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

14 голосов
/ 19 ноября 2013
// 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

...