2012-02-16 28 views
180

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

对于加入这一警告皮棉变化的文档说

布局表现:查找LinearLayouts配重块,你应该 集机器人:baselineAligned =“假”获得更好的性能,同时还 发现情况你有嵌套的权重,这可能会导致性能 问题。

有人可以解释为什么这会提高性能,特别是当涉及重量?

回答

138

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

+14

那部分是显而易见的。我想知道的是,为什么只有在涉及重量的情况下才能提高性能? – 2012-02-17 02:02:44

+3

因为当涉及权重时,linearlayout只需要计算基线。它像一个聪明的功能,实际上可能会很烦人。 – Warpzit 2012-02-23 08:33:41

+163

什么是基线? – Matthew 2012-07-17 19:51:42

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

15

如何android:baselineAligned="false"帮助。这可能不是答案,但有助于理解。

我刚刚在水平LinearLayout中垂直居中得到3个项目(图标,文字,按钮)居中 。

这可能看似简单,但在现实中指定 机器人:重力=“center_vertical”为的LinearLayout属性不是 足够 - 图标为中心,但文本和按钮都没有。这是 ,因为(假定)文本具有基线,并且居中算法 使用它而不是“真实”垂直中心。但更糟糕的是 - 按钮 (它紧挨着文本)使用文本的基线居中!

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