Android中布局詳細講解

2021-07-09 07:12:09 字數 2422 閱讀 7800

對view進行布局的目的是計算出view的尺寸以及在其父控制項中的位置,具體來說就是計算出view的四條邊界分別到其父控制項左邊界、上邊界的距離,即計算view的left、top、right、bottom的值。

layout()方法是view布局的入口,其原始碼如下所示:

public

void

layout(int l, int t, int r, int b)

int oldl = mleft;

int oldt = mtop;

int oldb = mbottom;

int oldr = mright;

//如果islayoutmodeoptical()返回true,那麼就會執行setopticalframe()方法,

//否則會執行setframe()方法。並且setopticalframe()內部會呼叫setframe(),

//所以無論如何都會執行setframe()方法。

//setframe()方法會將view新的left、top、right、bottom儲存到view的成員變數中

//並且返回乙個boolean值,如果返回true表示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中移除強制layout的標籤pflag_force_layout

mprivateflags &= ~pflag_force_layout;

//向mprivateflags3中加入layout完成的標籤pflag3_is_laid_out

mprivateflags3 |= pflag3_is_laid_out;

}

setframe()方法是具體用來完成給view分配尺寸以及位置工作的,在layout()方法中會呼叫setframe()方法。其原始碼如下所示:

protected

boolean

setframe(int left, int top, int right, int bottom)

if (mleft != left || mright != right || mtop != top || mbottom != bottom)

if ((mviewflags & visibility_mask) == visible || mghostview != null)

// 重新恢復mprivateflags中原有的pflag_drawn標籤資訊

mprivateflags |= drawn;

mbackgroundsizechanged = true;

if (mforegroundinfo != null)

notifysubtreeaccessibilitystatechangedifneeded();

}return changed;

}

sizechange方法會在view的尺寸發生變化時呼叫,在setframe()方法中就可能會呼叫sizechange()方法。當然,在view的setleft()、settop()、setright()、setbottom()等其他改變view尺寸的方法中也會呼叫sizechange()方法,其原始碼如下所示:

private

void

sizechange(int newwidth, int newheight, int oldwidth, int oldheight)

rebuildoutline();

}

在該方法中其主要將view的新舊尺寸傳遞給onsizechanged()方法使其執行。

onsizechanged()方法是個空方法,**如下所示:

protected

void

onsizechanged(int w, int h, int oldw, int oldh)

該方法會在view的尺寸發生變化時,通過sizechange()方法的執行而被呼叫。當view第一次加入到view樹中時,該方法也會被呼叫,只不過傳入的舊尺寸oldwidth和oldheight都是0。

layout方法總的呼叫過程主線如下所示:

layout() -> onmeasure() -> setframe() -> sizechange() -> onsizechanged() -> onlayout() ->遍歷執行onlayoutchangelistener.onlayoutchange()

彈性布局詳細講解

wrap width 1200px height 200px display flex border 1px solid 000 或者把容器變為行內元素 wrap width 1200px height 200px display inline flex border 1px solid 000 彈...

超詳細的Flex布局講解

應用在 flex items上的 css 屬性 flex布局是目前web開發中使用最多的布局方案 兩個重要的概念 開啟flex布局的方法 flex布局的相容性 注意 預設情況下felx items 僅在一行中顯示,若是設定flex wrap設定為多行,那麼,當flex items 到達main en...

閆剛 Android線性布局講解

file xml xmlns android android layout width match parent android layout height match parent android orientation vertical android id id button1 android...