Android View 绘制流程深度剖析
整体流程一览 ViewRootImpl.performTraversals() │ ├─── performMeasure() → View.measure() → onMeasure() │ ├─── performLayout() → View.layout() → onLayout() │ └─── performDraw() → View.draw() → onDraw() 一、Measure(测量) 核心机制 父 View 把测量约束封装进 MeasureSpec(一个 32 位 int,高 2 位是模式,低 30 位是尺寸)传给子 View,子 View 在 onMeasure() 中根据约束计算自己的期望尺寸,最后调用 setMeasuredDimension() 提交结果。 三种模式: 模式 含义 典型来源 EXACTLY 精确值,例如 100dp 或 match_parent 父有确定尺寸 AT_MOST 不超过某个上限,例如 wrap_content 父允许子自由伸缩 UNSPECIFIED 没有限制,ScrollView 内的子 View 父不关心大小 wrap_content 失效 这是自定义 View 最高频的 bug。如果自定义 View 继承自 View(而非 TextView 等),不重写 onMeasure,它默认调用父类实现,而父类对 AT_MOST 和 EXACTLY 的处理是一样的——直接使用父传来的 size,效果等同于 match_parent。 ...