外观
如何理解请描述 View 的 measure 过程中 SpecMode 的三种类型及其含义?
标准回答
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。
内容来源
- Android · AI Agent 知识手册 · 原条目
2.1.1