在這里插入圖片描述
requestLayout:
requestLayout會直接遞歸調(diào)用父窗口的requestLayout,直到ViewRootImpl,然后觸發(fā)peformTraversals食磕,由于mLayoutRequested為true枫绅,會導致onMeasure和onLayout被調(diào)用桶错。不一定會觸發(fā)OnDraw炒刁。requestLayout觸發(fā)onDraw可能是因為在在layout過程中發(fā)現(xiàn)l,t,r,b和以前不一樣坠七,那就會觸發(fā)一次invalidate见转,所以觸發(fā)了onDraw缕碎,也可能是因為別的原因?qū)е耺Dirty非空(比如在跑動畫)
invalidate:
view的invalidate不會導致ViewRootImpl的invalidate被調(diào)用,而是遞歸調(diào)用父view的invalidateChildInParent池户,直到ViewRootImpl的invalidateChildInParent咏雌,然后觸發(fā)peformTraversals,會導致當前view被重繪,由于mLayoutRequested為false校焦,不會導致onMeasure和onLayout被調(diào)用赊抖,而OnDraw會被調(diào)用
postInvalidate:
postInvalidate是在非UI線程中調(diào)用,invalidate則是在UI線程中調(diào)用寨典。
一般來說氛雪,只要刷新的時候就調(diào)用invalidate,需要重新measure就調(diào)用requestLayout耸成,后面再跟個invalidate(為了保證重繪)报亩,這是我個人的理解。