Android幾種常用布局詳解

寫(xiě)在前面

一直想寫(xiě)一寫(xiě)布局哆料,趁今天有空好好總結(jié)一下歹篓,留著以后看仰猖。

綜述

Android的布局有好多好多種券册,官方的、自定義的等等市咽,五花八門(mén)。原來(lái)安卓有五大基本布局抵蚊,現(xiàn)在共有六種施绎,前五種是傳統(tǒng)的,還有一種是比較新的贞绳。

五種傳統(tǒng)布局

  • LinearLayout(線性布局)
  • RelativeLayout(相對(duì)布局)
  • FrameLayout(幀布局)
  • AbsoluteLayout(絕對(duì)布局)
  • TableLayout(表格布局)

其中谷醉,最常用的布局是前三種,絕對(duì)布局用過(guò)一點(diǎn)冈闭,表格布局根本沒(méi)用過(guò)(可能會(huì)很好用吧俱尼,但是前幾種滿足了我的日常需求)

新布局

  • ConstraintLayout(約束布局)

谷歌爸爸在2016年新出的布局,現(xiàn)在取代RelativeLayout成了創(chuàng)建空Activity的默認(rèn)布局萎攒,非常非常強(qiáng)大遇八,操作非常簡(jiǎn)潔。

接下來(lái)主要對(duì)LinearLayout(線性布局)耍休、RelativeLayout(相對(duì)布局)刃永、FrameLayout(幀布局)、ConstraintLayout(約束布局)進(jìn)行介紹

一羊精、LinearLayout

0.簡(jiǎn)介

線性布局斯够,最常用的布局之一,所有包含在線性布局里的控件在線性方向上依次排列喧锦。接下來(lái)看看一些線性布局常用的屬性读规。

1.方向

在線性布局里面的控件,是按照線性的順序進(jìn)行排列的燃少,方向有兩種:橫向和縱向束亏。

屬性和屬性值

android:orientation="horizontal"   //水平
android:orientation="vertical"     //垂直

實(shí)例

//水平
android:orientation="horizontal"
水平
//垂直
android:orientation="vertical"
垂直

2.對(duì)齊方式

屬性

android:gravity
android:layout_gravity

需要注意的是,這兩個(gè)屬性是有區(qū)別的:
android:gravity是指本元素的子元素相對(duì)它的對(duì)齊方式,
android:layout_gravity是指本元素相對(duì)它的父元素的對(duì)齊方式供汛。
相同的枪汪,對(duì)于其他屬性涌穆,如果加上layout_前綴,就代表著本元素相對(duì)父元素的屬性雀久。

常用的屬性值:

  • android:gravity="center_horizontal" 子控件水平方向居中
  • android:gravity="center_vertical" 子控件豎直方向居中
  • android:gravity="center" 子控件豎直方向和水平方向居中
  • android:gravity= start || end || top || bottom 子控件左對(duì)齊 || 右對(duì)齊 || 頂部對(duì)齊 || 底部對(duì)齊
  • android:gravity= left || right 子控件左對(duì)齊 || 右對(duì)齊

這里的start和left屬性宿稀,end和right屬性需要注意一下,這里寫(xiě)的是對(duì)于中國(guó)的情況而言赖捌。實(shí)際上祝沸,他們兩個(gè)是不同的,left是絕對(duì)的左邊越庇,而start會(huì)根據(jù)不同的國(guó)家習(xí)慣改變罩锐。比如在從右向左順序閱讀的國(guó)家,start代表的就是在右邊

實(shí)例

效果一:第一個(gè)子控件設(shè)置水平垂直

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.icephone_1.layouttest.MainActivity">

    <TextView
        android:id="@+id/tx_one"
        android:textSize="30sp"
        android:layout_gravity="center_horizontal"  //子控件設(shè)置水平垂直
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <TextView
        android:id="@+id/tx_two"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

</LinearLayout>
一個(gè)子控件水平垂直

效果二:設(shè)置LinearLayout水平垂直

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"    //設(shè)置LinearLayout水平垂直
    tools:context="com.example.icephone_1.layouttest.MainActivity">

    <TextView
        android:id="@+id/tx_one"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <TextView
        android:id="@+id/tx_two"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

</LinearLayout>
布局水平垂直

3.子控件大小

屬性:

layout_height
layout_width
layout_weight

屬性值:

  • layout_height= "wrap_content" 根據(jù)子控件內(nèi)容的大小決定大小
  • layout_height= "match_parent" 子控件填滿父容器
  • layout_height= "xdp" 直接設(shè)置大小

比較特殊的:

  • layout_height= "0dp"
  • layout_weight= "1"
    當(dāng)為0dp大小時(shí)卤唉,需要配合weight使用涩惑,表示比例

實(shí)例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center"
    tools:context="com.example.icephone_1.layouttest.MainActivity">

    <TextView
        android:id="@+id/tx_one"
        android:textSize="30sp"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"        //設(shè)置占比例為1
        android:text="Hello World!" 
        android:background="#9c9292"/>
    <TextView
        android:id="@+id/tx_two"
        android:textSize="30sp"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"        //設(shè)置占比例為1
        android:text="Hello World!" 
        android:background="#0d6074"/>

</LinearLayout>

上面的代碼設(shè)置兩個(gè)TextView的weight值均為1,則這兩個(gè)TextView一人占一半空間


1 : 1

如果第一個(gè)設(shè)置成2呢桑驱,兩個(gè)空間水平位置占比就變成了2:1


2 : 1

二竭恬、RelativeLayout

0.簡(jiǎn)介

相對(duì)布局,也是非常常用的布局之一熬的,和LinearLayout嚴(yán)格的線性排列不同痊硕,相對(duì)布局更隨意,它可以讓子控件出現(xiàn)在整個(gè)布局的任何位置押框。屬性還是比較多的岔绸,不過(guò)很有規(guī)律,明白一個(gè)就明白了其他所有的橡伞。所以下面對(duì)屬性分類介紹盒揉。

1.屬性值為true或false

屬性和屬性值:


  android:layout_centerHrizontal 水平居中
  android:layout_centerVertical 垂直居中
  android:layout_centerInparent 相對(duì)于父元素完全居中
  android:layout_alignParentBottom 貼緊父元素的下邊緣
  android:layout_alignParentLeft 貼緊父元素的左邊緣
  android:layout_alignParentRight 貼緊父元素的右邊緣
  android:layout_alignParentTop 貼緊父元素的上邊緣  

看命名就能看出這個(gè)屬性是啥意思。align是排列的意思骑歹,alignParent就是排列在父容器的某個(gè)位置预烙。

實(shí)例:

把三個(gè)TextView上中下排列


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.icephone_1.layouttest.MainActivity">

    <TextView
        android:id="@+id/tx_one"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"

        android:text="Hello World!"
        android:background="#9c9292" />

    <TextView
        android:id="@+id/tx_two"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"

        android:text="Hello World!"
        android:background="#0d6074" />

    <TextView
        android:id="@+id/tx_three"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_centerInParent="true"

        android:text="Hello World!"
        android:background="#a73956" />

</RelativeLayout>

  • 使用的屬性用兩個(gè)空行標(biāo)示

這里需要注意的是,在最新版本的Andorid中道媚,單獨(dú)使用包含Start或者End屬性的話扁掸,會(huì)報(bào)錯(cuò),提示需要再加入Left和Right屬性最域;而單獨(dú)使用Left和Right屬性谴分,會(huì)提示一個(gè)warning,提示推薦加入Start或者End屬性


上 中 下

2.屬性值必須為id的引用名[“@id/id-name]

屬性和屬性值:


    android:layout_below 在某元素的下方
    android:layout_above 在某元素的的上方
    android:layout_toLeftOf 在某元素的左邊
    android:layout_toRightOf 在某元素的右邊
    android:layout_alignTop 本元素的上邊緣和某元素的的上邊緣對(duì)齊
    android:layout_alignLeft 本元素的左邊緣和某元素的的左邊緣對(duì)齊
    android:layout_alignBottom 本元素的下邊緣和某元素的的下邊緣對(duì)齊    
    android:layout_alignRight 本元素的右邊緣和某元素的的右邊緣對(duì)齊

根據(jù)另一個(gè)控件的位置來(lái)確定控件的位置镀脂。

實(shí)例:

把三個(gè)控件排成階梯狀

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.icephone_1.layouttest.MainActivity">

    <TextView
        android:id="@+id/tx_one"
        android:textSize="30sp"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        
        android:layout_alignStart="@+id/tx_three"
        android:layout_alignLeft="@+id/tx_three"
        android:layout_above="@+id/tx_three"
        
        android:text="Hello World!"
        android:background="#9c9292" />

    <TextView
        android:id="@+id/tx_two"
        android:textSize="30sp"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        
        android:layout_below="@+id/tx_three"
        android:layout_alignEnd="@+id/tx_three"
        android:layout_alignRight="@+id/tx_three"
        
        android:text="Hello World!"
        android:background="#0d6074" />

    <TextView
        android:id="@+id/tx_three"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        
        android:layout_centerInParent="true"       
        
        android:text="Hello World!"
        android:background="#a73956" />

</RelativeLayout>

可能是階梯的形狀

3.屬性值為具體的像素值牺蹄,如30dip,40px

屬性和屬性值:

    android:layout_marginBottom 離某元素底邊緣的距離
    android:layout_marginLeft 離某元素左邊緣的距離
    android:layout_marginRight 離某元素右邊緣的距離
    android:layout_marginTop 離某元素上邊緣的距離

這里需要注意薄翅,有一個(gè)padding屬性沙兰,和margin屬性非常相似氓奈,我原來(lái)總是把這兩個(gè)屬性搞混。

padding和margin屬性詳解
先看兩個(gè)單詞的釋義:
margin 邊緣
padding 襯墊鼎天,填充
然后應(yīng)該就能區(qū)分出這兩個(gè)屬性了舀奶,一個(gè)是邊緣(外邊距),指該控件距離父控件或其他控件的邊距斋射;另一個(gè)是填充(內(nèi)邊距)育勺,指該控件內(nèi)部?jī)?nèi)容,如文本/圖片距離該控件的邊距罗岖。

  • 貼一張圖:


    padding和margin
  • 再舉個(gè)栗子:

還是上面的代碼涧至,把兩個(gè)上下兩個(gè)控件改成相同的。


一樣啊

然后給下面的控件添加一些屬性桑包,讓內(nèi)邊距增加

    android:paddingTop="8dp"
    android:paddingLeft="20dp"
    android:paddingStart="60dp"

然后就變成這樣了:


添加padding

可以看到TextView里面的文字位置變化了南蓬。

如果添加margin屬性呢?

    android:layout_marginTop="8dp"
    android:layout_marginLeft="20dp"
    android:layout_marginStart="20dp"

值和padding一樣捡多,然后變成了這樣:


margin

可以看到TextView里面文字的位置并沒(méi)有發(fā)生變化蓖康,反而是TextView本身發(fā)生了變化。

自己寫(xiě)寫(xiě)Demo垒手,體會(huì)體會(huì)外邊距和內(nèi)邊距的區(qū)別吧。

三倒信、FrameLayout

0.幀布局

可能是最簡(jiǎn)單的一種布局科贬,沒(méi)有任何定位方式,當(dāng)我們往里面添加控件的時(shí)候鳖悠,會(huì)默認(rèn)把他們放到這塊區(qū)域的左上角榜掌,幀布局的大小由控件中最大的子控件決定,如果控件的大小一樣大的話乘综,那么同一時(shí)刻就只能看到最上面的那個(gè)組件憎账,后續(xù)添加的控件會(huì)覆蓋前一個(gè)。由于幀布局的特性卡辰,它的應(yīng)用場(chǎng)景并不是很多胞皱,不過(guò)它經(jīng)常配合Fragment使用。

1.屬性

android:foreground     //設(shè)置改幀布局容器的前景圖像
android:foregroundGravity     //設(shè)置前景圖像顯示的位置

實(shí)例:


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.icephone_1.layouttest.MainActivity">

    <TextView
        android:id="@+id/tx_one"
        android:textSize="30sp"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:text="Hello World!"
        android:background="#9c9292" />

    <TextView
        android:id="@+id/tx_two"
        android:textSize="30sp"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:text="Hello World!"
        android:background="#1c7649" />

    <TextView
        android:id="@+id/tx_three"
        android:textSize="30sp"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="Hello World!"
        android:background="#a73956" />

</FrameLayout>

效果

幀布局

四九妈、ConstraintLayout

0.約束布局

ConstraintLayout約束布局的含義: 根據(jù)布局中的其他元素或視圖, 確定View在屏幕中的位置, 受到三類約束, 即其他視圖, 父容器(parent), 基準(zhǔn)線(Guideline).


炫酷的約束布局

1.仔細(xì)想了想

還是算了吧QAQ
不寫(xiě)了反砌,前輩寫(xiě)的太好了.....
仔細(xì)研讀下面??的幾篇文章,收獲一定很大
ConstraintLayout完全解析
Android ConstraintLayout詳解
為什么ConstraintLayout代替其他布局?

五萌朱、參考資料

FrameLayout(幀布局)
Android布局

以上

隨意轉(zhuǎn)載宴树,注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晶疼,隨后出現(xiàn)的幾起案子酒贬,更是在濱河造成了極大的恐慌又憨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锭吨,死亡現(xiàn)場(chǎng)離奇詭異蠢莺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耐齐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)浪秘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人埠况,你說(shuō)我怎么就攤上這事耸携。” “怎么了辕翰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵夺衍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喜命,道長(zhǎng)沟沙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任壁榕,我火速辦了婚禮矛紫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牌里。我一直安慰自己颊咬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布牡辽。 她就那樣靜靜地躺著喳篇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪态辛。 梳的紋絲不亂的頭發(fā)上麸澜,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音奏黑,去河邊找鬼炊邦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛攀涵,可吹牛的內(nèi)容都是我干的铣耘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼以故,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜗细!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炉媒,失蹤者是張志新(化名)和其女友劉穎踪区,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吊骤,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缎岗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了白粉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传泊。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸭巴,靈堂內(nèi)的尸體忽然破棺而出眷细,到底是詐尸還是另有隱情,我是刑警寧澤鹃祖,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布溪椎,位于F島的核電站,受9級(jí)特大地震影響恬口,放射性物質(zhì)發(fā)生泄漏校读。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一祖能、第九天 我趴在偏房一處隱蔽的房頂上張望歉秫。 院中可真熱鬧,春花似錦养铸、人聲如沸端考。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扶供,卻和暖如春筛圆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椿浓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工太援, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扳碍。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓提岔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親笋敞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碱蒙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,509評(píng)論 25 707
  • 歡迎Follow我的GitHub, 關(guān)注我的CSDN. 其余參考Android目錄. 轉(zhuǎn)載請(qǐng)注明出處:http:/...
    passiontim閱讀 4,748評(píng)論 0 31
  • Android功能強(qiáng)大,界面華麗,但是眾多的布局屬性就害苦了開(kāi)發(fā)者赛惩,下面這篇文章結(jié)合了網(wǎng)上不少資料.第一類:屬性值...
    HangChen閱讀 4,844評(píng)論 0 24
  • 今日讀書(shū)目標(biāo)檢視:《思考致富》完成喷兼。 今日健康目標(biāo)檢視:完成篮绰。 今日個(gè)人成長(zhǎng)目標(biāo)檢視:完成薄荷英語(yǔ)閱讀。開(kāi)小組會(huì)季惯。...
    晨曦曉林閱讀 193評(píng)論 0 1
  • 【感悟】 1吠各、追求極致,成功是由多個(gè)因素構(gòu)成的勉抓。你只有全力以赴做好每個(gè)細(xì)節(jié)贾漏,才能使得成功有更大概率發(fā)生。 特別是對(duì)...
    i期待閱讀 196評(píng)論 0 0