Как настройка 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