三、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...