![Android程序员面试笔试宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/682/39130682/b_39130682.jpg)
上QQ阅读APP看书,第一时间看更新
3.2 自定义ViewGroup
自定义ViewGroup也不是很复杂,它的思路大致如下:
1)测量它的每个子View的大小,才能算出自己本身容量需要多少才能容纳它们;
2)根据实际需求来设置每个子View的分布位置;
3)最后重写触摸事件方法以及其他方法。
下面创建一个MyPingredViewGroup类,并重写它的onMeasure()方法:
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/57_04.jpg?sign=1739911633-fPCPZy1vyChoNtZBgGINMdAENK5WqELN-0-9745fc927bfa7d085ca6fd4ff6088bfc)
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/58_01.jpg?sign=1739911633-ssCFrOHX9fDmdYn7R6XhdB8t149VhDi7-0-a3a6675c3458d5b7a96ab7650a88828c)
代码虽比较多,但理解起来不难,分别根据不同的包含内容情况去计算最终宽度和高度值。把子View的大小和ViewGroup的大小都测量好后,就需要来分布它们,通过重写onLayout()方法来实现:
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/59_01.jpg?sign=1739911633-bk7fIVtn1ClWuXihJUWLyua825OnOb5U-0-d45b4c97e2c3fac44fe8fc37aa39ea3e)
这里要注意的是onLayout()方法中4个参数分别是代表左、上、右、下的值,是ViewGroup相对于其父View的位置参数,而当childView调用layout()方法时传进去的4个方向的参数应该是相对于ViewGroup的位置参数,所以实际开发中还要处理控件边距等问题。而本例中的这个ViewGroup正好在页面的左上角,所以没有影响,可以按照onLayout()里的参数来进行计算,但要记得每次layout()完后要给当前高度加上之前的子View的高度值。
最后,在布局文件里设置MyPingredViewGroup:
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/59_02.jpg?sign=1739911633-ivCaNy416SwuRbkeVGJl1hNuqyGS5IR9-0-a363539175b7934b68ab4f56db6f346c)
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/60_01.jpg?sign=1739911633-uLhYgXWfds32P3W0UDbvDfiwFGdzkoJ7-0-8d6e9b9602035c4738bfbca38440f080)
运行程序,得到的界面效果如图3.3所示。
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/60_02.jpg?sign=1739911633-h5UTCpOY82IwFTjHMJ0JKcpDshH5hpoK-0-b5ee70da4b4a6a987fd487761206dc14)
图3.3 页面效果
可以看到因为这里设置控件的情况属于宽度和高度都是包含的内容,所以ViewGroup的宽度为子View宽度最大值120,ViewGroup的高度则为所有子View的高度总和。