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

229

我刚在xml中构建一些UI元素时,Lint给了我一个警告,建议将android:baselineAligned设置为false以提高ListView的性能。

添加此警告的Lint更改文档说明如下

 

布局性能:查找LinearLayouts中带有权重的情况,您应该将android:baselineAligned="false"设置为获得更好的性能,并且还会查找嵌套权重可能导致性能问题的情况。

有人能解释一下为什么这样做可以提高性能,特别是当涉及到权重时?

3个回答

175
通过设置 android:baselineAligned="false" ,您可以防止应用程序布局必须执行的额外工作,以使其子项的基线对齐; 这显然可以提高性能。(UI上减少不必要的操作=> 更好的性能)

23
那个部分很明显。我想要表达的是为什么只有涉及重量时才会有性能提升? - Christopher Perry
52
“Baseline”一词来自于印刷排版术语,指的是文字中不可见的线条,用于支撑文本中的字母。详情请参考维基百科:http://en.wikipedia.org/wiki/Baseline_%28typography%29 - Zsolt Safrany
12
如果这是一种性能改进,那么意味着通常要做的工作不再需要做了。这样做会有哪些副作用?我们现在避免的工作是否具有产生不同结果的能力? - lhunath
31
根据文档,缺省值被设定为“true”,这将强制所有UI文本的基线对齐。例如,考虑两个按钮在同一行上具有相同的宽度/高度,但其中一个按钮具有更长的文本。由于“baselineAligned = true”,具有更长文本的按钮可能会移动以与其他按钮的文本对齐。请查看此帖子以获得更好的例子。 - Nima GT
8
这里是可视化解决方案!https://dev59.com/dFwY5IYBdhLWcg3wCD6W#38007282 - Sjd
显示剩余4条评论

22

android:baselineAligned="false"如何帮助呢?这不一定是答案,但有助于理解概念。

我刚刚成功使得在水平LinearLayout中垂直居中3个元素(图标、文本和按钮)。

这看起来可能很简单,但实际上,指定LinearLayout属性为android:gravity="center_vertical"是不够的 - 图标被居中了,但文本和按钮没有。这是因为(可能是)文本有一个基线,而居中算法使用它来代替“真正”的垂直中心。但更糟糕的是,按钮(紧跟着文本)使用文本的基线居中!

在LinearLayout中指定android:baselineAligned="false"可以关闭此功能,然后一切都会正确居中。


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接