在onMeasure方法中,widthMeasureSpec跟HeightMeasureSpec不是简单的父布局传过来的宽高尺寸,而是将模式和尺寸组合在一起的数值。我们需要通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size =?MeasureSpec.getSize(widthMeasureSpec)得到尺寸。
首先我们来介绍一下MeasureSpec的Mode的三种模式:
1、MeasureSpec.EXACTLY 表示精准的,也就是在布局文件中如果设置了android:layout_width="150dp"或者
android:layout_height="match_parent"都表示精准的,也就是属于MeasureSpec.EXACTLY模式。2、MeasureSpec.AT_MOST表示至多的,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。3、MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
下面来介绍一下MeasureSpec.getSize的使用:
int size =?MeasureSpec.getSize(widthMeasureSpec)中size表示得到的是你布局文件中设置的宽高显示在屏幕上的像素宽高,然后如果想重新定义
控件的大小可以直接给size重新赋值,最后通过setMeasuredDimension(int, int)将你重新设置的宽高设置到屏幕上。下面我们看看代码
测试宽度match_parent属于那种Mode,并且match_parent在屏幕上显示的宽度为多大
Log日志
可以看出宽度match_parent属于MeasureSpec.AT_MOST,并且match_parent显示在屏幕上是1080px,倘若布局文件中宽度设置为200dp
,那么屏幕中显示的就不是1080px咯。