Android invalidate()方法 requestLayout()方法分析

強調一點的就是,在onMeasure(),onLayout(),onDraw()這三個流程中,Google已經幫咱們把draw()過程框架已經寫好了,自定義的ViewGroup只須要實現
measure()過程和layout()過程便可 。框架

這三種狀況,最終會直接或間接調用到三個函數,分別爲invalidate(),requsetLaytout()以及requestFocus() ,接着
這三個函數最終會調用到ViewRoot中的schedulTraversale()方法,該函數而後發起一個異步消息,消息處理中調用
performTraverser()方法對整個View進行遍歷。異步

invalidate()方法 :函數

說明:請求重繪View樹,即draw()過程,假如視圖發生大小沒有變化就不會調用layout()過程,而且只繪製那些「須要重繪的」
視圖,即誰(View的話,只繪製該View ;ViewGroup,則繪製整個ViewGroup)請求invalidate()方法,就繪製該視圖。佈局

通常引發invalidate()操做的函數以下:
一、直接調用invalidate()方法,請求從新draw(),但只會繪製調用者自己。
二、setSelection()方法 :請求從新draw(),但只會繪製調用者自己。
三、setVisibility()方法 : 當View可視狀態在INVISIBLE轉換VISIBLE時,會間接調用invalidate()方法,
繼而繪製該View。
4 、setEnabled()方法 : 請求從新draw(),但不會從新繪製任何視圖包括該調用者自己。orm

requestLayout()方法 :會致使調用measure()過程 和 layout()過程 。it

說明:只是對View樹從新佈局layout過程包括measure()和layout()過程,不會調用draw()過程,但不會從新繪製
任何視圖包括該調用者自己。io

通常引發invalidate()操做的函數以下:
一、setVisibility()方法:
當View的可視狀態在INVISIBLE/ VISIBLE 轉換爲GONE狀態時,會間接調用requestLayout() 和invalidate方法。
同時,因爲整個個View樹大小發生了變化,會請求measure()過程以及draw()過程,一樣地,只繪製須要「從新繪製」的視圖。form

requestFocus()函數說明:date

說明:請求View樹的draw()過程,但只繪製「須要重繪」的視圖。rsa

相關文章
相關標籤/搜索