注意:rootview是乙個framelayout,所以也是乙個viewgroup
-這裡的的host就是我們的根布局decorview,因為decorview是乙個framelayout,而layout()是view中被修飾final的方法,所以我們這裡呼叫的是view的layout的方法,layout的四個引數代表view的四個頂點的位置,預設的decorview左邊距螢幕的距離和上邊距螢幕的邊距都是0,接著貼下view的layout方法
@suppresswarnings()
public void layout(int l, int t, int r, int b)
int oldl = mleft;
int oldt = mtop;
int oldb = mbottom;
int oldr = mright;
/*** setframe()方法執行以後,view的四個頂點的距離我們就確定了
*/boolean changed = islayoutmodeoptical(mparent) ?
setopticalframe(l, t, r, b) : setframe(l, t, r, b);
if (changed || (mprivateflags & pflag_layout_required) == pflag_layout_required) }}
mprivateflags &= ~pflag_force_layout;
mprivateflags3 |= pflag3_is_laid_out;}-
-
當執行setframe()方法後,會直接初始化mleft , mtop ,mright,mbottom這幾個值,因為我們一般在view中呼叫 getleft() gettop() getright() getbottom()獲取的就是這幾個值,所以我們一般必須得等layout()結束以後才能獲取到這幾個值protected boolean setframe(int left, int top, int right, int bottom)
--
接著繼續執行我們的onlayout()方法,onlayout()方法是view中的方法,在view中是乙個預設空實現,在viewgroup是乙個抽象方法(繼承viewgroup必須實現,因為要對子view進行布局),所以我們分兩種情況來介紹viewgroup的onlayout(),以relativelayout為例
@override
protected void onlayout(boolean changed, int l, int t, int r, int b)
}
view的onlayout(),預設是乙個空實現,一般情況下我們自定義控制項的時候,會去重寫它,實現自己的邏輯。view中的onlayout():
protected void onlayout(boolean changed, int left, int top, int right, int bottom)
好了,差不多就這麼多了,到了這一步基本確定了view的具體位置,接著就是繪製了….. View框架之measure 流程
注意 1.以下measurespec用ms來代替 ms具體會在後面介紹 2.該時序圖描述的是從viewrootimpl開始的measure 過程,因為viewrootimpl是window與view連線的樞紐 3.該時序圖著重於大概流程及重要方法的作用,具體 細節會放到後面介紹 4.decorvie...
View工作流程 layout過程
一 layout過程 layout作用是viewgroup用來確定子元素位置。當viewgroup確定後會在onlayout中遍歷所有子元素並呼叫其layout方法,子元素的layout又會呼叫onlayout。這點和measure的過程很相似。二 view的getmeasuredwidth和get...
View系列 四 Layout 流程詳解
三 viewgroup 的 layout 過程 四 小結 在 view 的 measure 過程中,measure 分為兩種場景 即單一view 和 viewgroup 而 view 的 layout 過程與 measure 類似,也分為以下兩種場景。view的型別 layout 過程 單一的vie...