自定义控件MeasureSpecs与measure的理解

来源:互联网 发布:如何判断矩阵可逆 编辑:程序博客网 时间:2024/06/05 18:11

MeasureSpace 是android中父view传递给子view的用来描述对子 view布局需求的数据类型,也就是说父布局把它希view的大小以及变化的尺度分装在这个类里,而子view的measure()方法拿到这个数值,则会根据这个数值对自身进行测量。

1.UNSPECIFIED :父试图不对子试图有任何的约束,它可以达到这几所需要的尺寸大小,例如:ListView,ScrollView等,一般在我们在自定义控件中不会用到这个测量模式的。

2.EXACTLY:父视图指定了确切的大小,无论子视图指定多大的尺寸,子视图必须在父视图指定的大小范围内,对应的属性为match_parent或者具体的值,父控件可以通过MeasureSpec.getSize(measureSpec)直接得到子控件的尺寸。

3.AT_MOST:父控件为子控件指定一个最大尺寸,子视图必须确保自己的孩子视图可以适应在该尺寸范围内,对应的属性为wrap_content,这种模式下父控件无法测量子view的大小,只能由子控件自己根据需求去计算自己的尺寸,这种模式就是我们自定义视图需要实现测量逻辑的情况。

Measure是对控件的大小的一个测量,

OnMeasure(intwidthMeasureSpec, int  heightMeasureSpec)该方法就是我们自定义控件中测量逻辑的方法,该方法中的参数是父view传递给子view测量width与height大小的要求。在我们自定义视图中,要做的就是根据widthMeasureSpec与heightMeasureSpec进行对view宽高的一个测量,不同的测量模式,测量的逻辑是不同的。

setMeasuredDimension()是对测量后的值的一个回传,我们只需要在onMeasure()中调用这方法把测量后的值传递进去,这样测量的任务就算结束了。