invalidate和requestLayout原理與區別總結

原創鏈接:https://www.jianshu.com/p/4f0f0b64381d

invalidate原理
1.view的invalidate會逐層找parent一直找到DecorView,DecorView是頂點了,但是DecorView還有個虛擬父view,ViewRootImpl。 ViewRootImpl不是一個View或者ViewGroup,他有個成員mView是DecorView,所有的操作從ViewRootImpl開始自上而下分發
2.view的invalidate不會導致ViewRootImpl的invalidate被調用,而是遞歸調用父view的invalidateChildInParent,直到ViewRootImpl的invalidateChildInParent,然後觸發peformTraversals,會導致當前view被重繪,由於mLayoutRequested爲false,不會導致onMeasure和onLayout被調用,而OnDraw會被調用
3.一個view的invalidate會導致本身PFLAGINVALIDATED置1,導致本身以及父族viewgroup的PFLAGDRAWINGCACHEVALID置0
invalidate如果是個view,那就只有自己本身會draw,如果是ViewGroup就是對子view進行重繪

 

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

  1. requestLayout會導致自己以及父族view的PFLAG_FORCE_LAYOUT和PFLAG_INVALIDATED標誌被設置。
    view的requestLayout必然會導致該view和viewparent的重新measure,但不一定會導致子view的measure
    最後,一般來說,只要刷新的時候就調用invalidate,需要重新measure就調用requestLayout,後面再跟個invalidate(爲了保證重繪)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章