一、
首先我们要明白为什么要自定义View,主要是Android系统内置的View无法实现我们的需求,我们需要针对我们的业务需求定制我们想要的View。自定义View的价值在于:
1、能够做到基础控件无法做到的效果,为应用的表现增色;
2、在多个应用并行开发的团队,将公用的交互效果提取成自定义控件,方便复用,减少不必要的重复劳动;
3、将控件的内部逻辑封装在自定义View中,便于应用内解耦。
二、
自定义的View的实现有三种方式:继承已有控件(比如ImageView、EditText);完全自定义控件;组合控件。
三、
在这里,我们先来温故下关于View的基础知识。
1、View的分类。View分为两类:单一视图和视图组。
类别 | 解释 | 特点 |
单一视图 | 即一个View,如TextView | 没有子View |
视图组 | 即多个View组成的ViewGroup,如LinearLayout、RelativeLayout、FrameLayout | 包含子View |
2、View的构造方法。View一共有四个构造方法,如下:
//如果View是在Java代码里new的,则调用第一个构造方法
//如果View是在.xml里声明的,则调用第二个构造方法。自定义属性是通过AttributeSet 参数传递进来的。
View(Context context, AttributeSet attrs)
//不会自动调用
View(Context context, AttributeSet attrs, int defStyleAttr)
//API21之后才使用。不会自动调用。
View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
3、View视图结构。
对于多View的视图,结构是树形结构,最顶层是ViewGroup,ViewGroup下可能有多个ViewGroup或View。
切记:无论是measure过程、layout过程还是draw过程,永远都是从树的根节点开始测量或计算(即从树的顶端开始),一层一层,一个分支一个分支地进行(即树形递归),最终计算整个View树中各个View,最终确定整个View树的相关属性。
4、Android坐标系。
Android坐标系定义为:
- 屏幕的左上角为坐标原点
- 向右为x轴增大方向
- 向下为y轴增大方向
如下图
5、View位置(坐标)描述。
View的位置由四个顶点决定(如下A、B、C、D)
4个顶点的位置描述分别由4个值决定(注意:View的位置是相对于父控件而言的):
- Top:子View上边界到父view上边界的距离
- Left:子View左边界到父view左边界的距离
- Bottom:子View下边距到父View上边界的距离
- Right:子View右边界到父view左边界的距离
如下图:
四、自定义View涉及到的核心方法。
1、onMeasure 用于测量视图的大小
2、onDraw 用于对视图进行绘制
3、onLayout 用于给视图进行布局
本文就到这里,后续的系列文章将结合实例继续讲解自定义View。