要实现一个自定义的View,通常都是重写一些系统框架在所有View上调用的基本方法,如大家都熟悉的onDraw(Convas)方法,没有必要重写View所有的方法。
下面我们一起对View的方法按照View的生命周期事件顺序进行分类,如下表所示:
分类 | 方法 | 描述 |
创建 | 构造方法 | View中有两种类型的构造方法,一种是在代码中构建View,另一种是填充布局文件构建View,第二种构造方法要解析并应用布局文件中定义的任何属性。 |
onFinishInflash() | 在来自于XML的View和它所有的子节点填充之后被调用。 | |
布局 | onMeasure | 调用该方法来确定view及它所有子节点需要的尺寸 |
onLayout | 当view需要为它的所有子节点指定大小和布局时,此方法被调用 | |
onSizeChanged | 当这个view的大小发生变化时,此方法被调用 | |
绘制 | onDraw | 当view渲染它的内容时被调用 |
事件处理 | onKeyDown | 当一个新的按键事件发生时被调用 |
onKeyUp | 当一个按键按起时被调用 | |
onTrackballEvent | 当轨迹球动作事件发生时被调用 | |
onTouchEvent | 当触屏动作发生时被调用 | |
焦点 | onFocusChanged | 当view获得或是失去焦点时被调用 |
onWindowFocusChanged | 当包含view的窗口获得焦点或是失去焦点时被调用 | |
附着 | onAttachedToWindow() | 当view附着到窗口时被调用 |
onDetachedFromWindow | 当view脱离它的窗口时被调用 | |
onWindowVisibilityChanged | 当包含此view的窗口的可见性发生变化时被调用 |
View 1.0 ID 关于View的ID,不做过多说明,只是用于标记View。
View 1.1 位置
View的几何形状是一个矩形,view的位置由矩形的左上角的x,y坐标及矩形的高度和宽度决定,他们的单位都是像素。
通过getLeft和getTop方法可以获得view相对于它的直接父节点的x,y坐标。
此外,还有一些便利的方法可以帮助我们减少计算量,比如getRight和getBottom方法,调用getRight等价于getLeft()+getWidth()方法,同理getBottom等价于getTop()+getHeight()方法。
View 1.2 大小,padding,margin 一个View的大小由它的宽度和高度来表达,一个View实际上拥有两对宽高值。
第一对宽高值是:测量过的宽度和高度,即view想从它的父节点获得的宽高值,可以通过getMeasuredWidth()方法和getMeasuredHeight()方法获得。
第二对宽高值是:绘制的宽度和高度,即View的实际宽度和高度,是在布局之后,绘制View阶段的宽高值,这与上面提到的宽高值可能不同。通过getWidth()方法和getHeight()方法可以获得View的实际宽度和高度。
padding同css中的padding属性。通过setPadding(int,int,int,int)可以设置View的padding,通过getPaddingXXX()方法可以获得View中对应方向的padding,XXX值得是left,right,top,bottom。
view不提供对margin的支持,但是viewGroup提供支持。