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,將其設置成不同的值,便可以實現不同的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章