publicstaticint getChildMeasureSpec(int spec,int padding,int childDimension){ int specMode =MeasureSpec.getMode(spec); int specSize =MeasureSpec.getSize(spec);
int size =Math.max(0, specSize - padding);
int resultSize =0; int resultMode =0;
switch(specMode){ // Parent has imposed an exact size on us caseMeasureSpec.EXACTLY: if(childDimension >=0){ resultSize = childDimension; resultMode =MeasureSpec.EXACTLY; }elseif(childDimension ==LayoutParams.MATCH_PARENT){ // Child wants to be our size. So be it. resultSize = size; resultMode =MeasureSpec.EXACTLY; }elseif(childDimension ==LayoutParams.WRAP_CONTENT){ // Child wants to determine its own size. It can't be // bigger than us. resultSize = size; resultMode =MeasureSpec.AT_MOST; } break;
// Parent has imposed a maximum size on us caseMeasureSpec.AT_MOST: if(childDimension >=0){ // Child wants a specific size... so be it resultSize = childDimension; resultMode =MeasureSpec.EXACTLY; }elseif(childDimension ==LayoutParams.MATCH_PARENT){ // Child wants to be our size, but our size is not fixed. // Constrain child to not be bigger than us. resultSize = size; resultMode =MeasureSpec.AT_MOST; }elseif(childDimension ==LayoutParams.WRAP_CONTENT){ // Child wants to determine its own size. It can't be // bigger than us. resultSize = size; resultMode =MeasureSpec.AT_MOST; } break;
// Parent asked to see how big we want to be caseMeasureSpec.UNSPECIFIED: if(childDimension >=0){ // Child wants a specific size... let him have it resultSize = childDimension; resultMode =MeasureSpec.EXACTLY; }elseif(childDimension ==LayoutParams.MATCH_PARENT){ // Child wants to be our size... find out how big it should // be resultSize =View.sUseZeroUnspecifiedMeasureSpec ?0: size; resultMode =MeasureSpec.UNSPECIFIED; }elseif(childDimension ==LayoutParams.WRAP_CONTENT){ // Child wants to determine its own size.... find out how // big it should be resultSize =View.sUseZeroUnspecifiedMeasureSpec ?0: size; resultMode =MeasureSpec.UNSPECIFIED; } break; } returnMeasureSpec.makeMeasureSpec(resultSize, resultMode); }