如何将baselineAligned设置为false,如何提高LinearLayout的性能?


218

我只是在xml中构建一些UI,Lint给了我一个警告,并说将android:baselineAligned设置为false以提高ListView的性能。

Lint更改的文档添加了此警告,说

布局性能:查找具有权重的LinearLayouts,应在其中设置android:baselineAligned =“ false”以获得更好的性能,并查找嵌套权重会导致性能问题的情况。

有人可以解释为什么这样做可以改善性能,特别是在涉及体重时?

Answers:


165

通过设置android:baselineAligned="false",您可以避免应用程序的布局为对齐子级基线而要做的额外工作;可以明显提高性能。(在UI上减少了不必要的操作=>更好的性能)


20
那部分是显而易见的。我要尝试得出的是为什么只有体重减轻才可以改善性能?
Christopher Perry '02

185
什么是基线?
马特

48
基线一词来自印刷术。这是文本中看不见的字母。en.wikipedia.org/wiki/Baseline_%28typography%29
索尔特Safrany

12
因此,如果要提高性能,那就意味着不再需要完成正常的工作。这有什么副作用?我们现在要避免的工作是否具有产生不同结果的能力?
lhunath

30
@lhunath根据文档,默认设置为true。这会强制使任何UI文本的基线彼此对齐。例如,考虑一下按钮,您就像在同一行上有两个具有相同宽度/高度的按钮,但是其中一个具有较长的文本,因为baselineAlined="true",具有较长文本的按钮最终可能会移动以将其文本与其他按钮对齐。有关更好的示例,请查看此帖子
Nima G

20

有什么android:baselineAligned="false" 帮助。这可能不是答案,但有助于获得概念。

我刚刚设法在水平LinearLayout中垂直居中放置了3个项目(图标,文本,按钮)。

这看似简单,但实际上将android:gravity =“ center_vertical”指定为LinearLayout属性是不够的-图标居中,但文本和按钮不足。这是因为(大概)文本具有基线,并且居中算法使用它而不是“实际”垂直居中。但是,更糟糕的是-按钮(位于文本旁边)使用文本的基线居中!

在LinearLayout中指定android:baselineAligned =“ false”可以将其关闭,并且所有内容均可正确居中。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.