View框架之layout 流程

2021-07-24 07:07:29 字數 1949 閱讀 4860

注意: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...