1、我们都知道自定义view经常要重新protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法,我们都知道这个方法就是来测试view的大小的,那你真的了解widthMeasureSpec,heightMeasureSpec参数的意义吗?反正我是看了好多材料才了解,以下是我的看法 .
MeasureSpec 是android中父view传递给子view的用来描述对子 view布局需求的数据类型,也就是说父布局会根据父布局控件以及当前view的大小以及变化的尺度分装在这个类里,而子view的measure()方法拿到这个数值,则会根据这个数值对自身进行测量。改值包含父布局希望你显示的大小size,以及父布局希望你显示的模式,(请注意,这个值是根据父布局的layout_width/height,以及自定义view的layout_width,height得到出来的希望你这个自定义view要显示的大小和模式, 这个我查了好久以及看了源码理解了几遍才明白)
MeasureSpec值有以下几个:
1.UNSPECIFIED :父试图不对子试图有任何的约束,它可以达到这几所需要的尺寸大小,例如:ListView,ScrollView等,一般在我们在自定义控件中不会用到这个测量模式的。
2.EXACTLY:父视图指定了确切的大小,无论子视图指定多大的尺寸,子视图必须在父视图指定的大小范围内,对应的属性为match_parent或者具体的值,父控件可以通过MeasureSpec.getSize(measureSpec)直接得到子控件的尺寸。(当然自定义view你可以不用父容器建议你用的大小,你完成可以重写,只是也没多少意义,想象下,我规定你只能使用500px,你自己使用了600px,本质上显示出来最多也只是500,还是在这区域内,但是实际上拿到的view的宽是600,及显示还是500(还是在父容器控制内,逃不出五指山,因此你当遇到EXACTLY, 你 也没必要在定义大小了,挣扎啥呢。。。))
3.AT_MOST:父控件为子控件指定一个最大尺寸,子视图必须确保自己的孩子视图可以适应在该尺寸范围内,对应的属性为wrap_content,这种模式下父控件无法测量子view的大小,只能由子控件自己根据需求去计算自己的尺寸,这种模式就是我们自定义视图需要实现测量逻辑的情况。这就是大部分要重写onMeasure处理的过程,在wrap_content模式下,自定义view要显示多大,还是说显示父容器显示的大小,这个由你控制)
总结: OnMeasure(int widthMeasureSpec, int heightMeasureSpec)该方法就是我们自定义控件中测量逻辑的方法,该方法中的参数是父view传递给子view测量width与height大小的要求。在我们自定义视图中,要做的就是根据widthMeasureSpec与heightMeasureSpec进行对view宽高的一个测量,不同的测量模式,测量的逻辑是不同的。
setMeasuredDimension()是对测量后的值的一个回传,我们只需要在onMeasure()中调用这方法把测量后的值传递进去,这样测量的任务就算结束了
学习文章: https://www.jianshu.com/p/f951d9089b27
https://www.jb51.net/article/122887.htm