View的来源
Android中有一个View类,这个类掌管着App中所有的显示物件。无论我们所说的LinearLayout,Button,TextView,ListView等等,都属于这一类。
Android的API中有许多的控件,而我们经常使用的大都是这类控件。然而,其背后的生成一个控件的方法却不得而知。如果知道的话,我们就可以自己生成一些定制性更强的控件使用。而这也是学习自定义控件所必须掌握的知识。
View就是类
首先,任何控件在Android中都是一个类,我们在使用控件的时候都是对这个对象进行操作。这个控件类包含了这个控件的所有特性,比如尺寸,颜色,背景,监听事件等等。还包括这些组件是如何显示的,如何才能使用它。既然是一个类那么就存在继承,实现的关系。因此,我们还可以通过继承系统预制的一些控件的类,来定制我们自己的子类。这样就可以简单、并且有针对性的定制控件。而Android的API也是这么干的。
View的原理
我们知道,添加一个控件有两种方法
使用布局文件XML
a. 这种方法可以很直观的对界面进行布局及控制。
b.使用的时候只需要在Activity中使用setContentView方法就可以放入整页的布局文件。使用findViewById可以在已经包含View的Activity中找到单个的View控件进行控制。
- c. 获得了单个的控件之后,我们可以根据每个控件的向外暴露出来的方法对其实施控制。而这些方法就是这个控件类中所定义的。
使用代码进行控制
- a. 这种方法实际是最根本的方法。因为,XML布局文件最终也是通过LayoutInflater装载,然后使用PULL解析的方法转换为对应的方法进行设置的。
- b. 无论是系统定义的控件类还是我们自定义的控件类都是View的子孙类。因此,对控件操作的常用方法也都在View中定义,我们只需要复写即可。
- 常见的方法有:
- OnMeasure()调用它可以设置控件的尺寸
- OnDraw()绘制控件的内容
- OnTouchEvent(), OnFocusChanged()设置控件的触摸监听事件
- 常见的方法有:
- c. 至于自定义的地方则另外添加方法就行。
自定义View的实现过程
搞清楚这些控件的来龙去脉之后,自定义就非常简单了。
- 定义控件的类
- a. 想把哪个控件修改一下就继承那个控件的类
- 完善自定义控件类的属性及方法
- a. 代码和XML两种方法分别操作。也可以混合操作。只要记住两者最终都是使用代码操作就行。并且如果使用XML作为布局文件传入的话需要使用LayoutInflater作为传送器对其进行解析。
- b. 设置控件属性
- i. 属性值的类型在TypedValue,比如dip,sp等等
- ii. 控件的设置方法可以通过继承的方式获得一些常见的操作,比如setTextSize等等。至于不常见的则需要自定义方法,然后通过OnMeasure重新指定尺寸,通过OnDraw重新绘制。
- iii. 以上的这些方法可以暴露到外面,供调用者操作。
- 使用自定义控件
- a. XML布局文件的方法
- 在Activity中使用控件通常的做法是setContentView和findViewById,他们都是通过XML的方式获取控件。
- 这种方法需要把自定义控件的全类名当作控件名添加到XML布局文件中去。(其实系统自带的控件也是通过某种方法将类名简化而已)
- 添加布局文件或者控件之后,就可以把它当做这个控件的对象进行操作。控件中指定的方法就是用来操作控件的方法。
- b. 如果通过代码的方法
- addContentView的方法添加view对象。
- a. XML布局文件的方法