View系列 四 Layout 流程詳解

2021-10-05 09:53:40 字數 3685 閱讀 7306

三、viewgroup 的 layout 過程

四、小結

在 view 的 measure 過程中,measure 分為兩種場景 (即單一view 和 viewgroup)。

而 view 的 layout 過程與 measure 類似,也分為以下兩種場景。

view的型別

layout 過程

單一的view (如 imageview)

只計算view自身的位置

viewgroup

先計算 viewgroup 自身的位置,然後遍歷計算子 view 的位置

版本:android sdk 29

關聯文章:

《view系列 (一) — android 座標系》

《view系列 (二) — measurespec 詳解》

《view系列 (三) — measure 流程詳解》

《view系列 (四) — layout 流程詳解》

《view系列 (五) — draw 流程詳解》

// ...省略**...

}protected

boolean

setframe

(int left,

int top,

int right,

int bottom)

return changed;

}private

boolean

setopticalframe

(int left,

int top,

int right,

int bottom)

// view.onlayout() 中是個空實現的方法

protected

void

onlayout

(boolean changed,

int left,

int top,

int right,

int bottom)

view 的位置設定是在view.layout()方法中。

view.onlayout()方法是計算子 view 的位置。

單一 view 沒有子 view,因此 onlayout 是空實現,所有邏輯都在view.layout()方法中。

步驟:

先計算自身viewgroup的位置 (view.layout())。

再遍歷子 view 並確定自身子 view 在 viewgroup 的位置 (viewgroup.onlayout() --> view.layout())。

public

void

layout

(int l,

int t,

int r,

int b)

// ...省略**...

}protected

void

onlayout

(boolean changed,

int l,

int t,

int r,

int b)

else

}void

layoutvertical

(int left,

int top,

int right,

int bottom)

else

if(child.

getvisibility()

!= gone)}}

private

void

setchildframe

(view child,

int left,

int top,

int width,

int height)

引數mleft、mtop、mright、mbottom四個引數是在view.layout()過程中賦值的。

引數mmeasuredwidth、mmeasuredheight兩個引數是在view.measure()過程中賦值的。

public

final

intgetwidth()

public

final

intgetheight()

public

final

intgetmeasuredwidth()

public

final

intgetmeasuredheight()

measure 過程,必須得先遍歷並測量子 view 的尺寸大小,才能得出其父容器的 尺寸大小;而 layout 過程剛好相反,必須先確定了父容器的位置,其次才能確定子 view 的位置。

1. 以 linearlayout 為例,measure 流程對應**:

// linearlayout.class

protected

void

onmeasure

(int widthmeasurespec,

int heightmeasurespec)

else

}void

measurevertical

(int widthmeasurespec,

int heightmeasurespec)

2. 以 linearlayout 為例,layout 流程對應**:

// linearlayout.class

public

void

layout

(int l,

int t,

int r,

int b)

// ...省略**...

}protected

void

onlayout

(boolean changed,

int l,

int t,

int r,

int b)

else

}void

layoutvertical

(int left,

int top,

int right,

int bottom)

}private

void

setchildframe

(view child,

int left,

int top,

int width,

int height)

View框架之layout 流程

注意 rootview是乙個framelayout,所以也是乙個viewgroup 這裡的的host就是我們的根布局decorview,因為decorview是乙個framelayout,而layout 是view中被修飾final的方法,所以我們這裡呼叫的是view的layout的方法,layou...

View工作流程 layout過程

一 layout過程 layout作用是viewgroup用來確定子元素位置。當viewgroup確定後會在onlayout中遍歷所有子元素並呼叫其layout方法,子元素的layout又會呼叫onlayout。這點和measure的過程很相似。二 view的getmeasuredwidth和get...

三 view載入流程

注意 如果沒有指定nibname,也沒有重寫loadview方法,且控制器的類名以controller結尾 就會執行一下操作 1.判斷下有沒有指定nibname,如果指定了,就會去載入指定的xib 2.判斷下有沒有跟控制器類名同名的的xib,但是字尾不帶controllerde controller...