invalidate和requestLayout原理與區(qū)別總結(jié)

invalidate原理
1.view的invalidate會(huì)逐層找parent一直找到DecorView,DecorView是頂點(diǎn)了,但是DecorView還有個(gè)虛擬父view,ViewRootImpl。 ViewRootImpl不是一個(gè)View或者ViewGroup,他有個(gè)成員mView是DecorView,所有的操作從ViewRootImpl開始自上而下分發(fā)
2.view的invalidate不會(huì)導(dǎo)致ViewRootImpl的invalidate被調(diào)用,而是遞歸調(diào)用父view的invalidateChildInParent,直到ViewRootImpl的invalidateChildInParent,然后觸發(fā)peformTraversals,會(huì)導(dǎo)致當(dāng)前view被重繪,由于mLayoutRequested為false,不會(huì)導(dǎo)致onMeasure和onLayout被調(diào)用,而OnDraw會(huì)被調(diào)用
3.一個(gè)view的invalidate會(huì)導(dǎo)致本身PFLAG_INVALIDATED置1,導(dǎo)致本身以及父族viewgroup的PFLAG_DRAWING_CACHE_VALID置0
invalidate如果是個(gè)view,那就只有自己本身會(huì)draw,如果是ViewGroup就是對(duì)子view進(jìn)行重繪

requestLayout原理
1.requestLayout會(huì)直接遞歸調(diào)用父窗口的requestLayout,直到ViewRootImpl,然后觸發(fā)peformTraversals,由于mLayoutRequested為true,會(huì)導(dǎo)致onMeasure和onLayout被調(diào)用。不一定會(huì)觸發(fā)OnDraw
2.requestLayout觸發(fā)onDraw可能是因?yàn)樵谠趌ayout過程中發(fā)現(xiàn)left,top,right,bottom和以前不一樣,那就會(huì)觸發(fā)一次invalidate,所以觸發(fā)了onDraw,也可能是因?yàn)閯e的原因?qū)е耺Dirty非空(比如在跑動(dòng)畫)

  1. requestLayout會(huì)導(dǎo)致自己以及父族view的PFLAG_FORCE_LAYOUT和PFLAG_INVALIDATED標(biāo)志被設(shè)置。
    view的requestLayout必然會(huì)導(dǎo)致該view和viewparent的重新measure,但不一定會(huì)導(dǎo)致子view的measure
    最后,一般來說,只要刷新的時(shí)候就調(diào)用invalidate,需要重新measure就調(diào)用requestLayout,后面再跟個(gè)invalidate(為了保證重繪)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容