View通过MeasureSpac类来测量大小。MeasureSpec是一个32位的int值,其中高2位为测量的模式,低30位为测量的大小。MeasureSpec.getMode(measureSpec)这个方法获取测量的模式。MeasureSpec.getSize(measureSpec)获取测量的数值。
测量的模式
测量模式分为三种:EXACTLY、AT_MOST、UNSPECIFIED。
EXACTLY:
精确模式,当layout_width或layout_height指定为match_parent或者指定具体数值时使用。
AT_MOST:
最大模式,当layout_width或layout_height指定为wrap_content时使用。控件大小随子空间变化。
UNSPECIFIED:
不指定其大小测量模式,一般在绘制自定义View时使用。
在自定义控件中使用了父类View.Java中的onMeasure方法来测量大小。VIew中使用setMeasuredDimension来设置测量大小。
getDefaultSize中根据不同的模式进行大小设置。如果是EXACTLY模式返回传入的大小。如果是AT_MOST和UNSPECIFIED返回getSuggestedMinimumWidth()或者是getSuggestedMinimumHeight()。
源码如下:
getSuggestedMinimumWidth()和getSuggestedMinimumHeight(),如果VIew没有背景就返回最小值,如果有背景则返回背景大小和VIew大小中的较大值。解释的不好还是看代码比较直观。
在使用自定义控件时很多时候要重写onMeasure方法来返回更准确的大小数值。在自定义控件中宽高属性设置为wrap_content,如果不重写onMeasure()方法,系统就会默认填充整个父布局。如果自定义控件继承自TextView等一些基础的控件时,可以不用再重写,因为在这些自定义控件中已经重写了onMeasure方法。