一、View 的定义

View 就是屏幕上的一块矩形区域,我们可以在这块区域绘制我们想让用户看到的图形(负责绘制这个区域和事件的处理),View 默认是可见的。

二、View的生命周期

View生命周期的相关方法

在了解View的生命周期之前我们先来了解View生命周期的相关方法:

1.创建(creation)

1)Constructors(构造函数):有一种形式的构造函数是View在代码中被创建时调用(第一种构造方法),另一种形式的构造函数会在View从layout加载出来时被调用,第二种形式的构造函数会解析和应用layout文件中定义的任何属性。
 2)onFinishInflate():该方法是在当View及其子View从XML文件中加载完成后会被调用。

2.Layout(布局)

1)onMeasure(int,int):该方法是在计算当前View及其所有子View尺寸大小需求时会被调用。
 2)onLayout(boolean, int, int, int, int),该方法是在当前的view需要为其子view分配尺寸和位置时会被调用。
 3)onSizeChanged(int, int, int, int),该方法是在当前View尺寸变化时被调用。

3.Drawing(绘制)

onDraw(Canvas):该方法是在当前View需要呈现其内容时被调用(只有可见的  View   才在   window  中绘制 )。

4.Event processing(时间处理)

1)onKeyDown(int, KeyEvent):该方法是在一个物理按键事件发生时被调用。
 2)onKeyUp(int, KeyEvent):该方法是在一个物理按键弹起事件发生时被调用。
 3)onTrackballEvent(MotionEvent):该方法是在一个轨迹球运动事件发生时被调用。
 4)onTouchEvent(MotionEvent):该方法是在一个触摸屏幕运动事件发生时被调用。

5.Focus(聚焦)

1)onFocusChanged(boolean, int, android.graphics.Rect):该方法在当前View获得或失去焦点时被调用。
 2)onWindowFocusChanged(boolean) 该方法是在包含当前View的window获得或失去焦点时被调用。

6.Attaching(附上)

onAttachedToWindow():该方法是在当前View被附到一个window上时被调用。
 onDetachedFromWindow():该方法是在当前View从一个window上分离时被调用。
 onVisibilityChanged(View, int):该方法是在当前View或其祖先的可见性改变时被调用。如果View状态不可见或者GONE,该方法会第一个被调用。
 onWindowVisibilityChanged(int):该方法是在包含当前View的window可见性改变时被调用。

View生命周期的相关总结

1)View默认为可见的,不是默认值时先调用onVisibilityChanged(),但是此时该View的尺寸、位置等信息都不知道。
2)可见性改变后才是调用带有两个参数的构造函数,当然,如果该View不是在layout中定义的话,会调用一个参数的构造函数。
3)从XMl文件中inflate完成(onFinishInflate())。
4)将View加到window中(View是gone的,那么View创建生命周期也就结束)。
5)测量view的长宽(onMeasure())。
6)定位View 在父View中的位置(onLayout()),若View是invisible,则View的创建生命周期结束。
7)绘制View的content(onDraw()),只有可见的View才在window中绘制。
8)View的销毁流程和可见性没有关系。

***在Activity的onCreate方法中加载View,View的onFinishInflate会被调用,继而Activity的生命周期执行到onResume方法之后View才被附着到窗口上,继而进行绘制工作,onMeasure()、onSizeChanged() 、onLayout()、onDraw()。这几个方法可能由于setVisible或onResume()被调用多次,最后是Window失去焦点后的销毁阶段,onDetackedFromWindow()。

***onVisibilityChanged()方法在View是可见性改变时调用,但是View的状态如果是不可见或者GONE时,是首先被调用的。如果是Invisible状态,View的创建到layout即结束,不会绘制出来。如果是GONE状态,View也会被加载并添加到Window,但是不会再Measure、Layout和Draw了。也就时说即使是GONE状态,销毁时一样有Detach的过程,即View的销毁过程和可见性无关。

View 的关键生命周期为

[改变可见性] --> 构造View() --> onFinishInflate() --> onAttachedToWindow() --> onMeasure() --> onSizeChanged() --> onLayout() --> onDraw() --> onDetackedFromWindow()