Як встановлення baselineAligned to false підвищує продуктивність у LinearLayout?


218

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

Документи про зміни в Lint, які додали це попередження, кажуть

Ефективність макета: Знаходить LinearLayouts з вагами, де слід встановити android: baselineAligned = "false" для кращої продуктивності, а також знаходить випадки, коли ви вклали ваги, які можуть спричинити проблеми з продуктивністю.

Хтось може пояснити, чому це покращує працездатність, зокрема, коли йдеться про вагу?

Відповіді:


165

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


20
Ця частина очевидна. Що я намагався досягти, це те, чому це лише покращення працездатності, коли бере участь вага?
Крістофер Перрі

185
Що таке базовий рівень?
Метт

48
Термін базовий рівень походить від типографії. Це невидимі літери рядка в тексті. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany

12
Тож якщо це покращення продуктивності, це означає, що робота, яка зазвичай робиться, більше не виконується. Які побічні ефекти від цього? Чи здатна робота, яку ми зараз уникаємо, дати різні результати?
lhunath

30
@lhunath згідно з документацією, за замовчуванням встановлено значення true . це змушує базову лінію будь-якого тексту інтерфейсу вирівнятись між собою. Наприклад, подумайте про кнопки, вам подобаються дві кнопки з однаковою шириною / висотою на одному рядку, але одна з них має довший текст, тому baselineAlined="true"що кнопка з довшим текстом може пересуватися, щоб вирівняти текст з іншими кнопками. Для кращого прикладу ознайомтеся з цією публікацією
Nima G

20

як android:baselineAligned="false" допомогти. Це може бути не відповіддю, але допоможе отримати концепцію.

Щойно мені вдалося отримати 3 елементи (піктограму, текст, кнопку) по центру вертикально в горизонтальній лінії LinearLayout.

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

Вказівка ​​android: baselineAligned = "false" у LinearLayout вимикає це, і все центрирується правильно.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.