int size; // 为父View的大小-(自己的Padding+子View的Margin,可能还有sizeUsed),这些值计算后的值
switch (specMode) {
//1、父View是EXACTLY的 !
case MeasureSpec.EXACTLY:
1)子View的width或height是个精确值(childDimension >= 0)
resultSize = childDimension; //子View的lp.width或lp.height为精确值
resultMode = MeasureSpec.EXACTLY; //mode为 EXACTLY
2)子View的宽高是MATCH_PARENT
resultSize = size;
resultMode = MeasureSpec.EXACTLY; //mode为 EXACTLY
3)子View的宽高是WRAP_CONTENT
// 子View想自己决定大小,但是它不能超过计算出的size
// 在这还不知道具体子View的大小是多少,要等到child.measure()时,才真正测量子View自己
// content的大小
resultSize = size; //size为父视图大小
resultMode = MeasureSpec.AT_MOST; //mode为AT_MOST
break;
//2、父View是AT_MOST的 !
case MeasureSpec.AT_MOST:
1)子View的width或height是个精确值(childDimension >= 0)
resultSize = childDimension; //子View的lp.width或lp.height为精确值
resultMode = MeasureSpec.EXACTLY; //mode为 EXACTLY
2)子View的宽高是MATCH_PARENT
// 由于父View自己的大小不确定,那么子View即使充满父容器大小也是不确定的,只知道最大为父
// View大小
resultSize = size; //size为父视图大小
resultMode = MeasureSpec.AT_MOST; //mode为AT_MOST
3)子View的宽高是WRAP_CONTENT
// 子View是WRAP_CONTENT,那么在子View的Content没算出大小之前,子View只能最大为父View
// 的大小
resultSize = size; //size为父视图大小
resultMode = MeasureSpec.AT_MOST; //mode为AT_MOST
break;
//3、父View是UNSPECIFIED的 !
case MeasureSpec.UNSPECIFIED:
1)子View的width或height是个精确值(childDimension >= 0)
resultSize = childDimension; //size为精确值
resultMode = MeasureSpec.EXACTLY; //mode为 EXACTLY
2)子View的宽高是MATCH_PARENT
resultSize = 0; //size为0! ,其值未定
resultMode = MeasureSpec.UNSPECIFIED; //mode为 UNSPECIFIED
3)子View的宽高是WRAP_CONTENT
resultSize = 0; //size为0! ,其值未定
resultMode = MeasureSpec.UNSPECIFIED; //mode为 UNSPECIFIED
break;
}
//根据上面逻辑条件获取的mode和size构建MeasureSpec对象。
return MeasureSpec.makeMeasureSpec(resultSize, resultMode);
// 规则转换为表,如下
parentSpecMode EXACTLY AT_MOST UNSPECIFIED
--------------
chlidLayoutParams
EXACTLY EXACTLY EXACTLY
dp/px childSize childSize childSize
EXACTLY AT_MOST UNSPECIFIED
match_parent parentSize parentSize 0
AT_MOST AT_MOST UNSPECIFIED
wrap_content parentSize parentSize 0
分析measure
最新推荐文章于 2021-10-17 19:22:14 发布