一個MeasureSpec封裝了父佈局傳遞給子佈局的佈局要求,每一個MeasureSpec表明了一組寬度和高度的要求。一個MeasureSpec有大小和模式組成。他有三種模式:html
UNSPECIFIED 未指定 父元素不對字元素施加任何束縛,子元素能夠獲得任意想要的大小。函數
EXACTLY 徹底 父元素決定自元素的大小,子元素將被限定在給定的邊界裏而忽略它自己的大小。佈局
AT_MOST 至多 子元素多達到指定大小的值spa
它經常使用的三個函數:.net
static int getMode(int measureSpec)根據提供的測量值(格式)提取模式(上述三個模式之一)code
static int getSize(int measureSpec)根據提供的測量值(格式)提取大小值(這個大小也就是咱們一般所說的大小)xml
static int makeMeasureSpec(int size,int mode):根據提供的大小值和模式建立一個測量值(格式)htm
首先一個咱們經常使用到的一個有用的函數,View.resolveSize(int size,int measureSpec)blog
9023 public static int makeMeasureSpec(int size, int mode) { 9024 return size + mode; 9025 }
注意,使用EXACTLY和AT_MOST一般是同樣的效果,若是你要區別他們,那麼你就要使用上面的函數View.resolveSize(int size,int measureSpec)返回一個size值,而後使用你的view調用setMeasuredDimension(int,int)函數。ip
8406 protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) { 8407 mMeasuredWidth = measuredWidth; 8408 mMeasuredHeight = measuredHeight; 8409 8410 mPrivateFlags |= MEASURED_DIMENSION_SET; 8411 }
而後你調用view.getMeasuredWidth,view.getMeasuredHeigth 返回的就是上面函數裏的mMeasuredWidth,mMeasuredHeight的值。