onGlobalLayout的触发
经常用onGlobalLayout,但是对onGlobalLayout的调用一直不敢确定,今天从源码来看看onGlobalLayout什么时候会被触发,onGlobalLayout的是android.view.ViewTreeObserver#dispatchOnGlobalLayout调用的,所以只要看dispatchOnGlobalLayout哪里调就好了。如下所示,它是在ViewRootImpl的performTraversals方法里的,
//android.view.ViewRootImpl#performTraversals
if (triggerGlobalLayoutListener) {
mAttachInfo.mRecomputeGlobalAttributes = false;
mAttachInfo.mTreeObserver.dispatchOnGlobalLayout();
}
看到了triggerGlobalLayoutListener,这个就是触发onGlobalLayout的关键。
final boolean didLayout = layoutRequested && (!mStopped || mReportNextDraw);
boolean triggerGlobalLayoutListener = didLayout
|| mAttachInfo.mRecomputeGlobalAttributes;
triggerGlobalLayoutListener又是didLayout决定的,再看didLayout,他主要由layoutRequested决定,现在主要看layoutRequested。layoutRequested主要就是mLayoutRequested,好了,现在真想大白了,在performTraversals过程中,mLayoutRequested为true导致触发onGlobalLayout。
结论
一个view的有效requestLayout,会导致触发onGlobalLayout。