Android中的View全解析(三)

View的内容大致分为一下四项:

View的绘制原理,

View的自定义属性,

View的生命周期,

View的事件分发机制


再说一说View的生命周期。

每个View的生命周期如下:

通过view的构造方法构造View——>onFinishInflate方法完成构造——>onAttachedToWindow方法与Window进行连接——>onVisibilityChanged方法检查View的Visibility属性——>onMeasure方法对View进行测量——>onSizeChanged方法中发现大小发生了变化——>onLayout方法对View进行布局——>onDraw方法对View进行绘制——>onDetachedFromWindow方法与Window切断连接,View的生命周期结束。


大家可能会对onSizeChanged方法产生疑问,它为什么会出现在onMeasure方法与onLayout方法之间呢?大家可还记得layout方法在调用onLayout方法之前会先调用setFrame方法对View的大小和位置是否发生变化进行判断?没错,setFrame方法中如果判断大小发生了变化,便会调用sizeChange方法,然后sizeChange方法会再调用onSizeChanged方法,重写该方法,便可对View的大小发生变化的情况采取一定的措施。

那么View的生命周期和Activity的生命周期有什么关联呢?不妨做一下测试。

04-25 17:38:30.644 2131-2131/com.yroject.yxy.viewtest D/MainActivity: onCreate
04-25 17:38:30.713 2131-2131/com.yroject.yxy.viewtest D/MyView: MyView
04-25 17:38:30.713 2131-2131/com.yroject.yxy.viewtest D/MyView: onFinishInflate
04-25 17:38:30.723 2131-2131/com.yroject.yxy.viewtest D/MainActivity: onStart
04-25 17:38:30.726 2131-2131/com.yroject.yxy.viewtest D/MainActivity: onResume
04-25 17:38:30.760 2131-2131/com.yroject.yxy.viewtest D/MyView: onAttahedToWindow
04-25 17:38:30.760 2131-2131/com.yroject.yxy.viewtest D/MyView: onVisibilityChanged
04-25 17:38:30.771 2131-2131/com.yroject.yxy.viewtest D/MyView: onMeasure
04-25 17:38:30.793 2131-2131/com.yroject.yxy.viewtest D/MyView: onSizeChanged
04-25 17:38:30.794 2131-2131/com.yroject.yxy.viewtest D/MyView: onLayout
04-25 17:38:30.803 2131-2131/com.yroject.yxy.viewtest D/MyView: onDraw
04-25 17:38:30.878 2131-2131/com.yroject.yxy.viewtest D/MyView: onMeasure
04-25 17:38:30.878 2131-2131/com.yroject.yxy.viewtest D/MyView: onLayout
04-25 17:38:30.878 2131-2131/com.yroject.yxy.viewtest D/MyView: onDraw

有上文可见,首先是Activity的onCreate方法,里面调用了setContentView方法。然后使用MyView的构造方法,构造了一个MyView,接着调用了onFinishInflate方法,说明View的映射已经完成。Activity继续执行onStart和onResume方法,在onResume方法后,Viewv才会调用onAttahedToWindow方法,与窗口进行连接。之后调用onVisibilityChanged方法对View的Visibility属性进行检查,之后一次调用onMeasure,onLayout,onDraw方法对View进行测量,布局,绘制。由于是第一次进行,所以中间会调用onSizeChanged方法。

大家可能又会有疑问了,onVisibilityChanged方法是怎么对View的Visibility属性进行检查的呢?首先,View的Visibility属性有三个值:gone,visible,invisible。下面,我们依次把View的Visibility属性设置为gone,visible,invisible,再来运行一下程序。

android:visibility="gone"
04-25 18:49:13.270 16417-16417/com.yroject.yxy.viewtest D/MyView: onAttahedToWindow
04-25 18:49:13.270 16417-16417/com.yroject.yxy.viewtest D/MyView: onVisibilityChanged

在前面完全没有发生变化的情况下,MyView在onVisibilityVChanged方法执行结束后,View将不再进行测量,布局,绘制。View也不会显示。

android:visibility="invisible"
04-25 18:51:58.656 19983-19983/com.yroject.yxy.viewtest D/MyView: onAttahedToWindow
04-25 18:51:58.657 19983-19983/com.yroject.yxy.viewtest D/MyView: onVisibilityChanged
04-25 18:51:58.669 19983-19983/com.yroject.yxy.viewtest D/MyView: onMeasure
04-25 18:51:58.688 19983-19983/com.yroject.yxy.viewtest D/MyView: onSizeChanged
04-25 18:51:58.688 19983-19983/com.yroject.yxy.viewtest D/MyView: onLayout
04-25 18:51:58.793 19983-19983/com.yroject.yxy.viewtest D/MyView: onMeasure
04-25 18:51:58.793 19983-19983/com.yroject.yxy.viewtest D/MyView: onLayout


在Visibility设置为invisible后,View将照常进行测量和布局工作,但不会进行绘制。View也没有显示。

android:visibility="visible"

04-25 17:38:30.760 2131-2131/com.yroject.yxy.viewtest D/MyView: onAttahedToWindow
04-25 17:38:30.760 2131-2131/com.yroject.yxy.viewtest D/MyView: onVisibilityChanged
04-25 17:38:30.771 2131-2131/com.yroject.yxy.viewtest D/MyView: onMeasure
04-25 17:38:30.793 2131-2131/com.yroject.yxy.viewtest D/MyView: onSizeChanged
04-25 17:38:30.794 2131-2131/com.yroject.yxy.viewtest D/MyView: onLayout
04-25 17:38:30.803 2131-2131/com.yroject.yxy.viewtest D/MyView: onDraw
04-25 17:38:30.878 2131-2131/com.yroject.yxy.viewtest D/MyView: onMeasure
04-25 17:38:30.878 2131-2131/com.yroject.yxy.viewtest D/MyView: onLayout
04-25 17:38:30.878 2131-2131/com.yroject.yxy.viewtest D/MyView: onDraw

将Visibility设置为visible后,View将正常地进行测量,布局,绘制工作,也会正常得显示在屏幕上。

由此可见,View的Visibility属性默认为visible,将其设置成不同的值,便可以实现不同的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章