Skip to content
阅读进度

如何理解请描述 View 的 measure 过程中 SpecMode 的三种类型及其含义? ​

返回 View 与显示链路 目录

标准回答 ​

MeasureSpec 有三种模式:EXACTLY(精确尺寸,使用给定大小)、AT_MOST(最大尺寸,不能超过给定大小)、UNSPECIFIED(该方向未给出尺寸限制)。它们由父容器根据自身约束和子 View 的 LayoutParams 计算。

**如何读出来:**用 MeasureSpec.getMode(spec) 读取模式,getSize(spec) 读取尺寸;onMeasure 中据此选择测量结果,最后调用 setMeasuredDimension。wrap_content 不在所有父容器下都等于 AT_MOST。

通俗例子 ​

按钮收到 EXACTLY 200px,就按指定尺寸测量;收到 AT_MOST 200px,可以小一些但不能越界;UNSPECIFIED 则要按自身策略决定。

深入解释 ​

**谁给谁提要求:**父 ViewGroup 在测量子 View 时,结合自己的空间、子项 LayoutParams 和布局规则,计算一个包含模式与尺寸的 MeasureSpec。子 View 据此决定测量尺寸。

**三个模式怎么落地:**EXACTLY 要按给定尺寸;AT_MOST 不得超过给定上限;UNSPECIFIED 不由这份约束给出常规上限。它们不与 match_parent、wrap_content 简单一一对应,还要看父布局。

易混淆点 ​

不能把布局参数与 MeasureSpec 做无条件一一对应;要看父级如何生成 spec。

内容来源 ​

用完整回答理解机制,用真实证据解释项目。