解析ConstraintLayout的性能优势
—— 如果你想做一项长期工作,首先得拥有一个健康的身体。
自从在2016年的 Google I/O 大会上发布 ConstraintLayout 以来,我们一直不断改进该布局的稳定性,完善对布局编辑器的支持。我们还针对 ConstraintLayout 增加了一些新功能,帮助您构建不同类型的布局,例如引入链和按比例设置大小。
除了这些功能之外,使用 ConstraintLayout 还可以获得一项显著的性能优势。在本文中,我们将向您介绍如何从这些性能改进中获益。
Android 如何绘制视图?
为了更好地理解 ConstraintLayout 的性能,我们先回过头来看看 Android 如何绘制视图。
当用户将某个 Android 视图作为焦点时,Android 框架会指示该视图进行自我绘制。这个绘制过程包括 3 个阶段:
1. 测量
系统自顶向下遍历视图树,以确定每个 ViewGroup 和 View 元素应当有多大。在测量 ViewGroup 的同时也会测量其子对象。
2. 布局
系统执行另一个自顶向下的遍历操作,每个 ViewGroup 都根据测量阶段中所确定的大小来确定其子对象的位置。
3. 绘制
系统再次执行一个自顶向下的遍历操作。对于视图树中的每个对象,系统会为其创建一个 Canvas 对象,以便向 GPU 发送一个绘制命令列表。这些命令包含系统在前面 2 个阶段中确定的 ViewGroup 和 View 对象的大小和位置。

绘制过程中的每个阶段都需要对视图树执行一次自顶向下的遍历操作。因此,视图层次结构中嵌入(或嵌套)的视图越多,设备绘制视图所需的时间和计算功耗也就越多。通过在 Android 应用布局中保持扁平的层次结构,您可以为应用创建响应快速而灵敏的界面。
传统布局层次结构的开销
请牢记上述解释,下面我们来创建一个使用 LinearLayout 和 RelativeLayout 对象的传统布局层次结构。
假设我们想构建一个像上图那样的布局。如果您使用传统布局来构建,XML 文件可能会包含类似于下面这样的元素层次结构(在本例中,我们忽略属性):
<RelativeLayout> <ImageView /> <ImageView /> <RelativeLayout> <TextView /> <LinearLayout> <TextView /> <EditText /> </LinearLayout> <LinearLayout> <TextView /> <EditText /> </LinearLayout> <TextView /> </RelativeLayout> <LinearLayout > <Button /> <Button /> </LinearLayout> </RelativeLayout>
ConstraintLayout 对象的优势
如果您使用 ConstraintLayout 来构建相同的布局,XML 文件可能会包含类似于下面这样的元素层次结构(再次忽略属性):
<android.support.constraint.ConstraintLayout> <ImageView /> <ImageView /> <TextView /> <EditText /> <TextView /> <TextView /> <EditText /> <Button /> <Button /> <TextView /> </android.support.constraint.ConstraintLayout>
现在,该布局拥有一个完全扁平的层次结构。ConstraintLayout比传统布局的性能更出色。不仅如此,ConstraintLayout 还具备其他一些功能,能够帮助您构建复杂的高性能布局。我们建议您在设计应用布局时使用 ConstraintLayout。在过去,几乎所有情形下,您都需要一个深度嵌套的布局,因此,ConstraintLayout 应当成为您优化性能和易用性的不二之选。
------转载请注明出处,感谢您对原创作者的支持------
有偿提供技术支持、Bug修复、项目外包、毕业设计、大小作业
Android学习小站
Q Q:1095817610
微信:jx-helu
邮箱:1095817610@qq.com
添加请备注"Android学习小站"
