注意命名都要小寫~android
1.LinearLayout線性佈局佈局
線性佈局是指子控件以水平或垂直方式排列。先看這樣的一個線性佈局:post
從圖中能夠直觀的看出,這個線性佈局中的三個button是垂直排列的的,決定子控件的排布方向的屬性就是android:orientation,它有兩個選項,vertical表示垂直排列,horizontal表示水平排列,注意這個屬性是在這整個LinearLayout標籤之下的,是全局屬性。性能
另外,佈局和佈局之間是能夠嵌套的,好比下圖中展現的線性佈局中又嵌套一個線性佈局,外線性佈局的orientation使得內線性佈局和三個button以vertical方式排布,內線性佈局的orientation使得它本身的三個button以horizonal方式排布。學習
再介紹一組很重要的屬性:spa
android:gravity(表示這個容器裏全部子類控件的統一排布方式,有如下幾個經常使用個選值,center水平和垂直方向均居中、center_vertical垂直居中、center_horizontal水平居中、right最右、left最左、bottom最下,可用符號 | 實現多級連用,如android:gravity=「bottom|right").net
android:layout_gravity(表示這個子控件相對於父容器的位置。可選值和gravity相同,也可多級聯用。固然這些選值使得子控件是在它父容器裏可得到的空間裏進行的,若是這個控件周圍還有別的控件可能會影響子控件的位置)3d
這兩個屬性很容易混淆,直觀來看它們的差異是針對的對象不一樣。gravity是對它全部直接的子類的一個統一排布,子類的子類位置須要子類去統一排布,好比一個學校要上課間操,學校要求全部的學生以班級爲單位都到操場的東南角活動,至於這個班級裏全部學生是否是在班級活動區域的東南角學校管不着,班級要求全班同窗那才能夠。那若是這個班某個同窗是體委,不和你們都去東南角活動,而是在西南角管理班級呢?這時要對體委用layout_gravity屬性,layout_gravity針對的對象是使用這個屬性的控件,控制這個控件相對於直接父容器的位置。那麼下面這四行代碼以後的button1位置是否是就很好理解了?cdn
最後再介紹一個局部屬性 android:layout_weight,是指子類控件佔當前父容器的比例,好比下圖顯示的button4佔兩份,button5和button6各佔一份,那麼它們的高之比就是2:1:1,但注意成立的條件是它們的高選值是wrap_content,若是是match_parent,那就成反比了。xml
2.RelativeLayout相對佈局
相對佈局是子控件以控件之間的相對位置或子類控件相對於父容器的位置排列。因此每一個子控件能夠經過兩種參考系來決定本身的位置。
一種是相對於父容器,相關的屬性有:
android:layout_alignParentBottom(在父容器最下,true或false)、
android:layout_alignParentTop(在父容器最上) 、
android:layout_alignParentLeft(在父容器最左) 、
android:layout_alignParentRight(在父容器最右)、
android:layout_marginTop(和父容器上端的距離,單位dp)、
android:layout_marginBottom(和父容器下端的距離)、
android:layout_marginLeft(和父容器左端的距離)、
android:layout_marginRight(和父容器右端的距離)、
android:layout_margin(和父容器四周的距離)、
android:layout_centerVertical(在父類的垂直居中,true或false)、
android:layout_centerHorizontal(在父類的水平居中)、
android:layout_centerInParent(在父類的水平垂直居中)。
一種是相對於其餘控件,相關的屬性有:
android:layout_below(位於某控件下方,以id標記)、
android:layout_above(位於某控件上方)、
android:layout_toLeftOf(位於某控件左方)、
android:layout_toRightOf(位於某控件右方)、
android:layout_alignBottom(與某控件底部對齊,以id標記)、
android:layout_alignTop(與某控件頂部對齊) 、
android:layout_alignLeft(與某控件左邊緣對齊) 、
android:layout_alignRight(與某控件右邊緣對齊)、
android:layout_alignBaseline(與某控件的文本內容在一條直線上)
注意相對佈局裏沒有layout_weight屬性,上面展現的第一種相對於父容器的屬性就就足夠。
如今考考本身,有沒有理解了下面這兩個button的位置關係了呢?
3.FrameLayout幀佈局
幀佈局是全部子控件均放在左上角且後面元素直接覆蓋在前面元素之上。兩個經常使用屬性:android:foreground(設置改幀佈局容器的前景圖像,前景圖像是永遠處於幀佈局最上面的圖像,就是不會被覆蓋的圖片) android:foregroundGravity(設置前景圖像顯示的位置)。爲更直觀,下圖裏展現的TextView都填充了顏色,能夠看出textView4在最上面。
可是幀佈局的這個性質有什麼特別的用處呢?當給每一個TextView都設置layout_gravity="center"以後,設想用一些方法使它們閃現不一樣顏色,是否是像個霓虹燈呢?感興趣的能夠好好研究幀佈局具體內容~
4.AbsoluteLayout絕對佈局
絕對佈局是子控件經過它x,y位置來決定其位置。即android:layout_x和android:layout_y屬性。可是絕對佈局不常見,用x和y決定的控件在不一樣大小的適配屏幕上的位置直觀上會變化,在一個屏幕上的右下角並不表明在另外一個屏幕上也是右下角,適應能力差,因此AS也告訴咱們不建議使用。
5.TableLayout表格佈局
表格佈局是以行列的形式管理子控件,每一行是一個TableRow對象或者View對象。注意列是從0計數,第一列記爲0。
先來看看幾個經常使用的全局屬性:
android:stretchColumns(讓第幾列填補一行中多餘的空白,若是多列一塊兒填補,用逗號分開,如android:stretchColumns=「2,3」表示地三列和第四列一塊兒填補空白,若是是所有列均分空白,值爲*)
android:shrinkColumns(若是一行中列太多或者某列文本內容太長,會致使某列被擠出屏幕,這個屬性幫助某列收縮防止被擠)
android:collapseColumns(隱藏某列) 經常使用的局部屬性有:
android:layout_column(讓該子類控件顯示在第幾列)
android:layout_span(讓該子類控件佔據幾列)
下圖是一個簡易計算器的佈局,第一行是以TextView對象爲一行,後面三行是以TableRow對象爲一行,而後用android:stretchColumns="*"就能很方便實現每行button都均勻的填補空白,使界面更美觀,若是用線性佈局實現這一點就要麻煩一點了。
6.GridLayout網格佈局
網格佈局是在Android 4.0之後引入的一個新的佈局,和表格佈局有點相似,但比表格佈局功能更強大一些。這有一篇 網格佈局GridLayout的那些事兒 對網格佈局有較詳細的講解,還有對錶格佈局的補充,能夠看成擴展閱讀。
7.ConstraintLayout 約束佈局
AS2.2以後新增的約束佈局,和以前出現的集中佈局不一樣的是,它很是適合使用可視化的方式來編寫界面,但並不太適合使用XML的方式來進行編寫。一樣的,這一部分推薦你們閱讀最全面的ConstraintLayout教程。
8.佈局原則:
(1)儘可能多使用線性佈局和相對佈局,不用絕對佈局。
(2)在佈局層次同樣下,線性佈局比相對佈局的性能要高。
(3)使用include標籤增長UI的複用效率:可把重複使用的控件抽取出來放在一個xml文件裏,並在須要它的xml文件裏經過include標籤引用。這樣作也保證了UI佈局的規整和易維護性。下圖是一個簡單的示例。
(4)使用ViewStub標籤減小布局的嵌套層次,它和include同樣能夠用來引入一個外部佈局,但不一樣的是,ViewStub引入的佈局不佔用位置,在解析layout佈局是節省了CPU和內存。可用inflate方法使之在佈局中顯示出來。下圖是一個簡單的示例。
(5)使用merge標籤下降UI佈局的嵌套層次:適用於佈局根節點是FrameLayout且不設置background和padding等額外屬性;當某個佈局做爲子佈局被其餘佈局include的時候可用merge看成該佈局的頂節點。
佈局篇就到這裏,感謝你們的觀看~
>下篇預告:組件篇之Activity