1. 说明
前边我们写了关于自定义View的小示例,分别是自定义TextView、仿QQ运动步数、玩转字体变色、仿淘宝评分控件、字母选择列表,自定义ViewGroup是我们上节课写的流式布局,那么我们这节课就来总结下,写自定义View和ViewGroup的套路。
2. 套路
2.1>:自定义View套路总结:
2.1.1>:在values下创建attrs.xml,写自定义属性,然后在自定义View中获取自定义属性,达到配置的效果;
2.1.2>:复写onMeasure()方法,用于测量计算自己的宽高,前提是继承自View,如果是继承系统已有的控件,比如TextView、Button,系统已经给你计算好了宽高,你就不需要复写onMeasure()方法了,比如之前写的 玩转字体变色,直接继承TextView,就没有复写onMeasure()方法;
2.1.3>:复写onDraw()方法,用于绘制自己的显示,看你应该显示成什么样子;
常见demo比如之前写的:自定义TextView、仿QQ运动步数、玩转字体变色
如果涉及与用户交互的话,就需要处理onTouchEvent()事件:
比如之前写的:仿淘宝评分控件、字母选择列表;
2.2>:自定义ViewGroup套路总结
2.2.1>:自定义属性,在自定义ViewGroup中获取自定义属性,达到配置的效果,自定义ViewGroup一般不需要自定义属性;
2.2.2>:复写onMeasure()方法,for循环测量子View的宽高,根据子View的宽高来计算自己的宽高;
2.2.3>:onDraw()方法默认不会调用,如果需要绘制的话,就需要实现dispatchDraw()方法;
2.2.4>:onLayout()用于摆放子View,前提子View是可见的,不是GONE的情况;
2.2.5>:在很多情况下,我们一般不会直接继承 ViewGroup,而是往往继承系统已经提供好的ViewGroup,比如ViewPager、ScrollView、RelativeLayout;
因为如果继承自ViewGroup,需要自己去复写onMeasure()、onLayout()方法,然后需要自己去测量和摆放子View,会比较麻烦,而我们继承 ViewPager、ScrollView、RelativeLayout的话,就不需要我们去管onMeasure()、onLayout()、onDraw(),所以我们一般是继承系统提供好的这些ViewGroup;