一个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的值。