requestLayout和invalidate區別

在這裏插入圖片描述

requestLayout:

requestLayout會直接遞歸調用父窗口的requestLayout,直到ViewRootImpl,然後觸發peformTraversals,由於mLayoutRequested爲true,會導致onMeasure和onLayout被調用。不一定會觸發OnDraw。requestLayout觸發onDraw可能是因爲在在layout過程中發現l,t,r,b和以前不一樣,那就會觸發一次invalidate,所以觸發了onDraw,也可能是因爲別的原因導致mDirty非空(比如在跑動畫)

invalidate:

view的invalidate不會導致ViewRootImpl的invalidate被調用,而是遞歸調用父view的invalidateChildInParent,直到ViewRootImpl的invalidateChildInParent,然後觸發peformTraversals,會導致當前view被重繪,由於mLayoutRequested爲false,不會導致onMeasure和onLayout被調用,而OnDraw會被調用

postInvalidate:

postInvalidate是在非UI線程中調用,invalidate則是在UI線程中調用。

一般來說,只要刷新的時候就調用invalidate,需要重新measure就調用requestLayout,後面再跟個invalidate(爲了保證重繪),這是我個人的理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章