1. 程式人生 > >invalidate和requestLayout區別

invalidate和requestLayout區別

總述: View有兩個很重要的方法:invalidate和requestLayout,常用於View重繪和更新。

Invalidate: To farce a view to draw,call invalidate().——摘自View類原始碼 從上面這句話看出,invalidate方法會執行draw過程,重繪View樹。 當View的appearance發生改變,比如狀態改變(enable,focus),背景改變,隱顯改變等,這些都屬於appearance範疇,都會引起invalidate操作。

所以當我們改變了View的appearance,需要更新介面顯示,就可以直接呼叫invalidate方法。

View(非容器類)呼叫invalidate方法只會重繪自身,ViewGroup呼叫則會重繪整個View樹。

RequestLayout: To initiate a layout, call requestLayout(). This method is typically called by a view on itself when it believes that it can no longer fit within its current bounds.——摘自View原始碼

從上面這句話看出,當View的邊界,也可以理解為View的寬高,發生了變化,不再適合現在的區域,可以呼叫requestLayout方法重新對View佈局。

View執行requestLayout方法,會向上遞迴到頂級父View中,再執行這個頂級父View的requestLayout,所以其他View的onMeasure,onLayout也可能會被呼叫。

總結:

View繪製分三個步驟,順序是:onMeasure,onLayout,onDraw。經程式碼親測,log輸出顯示:呼叫invalidate方法只會執行onDraw方法;呼叫requestLayout方法只會執行onMeasure方法和onLayout方法,並不會執行onDraw方法。

所以當我們進行View更新時,若僅View的顯示內容發生改變且新顯示內容不影響View的大小、位置,則只需呼叫invalidate方法;若View寬高、位置發生改變且顯示內容不變,只需呼叫requestLayout方法;若兩者均發生改變,則需呼叫兩者,按照View的繪製流程,推薦先呼叫requestLayout方法再呼叫invalidate方法。  

相關知識點:

1.invalidate和postInvalidate:invalidate方法只能用於UI執行緒中,在非UI執行緒中,可直接使用postInvalidate方法,這樣就省去使用handler的煩惱。