來源:約束布局ConstraintLayout看這一篇就夠了
優(yōu)點
復(fù)雜的UI,可能會出現(xiàn)布局嵌套過多的問題土居,嵌套得越多枣购,設(shè)備繪制視圖所需的時間和計算功耗也就越多。
- ConstraintLayout使用起來比RelativeLayout更靈活擦耀,性能更出色棉圈。- - ---- - ConstraintLayout可以按照比例約束控件位置和尺寸,能夠更好地適配屏幕大小不同的機型眷蜓。
文本基線 layout_constraintBaseline_toBaselineOf
<TextView
android:id="@+id/TextView1"
.../>
<TextView
android:id="@+id/TextView2"
...
app:layout_constraintLeft_toRightOf="@+id/TextView1"
app:layout_constraintBaseline_toBaselineOf="@+id/TextView1"/>
角度定位
app:layout_constraintCircle="@+id/TextView1"
app:layout_constraintCircleAngle="120"(角度)
app:layout_constraintCircleRadius="150dp"(距離)
goneMargin
用于約束的控件可見性被設(shè)置為gone的時候使用的margin值
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/TextView1"
.../>
<TextView
android:id="@+id/TextView2"
...
app:layout_constraintLeft_toRightOf="@+id/TextView1"
app:layout_goneMarginLeft="10dp"
/>
</android.support.constraint.ConstraintLayout>
偏移
layout_constraintHorizontal_bias 水平偏移
layout_constraintVertical_bias 垂直偏移
要實現(xiàn)水平偏移分瘾,給TextView1的layout_constraintHorizontal_bias賦一個范圍為 0-1 的值,假如賦值為0吁系,則TextView1在布局的最左側(cè)德召,假如賦值為1,則TextView1在布局的最右側(cè)汽纤,假如假如賦值為0.5上岗,則水平居中,假如假如賦值為0.3蕴坪,則更傾向于左側(cè)肴掷。
尺寸約束
layout_constraintDimensionRatio 寬高比
在設(shè)置寬高比的值的時候,還可以在前面加W或H辞嗡,分別指定寬度或高度限制捆等。 例如:
app:layout_constraintDimensionRatio="H,2:3"指的是 高:寬=2:3
app:layout_constraintDimensionRatio="W,2:3"指的是 寬:高=2:3使用 0dp (MATCH_CONSTRAINT)
官方不推薦在ConstraintLayout中使用match_parent滞造,可以設(shè)置 0dp
鏈
ayout_constraintHorizontal_chainStyle來改變整條鏈的樣式续室。chains提供了3種樣式,分別是:
CHAIN_SPREAD —— 展開元素 (默認(rèn))谒养;
CHAIN_SPREAD_INSIDE —— 展開元素挺狰,但鏈的兩端貼近parent;
CHAIN_PACKED —— 鏈的元素將被打包在一起买窟。
<TextView
android:id="@+id/TextView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/TextView2"
app:layout_constraintHorizontal_weight="2" />
<TextView
android:id="@+id/TextView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@+id/TextView1"
app:layout_constraintRight_toLeftOf="@+id/TextView3"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_weight="3" />
<TextView
android:id="@+id/TextView3"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@+id/TextView2"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_weight="4" />
輔助工具
Optimizer
我們使用 MATCH_CONSTRAINT 時丰泊,ConstraintLayout 將對控件進行 2 次測量,ConstraintLayout在1.1中可以通過設(shè)置 layout_optimizationLevel 進行優(yōu)化始绍,可設(shè)置的值有:
none:無優(yōu)化
standard:僅優(yōu)化直接約束和屏障約束(默認(rèn))
direct:優(yōu)化直接約束
barrier:優(yōu)化屏障約束
chain:優(yōu)化鏈約束
dimensions:優(yōu)化尺寸測量Barrier
假設(shè)有3個控件ABC瞳购,C在AB的右邊,但是AB的寬是不固定的亏推,這個時候C無論約束在A的右邊或者B的右邊都不對学赛。當(dāng)出現(xiàn)這種情況可以用Barrier來解決年堆。Barrier可以在多個控件的一側(cè)建立一個屏障,如下所示:
這個時候C只要約束在Barrier的右邊就可以了盏浇,代碼如下:
<TextView
android:id="@+id/TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/TextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/TextView1" />
<android.support.constraint.Barrier
android:id="@+id/barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="right"
app:constraint_referenced_ids="TextView1,TextView2" />
<TextView
android:id="@+id/TextView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@+id/barrier" />
app:barrierDirection為屏障所在的位置变丧,可設(shè)置的值有:bottom、end绢掰、left痒蓬、right、start滴劲、top
app:constraint_referenced_ids為屏障引用的控件攻晒,可設(shè)置多個(用“,”隔開)
- Group
Group可以把多個控件歸為一組,方便隱藏或顯示一組控件班挖,舉個例子:
<TextView
android:id="@+id/TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/TextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@+id/TextView1" />
<TextView
android:id="@+id/TextView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/TextView2" />
現(xiàn)在有3個并排的TextView炎辨,用Group把TextView1和TextView3歸為一組,再設(shè)置這組控件的可見性聪姿,如下所示:
<android.support.constraint.Group
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
app:constraint_referenced_ids="TextView1,TextView3" />
- Placeholder
Placeholder指的是占位符焰扳。在Placeholder中可使用setContent()設(shè)置另一個控件的id霜浴,使這個控件移動到占位符的位置。舉個例子:
<android.support.constraint.Placeholder
android:id="@+id/placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:content="@+id/textview"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#cccccc"
android:padding="16dp"
android:text="TextView"
android:textColor="#000000"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
新建一個Placeholder約束在屏幕的左上角,新建一個TextView約束在屏幕的右上角超营,在Placeholder中設(shè)置 app:content="@+id/textview",這時TextView會跑到屏幕的左上角届囚。效果如下:
- Guideline
Guildline像輔助線一樣脏嚷,在預(yù)覽的時候幫助你完成布局(不會顯示在界面上)。
Guildline的主要屬性:
android:orientation 垂直vertical擎场,水平horizontal
layout_constraintGuide_begin 開始位置
layout_constraintGuide_end 結(jié)束位置
layout_constraintGuide_percent 距離頂部的百分比(orientation = horizontal時則為距離左邊)
<android.support.constraint.Guideline
android:id="@+id/guideline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="50dp" />
<android.support.constraint.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
guideline1為水平輔助線羽德,開始位置是距離頂部50dp,guideline2位垂直輔助線迅办,開始位置為屏幕寬的0.5(中點位置)宅静,效果如下: