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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

Указание андроида: baselineAligned = "false" в LinearLayout превращает это и все правильно настроено.

Ответ 3

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