作為菜鳥,以下只是總結(jié)了一些布局中的屬性和一些不成熟的見解,并沒有對(duì)各種布局進(jìn)行更高級(jí)更詳細(xì)的分析,而且我也不會(huì)。后面倒有一個(gè)大神stormzhang對(duì)Android布局方式優(yōu)化的博文,大家可以去看看。
對(duì)于Android的布局方式,其實(shí)常用到的布局也就三種(LinearLayout、RelativeLayout、FrameLayout)。
屬性有無Layout前綴的區(qū)別
- 有Layout:表示在父控件中的 ...
- 無Layout:表示在控件內(nèi)部的 ...
LinearLayout(線性布局)
布局層次如果和使用RelativLayout的層次一樣,建議使用LinearLayout,因?yàn)長inearLayout的性能要好一些
常用屬性:
orientation:布局中組件的排列方式,有horizontal(水平)、vertical(豎直,默認(rèn))兩種方式
gravity:控制組件所包含的子元素的對(duì)齊方式,可多個(gè)組合,如(left|bottom)
layout_gravity:控制該組件在父容器里的對(duì)齊方式
background:為給組件設(shè)置一個(gè)背景顏色或背景圖片
** layout_weight(權(quán)重):用來等比例劃分區(qū)域 **
首先分配好控件聲明的尺寸,然后再將剩下的尺寸按weight進(jìn)行分配
比例:控件尺寸 + 父控件剩余尺寸 * 權(quán)重值/布局中的權(quán)重值之和
(分割線):
divider:為LinerLayout設(shè)置分割線的圖片
showDividers:設(shè)置分割線的位置,有四個(gè)可選值(none,middle,begining,end)
dividerPadding:設(shè)置分割線的padding
RelativeLayout(相對(duì)布局)
對(duì)于一些復(fù)雜的布局方式,使用相對(duì)布局是最容易實(shí)現(xiàn)的
常用屬性:
gravity:設(shè)置容器內(nèi)組件的對(duì)齊方式
ignoreGravity:設(shè)置該屬性為true的組件,將不受gravity屬性的影響
** 相對(duì)布局里的控件定位屬性:**
根據(jù)父容器定位:
layout_alignParentLeft:左對(duì)齊(true|false)
layout_alignParentRight:右對(duì)齊(true|false)
layout_alignParentTop:頂部對(duì)齊(true|false)
layout_alignParentBottom:底部對(duì)齊(true|false)
layout_centerHorizontal:水平居中(true|false)
layout_centerVertical:垂直居中(true|false)
layout_centerInParent:中間位置(true|false)
根據(jù)兄弟組件定位:
layout_toLeftOf:參考組件的左邊( @id/..)
layout_toRightOf:參考組件的右邊(@id/..)
layout_above:參考組件的上方(@id/..)
layout_below:參考組件的下方(@id/..)
layout_alignTop:對(duì)齊參考組件的上邊界(@id/..)
layout_alignBottom:對(duì)齊參考組件的下邊界(@id/..)
layout_alignLeft:對(duì)齊參考組件的左邊界(@id/..)
layout_alignRight:對(duì)齊參考組件的右邊界(@id/..)
FrameLayout(幀布局):
可以動(dòng)態(tài)地為幀布局添加View或者一個(gè)布局文件。幀布局的子控件式以棧的形式進(jìn)行存放的,最后添加到布局中的子控件在棧的頂部,可以實(shí)現(xiàn)刮刮樂等的效果
常用屬性:
foreground:設(shè)置該幀布局容器的前景圖像
foregroundGravity:設(shè)置前景圖像顯示的位置(* 前景圖像永遠(yuǎn)處于幀布局的最上面,直接面對(duì)用戶的圖像,就是不會(huì)被覆蓋的圖片* )
GridLayout(網(wǎng)格布局)
可以實(shí)現(xiàn)控件的交錯(cuò)顯示,例如計(jì)算器等
常用屬性:
orientation(排列方式):vertical(豎直,默認(rèn))、horizontal(水平)
rowCount:設(shè)置網(wǎng)格的行數(shù)
columnCount:設(shè)置網(wǎng)格的列數(shù)
layout_row:設(shè)置組件位于第幾行(以0開始計(jì)算)
layout_column:設(shè)置組件位于第幾列(以0開始計(jì)算)
layou_rowSpan:橫跨多少行(合并行)
layout_column:橫跨多少列(合并列)
** TableLayout(表格布局) **
較少使用
常用屬性:
collapseColumns:設(shè)置需要隱藏的列的序號(hào)
shrinkColumns:設(shè)置允許被收縮的列的列序號(hào)
stretchColumns:設(shè)置允許被拉伸的列的列序號(hào)
layout_span="2":合并兩個(gè)單元格
**AbsoluteLayout(絕對(duì)布局) **
一般不會(huì)使用它來布局,知道就可以了
常用屬性:
layout_x:設(shè)置組件的X坐標(biāo)
layout_y:設(shè)置組件的y坐標(biāo)
** 布局優(yōu)化 **
盡量多使用RelativeLayout和LinearLayout, 不要使用絕對(duì)布局AbsoluteLayout,在布局層次一樣的情況下, 建議使用LinearLayout代替RelativeLayout, 因?yàn)長inearLayout性能要稍高一點(diǎn),但往往RelativeLayout可以簡(jiǎn)單實(shí)現(xiàn)LinearLayout嵌套才能實(shí)現(xiàn)的布局。
- 將可復(fù)用的組件抽取出來并通過include標(biāo)簽使用;
- 使用ViewStub標(biāo)簽來加載一些不常用的布局;
- 使用merge標(biāo)簽減少布局的嵌套層次;
詳情請(qǐng)參考stormzhang的博文,里面已經(jīng)說的很詳細(xì)了而且也很容易理解
Android布局優(yōu)化