前言
目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、瓜州網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。上一篇文章,筆者主要講述了DecorView以及ViewRootImpl相關(guān)的作用,這里回顧一下上一章所說的內(nèi)容:DecorView是視圖的頂級(jí)View,我們添加的布局文件是它的一個(gè)子布局,而ViewRootImpl則負(fù)責(zé)渲染視圖,它調(diào)用了一個(gè)performTraveals方法使得ViewTree開始三大工作流程,然后使得View展現(xiàn)在我們面前。本篇文章主要內(nèi)容是:詳細(xì)講述View的測(cè)量(Measure)流程,主要以源碼的形式呈現(xiàn),源碼均取自Android API 21.
從ViewRootImpl#PerformTraveals說起
我們直接從這個(gè)方法說起,因?yàn)樗钦麄€(gè)工作流程的核心,我們看看它的源碼:
private void performTraversals() { ... if (!mStopped) { int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width); // 1 int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); } } if (didLayout) { performLayout(lp, desiredWindowWidth, desiredWindowHeight); ... } if (!cancelDraw && !newSurface) { if (!skipDraw || mReportNextDraw) { if (mPendingTransitions != null && mPendingTransitions.size() > 0) { for (int i = 0; i < mPendingTransitions.size(); ++i) { mPendingTransitions.get(i).startChangingAnimations(); } mPendingTransitions.clear(); } performDraw(); } } ... }