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


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

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

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

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

3 191

3 ответа:

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

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

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

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

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

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