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

Posted

技术标签:

【中文标题】将baselineAligned设置为false如何提高LinearLayout的性能?【英文标题】:How does setting baselineAligned to false improve performance in LinearLayout? 【发布时间】:2012-03-08 08:39:39 【问题描述】:

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

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

布局性能:查找具有权重的线性布局 设置 android:baselineAligned="false" 以获得更好的性能,并且 查找可能导致性能的嵌套权重的情况 问题。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

那部分很明显。我试图理解的是,为什么这只是涉及重量时的性能改进? 基线一词来源于排版。它是文本中不可见的行字母。 en.wikipedia.org/wiki/Baseline_%28typography%29 因此,如果它是一种性能改进,这意味着通常完成的工作将不再完成。这有什么副作用?我们现在避免的工作是否有能力产生不同的结果? @lhunath 根据文档,默认设置为 true。这会强制任何 UI 文本的基线相互对齐。例如考虑按钮,您在同一行上有两个宽度/高度相同的按钮,但其中一个的文本较长,因为baselineAlined="true",文本较长的按钮最终可能会四处移动以使其文本与其他按钮。如需更好的示例,请查看this post 这里是视觉解决方案! ***.com/a/38007282/2959200【参考方案2】:

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

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

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

在 LinearLayout 中指定 android:baselineAligned="false" 会变成这样 关闭,一切都正确居中。

【讨论】:

【参考方案3】:
// 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

【讨论】:

以上是关于将baselineAligned设置为false如何提高LinearLayout的性能?的主要内容,如果未能解决你的问题,请参考以下文章

将按钮设置为disable之后同样会触发onclick时间,请问有没有啥解决方案?

将整个 bool[] 设置为 false [重复]

如何将 modalView 设置为 false?

如何将会话 cookie 的 HttpOnly 设置为 false?

ConfigureAwait(false) 与将同步上下文设置为 null

尝试使用java中的变量将对象设置为true或false