Android中invalidate

山有木xi發表於2021-03-28

在Android自定義View的開發中,Invalidate是非常常用的一個方法,這邊對這個方法的相關步驟進行一個解析

1、首先,Invalidate呼叫view.invalidateInternal傳入當前view的位置引數

2、在invalidateInternal中判斷當前view的狀態,是否需要重繪,然後透過父View的invalidateChild方法,將需要重繪的區域傳遞給父View

3、接下來讓我們看一下invalidateChild,在invalidateChild中先是設定了需要重繪的區域dirty,之後再do…while中,反覆的呼叫parent = parent.invalidateChildInParent()方法,來呼叫父類的invalidateChildInParent對View的重繪請求進行傳遞

4、然後在ViewGroup.invalidateChildInParent中使用offset,把子View需要重繪的座標區域轉換為父View中的座標區域。之後使用union對子View與父View的區域進行集合運算,獲得需要繪製的區域。

5、在ViewRootImpl.invalidateInparent中,進入之後會執行緒以及重繪區域的檢查,之後呼叫invalidateRectOnScreen方法,然後呼叫scheduleTraversals()方法

6、ViewRootImpl.scheduleTraversals裡面,將會之後handler,之後會呼叫mTraversalRunnable類,從而呼叫doTraversal方法,最後呼叫performTraversals()執行ViewTree的遍歷

7、ViewRootImpl.performTraversals()中,在其中進行View的是否可見,是否為surfasce,是否正在繪製,是否存在於刪除列表中等判斷,之後呼叫performDraw()開始執行繪製。在performDraw()又呼叫了ViewRootImpl的draw方法,並傳遞了fullRedrawNeeded引數,此引數源自mFullRedrawNeeded成員變數,用於表示是否需要重新繪製全部的View

設定了需要重繪的區域dirty

作者:飲歌長嘯
連結:
來源:慕課網

8、然後就會呼叫ViewRootImpl.draw,在draw方法中,根據傳如fullRedrawNeeded引數,設定需要重繪的dirty區域,最後呼叫drawSoftware方法,把引數傳遞進去

9、最後ViewRootImpl.drawSoftware中,首先對canvas進行一些屬性設定,包括色塊、平移等。之後呼叫mView.draw(canvas)方法,開始對View進行繪製



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2765320/,如需轉載,請註明出處,否則將追究法律責任。

相關文章