ConstraintLayout为什么效率更高

为什么效率高

ConstraintLayout 为什么效率更高?它到底优化了什么?

ConstraintLayout 通过一次测量完成所有子 View 的定位和尺寸计算,避免了 RelativeLayout 的多轮测量、依赖排序、测量优化失效等问题,同时引入了一个高效的约束求解器(linear solver)来解决布局关系,整体性能更优、结构更扁平、可维护性更强。

相比 RelativeLayout,ConstraintLayout 有以下关键优势:

1.一次测量(One Pass Layout)

RelativeLayout:

  • 由于子 View 可以相互依赖(A 在 B 右边,B 在 A 下方),必须:

    • 横向依赖图 → 测一次;
    • 纵向依赖图 → 再测一次;
  • ➤ 至少两轮测量,每个子 View measure() 最多走两遍,影响性能;

  • 并且可能破坏 measure() 优化路径。

ConstraintLayout:

  • 利用 约束求解器,把所有依赖关系建成一个线性方程组;
  • 一次求解,全部出结果;
  • ➤ 子 View 只需 measure() 一次,不会被重复测量
  • 这点在有大量子 View(如 CardView、ImageView、TextView 等)时,优势极大。

2. 扁平化布局结构

RelativeLayout:

  • 有依赖但无嵌套能力;
  • 嵌套复杂布局容易层层 RelativeLayout;
  • ➤ 增加 View 层级,增加测量/布局/绘制成本。

ConstraintLayout:

  • 可以实现相对位置、对齐、比例、基线等复杂关系
  • 不需要嵌套布局
  • ➤ 一个 ConstraintLayout 可能代替多层嵌套 Linear + Relative;
  • ✔️ 扁平结构对性能、可维护性、动画友好度都有帮助。

3.避免 measure 优化失效

RelativeLayout:

  • 两轮测量容易传递不同 MeasureSpec;
  • 子 View 无法命中 measure() 缓存 → 多次测量。

ConstraintLayout:

  • 全部依赖一次求解;
  • 所有子 View 在一次 pass 中测完,MeasureSpec 稳定
  • ➤ 优化路径能生效,节省 CPU。

4.内置优化机制(例如虚拟布局)

  • ConstraintLayout 支持:

    • Guideline、Barrier、Group、Flow 等虚拟辅助 View;
    • 这些虚拟 View 不会参与绘制,也不额外消耗布局 pass;
    • ➤ 灵活又高效,减少物理 View 数量。

5.权威对比结论(来自 Android 官方)

“在典型场景中,使用 ConstraintLayout 替代嵌套 LinearLayout + RelativeLayout,onMeasure() 次数可以减少 30%~50%,渲染时间显著降低。”

来源:[官方文档 + Google I/O 讲解 + AOSP 工程实践]


RelativeLayout 的缺点本质上是:

问题 描述
多轮测量 横 + 纵必须分开处理,子 View 会被多次测量
优化失效 子 View 的 margin、依赖路径可能破坏 MeasureSpec 缓存
不支持嵌套关系 复杂布局必须通过嵌套实现,层级加深
维护性差 难以支持动画、过渡、复杂规则
不支持虚拟 View 所有布局节点都是真实 View,有性能开销

最后总结

对比项 RelativeLayout ConstraintLayout
测量次数 多轮 一次
子 View 重复测量 可能 避免
View 层级 容易嵌套 扁平
维护难度 中高
动画支持 不友好 更好
性能表现 更优 ✔️

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器