分析measure

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huidev/article/details/88285965
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);

参考 https://www.jianshu.com/p/5a71014e7b1b

猜你喜欢

转载自blog.csdn.net/huidev/article/details/88285965