前言:Android自定义View对于刚入门乃至工作几年的程序员来说都是非常恐惧的,但也是Android进阶学习的必经之路,平时项目中经常会有一些苛刻的需求,我们可以在GitHub上找到各种各样的效果,能用则用,不能用自己花功夫改改也能草草了事。不过随着工作经验和工作性质,越来越觉得自定义View是时候有必要自己花点功夫研究一下。
一、经过这两天的努力,自己也尝试着写了一个Demo,效果很简单,就是开关按钮的实现。
可能有的人会说这效果so easy,找UI切三张图就完事了,何必大费周折自定义。你说的没错,不过这里只是用来学习自定义View来展示这么一个常见案例。
自定义控件
1.为什么自定义View?
- Android自身带的控件不能满足需求, 需要根据自己的需求定义控件.
2.Android 的界面绘制流程?
onMeasure()——onLayout()——onDraw()方法都在Activity生命周期的onResume()方法之后执行。
3.Android自定义View的方式?
- 集成View:View流程
onMeasure() (在这个方法里指定自己的宽高) -> onDraw() (绘制自己的内容) - 集成ViewGroup:ViewGroup流程
onMeasure() (指定自己的宽高, 所有子View的宽高)-> onLayout() (摆放所有子View) -> onDraw() (绘制内容)
自定义View实现开关按钮步骤:
- 写个类继承View,
- 拷贝包含包名的全路径到xml中,
- 界面中找到该控件, 设置初始信息,
- 根据需求绘制界面内容,
- 响应用户的触摸事件,
- 创建一个状态更新监听.
1.自定义ToggleView集成View,并且重新三个构造方法。
注意:构造方法为什么要重写三个?
- ToggleView(Context context)一个参数的构造方法是用于代码创建控件时调用的
- ToggleView(Context context, AttributeSet attrs)用于在xml里使用, 可指定自定义属性
- ToggleView(Context context, AttributeSet attrs, int defStyle)用于在xml里使用, 可指定自定义属性, 如果指定了样式, 则走此构造函数
我们在XML中定义了背景图片、开关按钮图片和开关默认状态,要获取在XML文件定义的属性就在包含三个参数的构造方法里用TypedArray类来获取。
在attrs.xml声明节点declare-styleable
<declare-styleable name="ToggleView">
<attr name="switch_background" format="reference" />