當(dāng)android:orientation="vertical"時(shí),子View只有水平方向的設(shè)置生效提佣,當(dāng)android:orientation="horizontal"時(shí),子View只有垂直方向的設(shè)置生效。父元素設(shè)置的gravity優(yōu)先級(jí)要低于子元素設(shè)置的layout_gravity缤削。
1、線性布局中的元素屬性
android:gravity 表示該組件的子元素的對(duì)齊方式
android:layout_gravity 表示該組件在其父元素內(nèi)的對(duì)其方式
android:layout_width 表示該組件寬度
android:layout_height 表示該組件高度
android:id 表示該組件資源id
android:background 表示該組件背景
android:weight 表示該組件的權(quán)重
android:layout_margin 外邊距
android:layout_padding 內(nèi)邊距
2吹榴、weight(權(quán)重)屬性詳解:
LinearLayout有一個(gè)權(quán)重?cái)?shù)量的標(biāo)記:weightSum亭敢,在LinearLayout中沒有聲明weightSum時(shí),默認(rèn)的就是各個(gè)控件權(quán)重的總和
①最簡單用法:
如圖:
實(shí)現(xiàn)代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"? ?
? ? xmlns:tools="http://schemas.android.com/tools"? ?
? ? android:id="@+id/LinearLayout1"? ?
? ? android:layout_width="match_parent"? ?
? ? android:layout_height="match_parent"? ?
? ? android:orientation="horizontal">?
? ? <LinearLayout? ?
? ? ? ? android:layout_width="0dp"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:background="#ADFF2F"? ?
? ? ? ? android:layout_weight="1"/>? ?
? ? <LinearLayout? ?
? ? ? ? android:layout_width="0dp"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:background="#DA70D6"? ?
? ? ? ? android:layout_weight="2"/>? ?
? ? ? ? </LinearLayout>?
要實(shí)現(xiàn)第一個(gè)的1:1的效果图筹,只需要分別把兩個(gè)LinearLayout的weight改成1和1就可以了帅刀。 按比例劃分水平方向:將涉及到的View的android:width屬性設(shè)置為0dp,然后設(shè)置為android weight屬性設(shè)置比例即可远剩,如果是豎直方向,只需設(shè)android:height為0dp扣溺,然后設(shè)weight屬性即可。
②weight屬性詳解:
當(dāng)然,如果我們不適用上述那種設(shè)置為0dp的方式瓜晤,直接用wrap_content和match_parent的話锥余,則要接著解析weight屬性了,分為兩種情況:wrap_content與match_parent痢掠。另外還要看 LinearLayout的orientation是水平還是豎直驱犹,這個(gè)決定哪個(gè)方向等比例劃分嘲恍。
1)wrap_content比較簡單,直接就按比例的了
實(shí)現(xiàn)代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"? ?
? ? xmlns:tools="http://schemas.android.com/tools"? ?
? ? android:id="@+id/LinearLayout1"? ?
? ? android:layout_width="match_parent"? ?
? ? android:layout_height="match_parent"?
? ? android:orientation="horizontal" >? ?
? ? <TextView? ?
? ? ? ? android:layout_weight="1"? ?
? ? ? ? android:layout_width="wrap_content"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:text="one"? ?
? ? ? ? android:background="#98FB98"? ?
? ? />? ?
? ? <TextView? ?
? ? ? ? android:layout_weight="2"? ?
? ? ? ? android:layout_width="wrap_content"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:text="two"? ?
? ? ? ? android:background="#FFFF00"? ?
? ? />? ?
? ? <TextView? ?
? ? ? ? android:layout_weight="3"? ?
? ? ? ? android:layout_width="wrap_content"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:text="three"? ?
? ? ? ? android:background="#FF00FF"? ?
? ? />? ?
? ? </LinearLayout>?
2)match_parent(fill_parent):這個(gè)則需要計(jì)算了
我們寫這段簡單的代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"? ?
? ? xmlns:tools="http://schemas.android.com/tools"? ?
? ? android:id="@+id/LinearLayout1"? ?
? ? android:layout_width="match_parent"? ?
? ? android:layout_height="match_parent" >? ?
? ? <TextView? ?
? ? ? ? android:layout_weight="1"? ?
? ? ? ? android:layout_width="fill_parent"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:text="one"? ?
? ? ? ? android:background="#98FB98"? ?
? ? />? ?
? ? <TextView? ?
? ? ? ? android:layout_weight="2"? ?
? ? ? ? android:layout_width="fill_parent"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:text="two"? ?
? ? ? ? android:background="#FFFF00"? ?
? ? />? ?
? ? <TextView? ?
? ? ? ? android:layout_weight="3"? ?
? ? ? ? android:layout_width="fill_parent"? ?
? ? ? ? android:layout_height="fill_parent"? ?
? ? ? ? android:text="three"? ?
? ? ? ? android:background="#FF00FF"? ?
? ? />? ?
? ? </LinearLayout>
運(yùn)行效果圖:
系統(tǒng)先給第1個(gè)子控件分配parent_width(剩余空間),再給第2個(gè)分配parent_width雄驹,再給第3個(gè)分配parent_width佃牛,即分配了3個(gè)parent_width,此時(shí)剩余空間為 parent_width - 3parent_width = -2parent_width医舆。接著吁脱,第一個(gè)控件占寬度:parent_width(當(dāng)前已有寬度)+ 權(quán)重1/6*(-2parent_width) = 2/3parent_width;第二個(gè)控件占寬度:parent_width + 權(quán)重1/3*(-2parent_width) = 1/3parent_width彬向;第三個(gè)控件占寬度:parent_width + 權(quán)重1/2*(-2parent_width) = 0parent_width兼贡。得出公式:C表示子布局聲明的大小,B表示剩余布局的大小娃胆,P表示子布局占據(jù)父布局剩余布局的比例遍希,則子布局最終的實(shí)際大小R為:R = C + B * P。
0dp與wrap_content
谷歌官方建議使用0dp里烦,來分比例顯示布局凿蒜,和wrap_content大同小異,當(dāng)使用layout_weight時(shí)胁黑,都表示占據(jù)剩余寬度或高度的比重废封。
但兩者有明顯區(qū)別。
使用0dp時(shí)丧蘸,要考慮所分配的布局寬度是否小于控件實(shí)際寬度漂洋,比如:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/linear_layout"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@android:color/holo_blue_dark"android:padding="5dp"android:text="left"/><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="19"android:background="@android:color/holo_green_dark"android:gravity="center"android:padding="5dp"android:text="right"/></LinearLayout>
則顯示為如下:
而使用wrap_content則不會(huì)出現(xiàn)上面的那種情況
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/linear_layout"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@android:color/holo_blue_dark"android:padding="5dp"android:text="left"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="19"android:background="@android:color/holo_green_dark"android:gravity="center"android:padding="5dp"android:text="right"/></LinearLayout>
這里left先獲取自適應(yīng)的大小,然后再去獲取剩余布局的1/20力喷。
0dp與match_parent
可以發(fā)現(xiàn)match_parent是與0dp的效果是相反的
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/linear_layout"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:background="@android:color/holo_blue_dark"android:padding="5dp"android:text="left"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="2"android:background="@android:color/holo_green_dark"android:gravity="center"android:padding="5dp"android:text="right"/></LinearLayout>
權(quán)重計(jì)算:
控件的實(shí)際大小 = 控件設(shè)定的大小 + (布局剩余的大小) * 布局的比例
布局剩余的大小 = 父布局的大小 - 子布局大小之和
3刽漂、LinearLayout 設(shè)置分割線
(1)直接在布局中添加一個(gè)view,作用僅僅是顯示出一條線
<View ?
? ? android:layout_width="match_parent" ?
? ? android:layout_height="1px" ?
? ? android:background="#000000" />
(2)使用LinearLayout的divider屬性
第一步準(zhǔn)備一張分割線的圖片弟孟;第二步 android:divider 設(shè)置作為分割線的圖片贝咙;第三步 android:showDividers 設(shè)置分割線的位置,none(無)拂募、begining(開始)庭猩、end(結(jié)束)、middle(每兩個(gè)組件之間)陈症;第四步 android:dividerPadding 設(shè)置分割線的Padding蔼水。
android:divider="@drawable/cut_off_rule"
android:showDividers="middle"
android:dividerPadding="5dp"