ConstrainLayout 是 AndroidStudio2.2 的新特性,能夠很方便的用于可視化開(kāi)發(fā),有點(diǎn)類似于 ios 的 storyboard咳焚,解決了 xml 過(guò)于復(fù)雜的問(wèn)題泉哈。
約束
相對(duì)定位(Relative positioning)
也就是我們之前常用的relativelayout
,屬性也與其一致肖粮,使用方法如:layout_constraintLeft_toLeftOf
孤页,位置用一張圖片解釋。
邊距(Margins)
同之前的margin
使用方法涩馆。
-
goneMargin
簡(jiǎn)單的解釋行施,就是當(dāng)位置約束的目標(biāo)可見(jiàn)性為View.Gone時(shí),可以調(diào)整它的邊距值變?yōu)榕c父布局的margin值魂那。下文將有示例解釋蛾号。
居中定位(Centering positioning)
通過(guò)定義上下左右的相鄰控件或父容器來(lái)設(shè)置居中⊙难牛可以形象的理解為兩個(gè)大小相同鲜结,方向相反的力作用在控件上。如下活逆,通過(guò)定義top, bottom, start, end就可以使textview在parent居中顯示精刷。
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
傾向(bias)
搭配bias,就像兩個(gè)力大小不相等蔗候,使其往一個(gè)方向靠攏怒允。layout_constraintHorizontal_bias
:水平偏向layout_constraintVertical_bias
:垂直偏向0為最左上,1為最右下琴庵,默認(rèn)為0.5误算。
圓定位(Circular positioning)(1.1新特性)
可以理解為以一個(gè)控件為圓心,設(shè)定半徑和角度迷殿,決定另一個(gè)控件的位置儿礼。如圖layout_constraintCircle
: 參照的控件id(圓心)layout_constraintCircleRadius
: 距離參照物的距離(兩控件中心點(diǎn)間距離)layout_constraintCircleAngle
: 偏移角度(0為正上方,0~360)
可見(jiàn)性行為(Visibility behavior)
這是針對(duì)View.GONE
的特定處理庆寺。Gone隱藏的控件蚊夫,會(huì)被當(dāng)成一個(gè)點(diǎn),同時(shí)忽略margin懦尝。如圖知纷。
當(dāng)A消失時(shí)壤圃,B的邊距將為原來(lái)與A的約束邊距。
另一種方法琅轧,用goneMargin生成新的邊距伍绳,而原來(lái)與A的約束邊距將不起作用。
這種特定的行為可以做到特殊的布局乍桂,比如上圖A消失時(shí)B位置不變冲杀,設(shè)A寬度為100,邊距為10睹酌,B對(duì)A約束為20权谁,那么goneMargin=100+10+20=130,則可以實(shí)現(xiàn)A隱藏后B位置不變憋沿。
尺寸約束(Dimensions constraints)
可以定義ConstraintLayout布局的尺寸
可以定義控件的尺寸旺芽,有三種方式:
- 確定尺寸:123dp
WRAP_CONTENT
0dp
0dp,相當(dāng)于match_constraint辐啄,意思就是填滿約束的空間采章。如果設(shè)置了margin值,也需要去掉margin的空間壶辜。
比例(Ratio)
可以按比例設(shè)置控件的寬高共缕,定義其中一個(gè)維度為0dp,并設(shè)置屬性
layout_constraintDimensionRatio
士复,值可以為0~1的浮點(diǎn)數(shù)或比例x:x图谷。可以設(shè)置兩個(gè)維度均為0dp,同時(shí)在ratio值前加W或H分別約束寬度或高度阱洪。
<Button android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="H,16:9"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
- 如上便贵,將以button的最大約束寬度,16:9的比例定義button的高度
鏈條(Chains)
將一個(gè)維度的一組控件組成一個(gè)鏈條冗荸,另一個(gè)維度可以單獨(dú)控制承璃,相當(dāng)于綁成一個(gè)組件。
-
一組部件通過(guò)雙向連接就形成一個(gè)鏈條蚌本。
-
水平鏈的最左邊和豎直鏈的最上邊成為鏈頭盔粹。
如果連接中設(shè)置了margin,要考慮在內(nèi)程癌。
-
鏈條樣式(Chain Style)
給鏈條第一個(gè)元素設(shè)置屬性
layout_constraintHorizontal_chainStyle
或layout_constraintVertical_chainStyle
舷嗡,則鏈條會(huì)根據(jù)樣式更改。(默認(rèn)CHAIN_SPREAD
)spread
:元素間分散開(kāi)spread_inside
:端點(diǎn)除外嵌莉,元素間分散開(kāi)进萄,如上圖區(qū)別packed
:元素間打包,即貼在一起
-
權(quán)重鏈(Weighted chains)
類似
LinearLayout
里的WEIGHT
屬性,若元素使用MATCH_CONSTRAINT
中鼠,就是這些元素使用約束后的空間可婶。layout_constraintHorizontal_weight
layout_constraintVertical_weight
虛擬輔助元素(Virtual Helper objects)
可以使用輔助對(duì)象來(lái)創(chuàng)建相對(duì)約束,可以通過(guò)水平或垂直的Guideline
來(lái)定位控件援雇。
-
Guideline
不會(huì)被顯示矛渴,只會(huì)輔助布局
-
定位
Guideline
有三種方式:layout_constraintGuide_begin
:距離左側(cè)或頂部的固定距離layout_constraintGuide_end
:距離右側(cè)或底部的固定距離layout_constraintGuide_percent
:父控件的高度或?qū)挾鹊陌俜直?/p>
可視化操作
約束控鍵類型
調(diào)整尺寸大小:正方形四角
側(cè)邊約束:四邊圓形惫搏,約束四邊的位置
基線約束:文字下方條狀曙旭,用于對(duì)齊文字
添加約束
- 點(diǎn)擊控鍵,選中圓點(diǎn)拖動(dòng)到要約束的位置晶府。如圖,要將控件放于左上角钻趋,將左邊和上邊分別拉到屏幕邊緣即可川陆。
- 兩個(gè)控件間添加約束,要將第二個(gè)textview放于第一個(gè)的下方蛮位,只需要將左邊約束對(duì)齊较沪,上邊約束到第一個(gè)textview的下方即可。要注意的是失仁,添加完約束后尸曼,會(huì)有一個(gè)默認(rèn)margin值,導(dǎo)致左邊沒(méi)對(duì)齊萄焦,此時(shí)在右側(cè)的Attributes中將margin調(diào)為0即可控轿。
刪除約束
-
刪除單個(gè)約束:點(diǎn)擊具體的約束發(fā)起點(diǎn)即可刪除。
刪除單個(gè)控件的所有約束:點(diǎn)擊控件拂封,在左下方有刪除所有約束的按鈕茬射,點(diǎn)擊即可。
-
刪除整個(gè)界面的所有約束:在上方工具欄找到
按鈕即可刪除冒签。
Inspector的使用
這個(gè)界面就是控件的屬性在抛。我們除了可以修改一些基本屬性,還有一些新的功能萧恕。
-
修改尺寸
這里有三種尺寸描述方式:
-
:wrap_content
-
:固定數(shù)值(100dp)
-
:match_constraint
關(guān)于這三個(gè)屬性的區(qū)別上面已經(jīng)解釋過(guò)刚梭,大家看動(dòng)圖可以觀察出區(qū)別。
-
-
調(diào)整bias
滑動(dòng)那個(gè)滑塊調(diào)節(jié)即可票唆。
-
使用guideline
可以使用guideline進(jìn)行百分比布局朴读,再不用擔(dān)心適配問(wèn)題了。
-
自動(dòng)添加約束
在上方的工具欄找到
走趋,就可以開(kāi)啟AutoConnect磨德,雖然有時(shí)候可能不能達(dá)到你想要的布局,但大部分時(shí)候可以減輕你的工作量。
總結(jié)
參考官方文檔
用constraintLayout可以完全替換掉之前的linearLayout和relativeLayout典挑,使用也很方便酥宴,希望能幫大家快速上手。