DEVLOG 10.18 淺析View#invalidate
從源碼的角度簡(jiǎn)單分析一下View#invalidate的作用,并且做出對(duì)于以下問題的回答:
簡(jiǎn)述View#invalidate過程?
View#invalidate刷新只和當(dāng)前的View產(chǎn)生關(guān)系嗎?會(huì)不會(huì)和它的父容器產(chǎn)生關(guān)系呢?

簡(jiǎn)述View#invalidate過程?
如圖所示,我們先看看View#invalidate的調(diào)用鏈,從調(diào)用鏈上我們可以明確的發(fā)現(xiàn),View的刷新過程是會(huì)涉及到ViewGroup的。View的刷新過程會(huì)從當(dāng)前View開始,獲取當(dāng)前View的父容器,在通過這個(gè)父容器逐級(jí)向上,直到ViewRootImpl。在刷新過程中,在ViewGroup#invalidateChildInParent中,會(huì)計(jì)算當(dāng)前的View和父容器View的并集。

ViewRootImpl最后會(huì)調(diào)用scheduleTraversal,然后再開啟三大流程。
ViewGroup#invalidateChild這個(gè)方法使用了do-while循環(huán),不斷回溯尋找找當(dāng)前View的父容器。因?yàn)閂iewRootImpl也是ViewParent,所以找到最后會(huì)調(diào)用ViewRootImpl#invalidateChild。
標(biāo)簽: