MeasureSpec.UNSPECIFIED //無限制
case MeasureSpec.EXACTLY://限制固定值/match_parent或者具體數值
MeasureSpec.AT_MOST://限制上限具體值/wrap_content
int measureWidth = getMeasuredWidth(); int measureHeight = getMeasuredHeight(); //寬 int widthSize = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); //高 int heightSize = MeasureSpec.getSize(heightMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); switch (widthMode){ case MeasureSpec.EXACTLY://限制固定值 measureWidth = widthSize; break; case MeasureSpec.AT_MOST://限制上限具體值 break; case MeasureSpec.UNSPECIFIED: break;
2.get
for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); int childMeasureSpec; LayoutParams params = (LayoutParams) childView.getLayoutParams(); int selfHeightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int selfHeightSpecSize = MeasureSpec.getSize(heightMeasureSpec); switch (params.height){ case ViewGroup.LayoutParams.WRAP_CONTENT: if (selfHeightSpecMode == MeasureSpec.EXACTLY || selfHeightSpecMode == MeasureSpec.AT_MOST){ childMeasureSpec = MeasureSpec.makeMeasureSpec(selfHeightSpecSize,MeasureSpec.AT_MOST); } else { childMeasureSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED); } break; //父view的可用高度,怎麼計算? case LayoutParams.MATCH_PARENT: if (selfHeightSpecMode == MeasureSpec.EXACTLY || selfHeightSpecMode == MeasureSpec.AT_MOST){ childMeasureSpec = MeasureSpec.makeMeasureSpec(selfHeightSpecSize,MeasureSpec.EXACTLY); } else { childMeasureSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED); } break; default: childMeasureSpec = MeasureSpec.makeMeasureSpec(params.height,MeasureSpec.EXACTLY); break; } childView.measure(widthMeasureSpec,childMeasureSpec); scrollHeight = scrollHeight +childView.getMeasuredHeight(); CCLog.e("scrollHeight",scrollHeight); //super.onMeasure(widthMeasureSpec, scrollHeight); //setMeasuredDimension(getMeasuredWidth(), scrollHeight); }