一、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()