前言:上一篇android View属性之dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent实在写不下去了,没想到Android事件机制还这么复杂,等那天彻底弄会了再来补充,现在开始下一篇讲解。
android View属性之onMeasure(int widthMeasureSpec, int heightMeasureSpec)
Measure顾名思义,就是测量,在view里作用是测量该控件的大小,在测量之前要了解MeasureSpec类的,分别是
3种模式UNSPECIFIED, EXACTLY和AT_MOST。和两个方法getMode,getSize
AT_MOST,specSize 代表的是最大可获得的空间(及你设置的参数为wrap_parent);
EXACTLY,specSize 代表的是精确的尺寸(及你在控件设置的时候设置的match_parent和具体数字);
UNSPECIFIED,对于控件尺寸来说,没有任何参考意义(几乎用不到)。
getMode获取模式
getSize获取设置的数字
在测量onMeasure函数传入的数字中就有这两种方法获取的值,大家应该会觉得奇怪,一个数怎么会有两种值呢
这里大家就自己看源码。我没看懂,只知道每个数字中含有两个值,用上面两个方法解析。
现在看看直接继承view不对控件做测量处理的效果
1,不管你是设置的match_parent还是wrap_parent都是占满父布局的空间
2,当你设置具体数字时候,显示具体大小
代码设置为:
android:layout_width="match_parent"
android:layout_height="wrap_content"
这个在最后一次执行是对的,不知道怎么回事
这个是对的
android:layout_width="200dp"
android:layout_height="wrap_content"
在这里View的onMesaure会执行4次,主要原因是viewGroup的原因,到讲viewgroup的时候再说原因
那么问题来了,我们在使用系统控件时候,我们设置为wrap_parent的时候它会根据内容显示相应大小,而不是占满全部父控件的区域,所以,在自定义控件如果是继承view的情况下要至少要对onMeasure的AT_MOST这个情况做处理,不然一个控件就直接占满啦,在最后填上这句话
setMeasuredDimension(widthSize, heightSize);
不然也没有效果,如果没有调用super的话,不填这句会报错