
上QQ阅读APP看书,第一时间看更新
3.2 自定义ViewGroup
自定义ViewGroup也不是很复杂,它的思路大致如下:
1)测量它的每个子View的大小,才能算出自己本身容量需要多少才能容纳它们;
2)根据实际需求来设置每个子View的分布位置;
3)最后重写触摸事件方法以及其他方法。
下面创建一个MyPingredViewGroup类,并重写它的onMeasure()方法:


代码虽比较多,但理解起来不难,分别根据不同的包含内容情况去计算最终宽度和高度值。把子View的大小和ViewGroup的大小都测量好后,就需要来分布它们,通过重写onLayout()方法来实现:

这里要注意的是onLayout()方法中4个参数分别是代表左、上、右、下的值,是ViewGroup相对于其父View的位置参数,而当childView调用layout()方法时传进去的4个方向的参数应该是相对于ViewGroup的位置参数,所以实际开发中还要处理控件边距等问题。而本例中的这个ViewGroup正好在页面的左上角,所以没有影响,可以按照onLayout()里的参数来进行计算,但要记得每次layout()完后要给当前高度加上之前的子View的高度值。
最后,在布局文件里设置MyPingredViewGroup:


运行程序,得到的界面效果如图3.3所示。

图3.3 页面效果
可以看到因为这里设置控件的情况属于宽度和高度都是包含的内容,所以ViewGroup的宽度为子View宽度最大值120,ViewGroup的高度则为所有子View的高度总和。