ConstraintLayout約束佈局學習筆記
我對ConstraintLayout理解就是RelativeLayout相對佈局的升級版,基本上可完全取代相對佈局,而且和iOS中storyBoard中的AutoLayout有異曲同工之妙,下面總結的主要是與相對佈局的異同點,方便自己檢視。
屬性值
屬性名都形如layout_constraintXXX_toYYYOf
1、當XXX和YYY相同時,表示控制元件自身的XXX與約束控制元件的YYY的對齊
app:layout_constraintTop_toTopOf="@+id/btn_xxx"
表示當前控制元件的頂部與id為btn_xxx頂部對齊
2、當XXX和YYY相反時,表示控制元件自身的XXX在約束控制元件的YYY的一側,
例如
app:layout_constraintLeft_toRightOf="@id/buttonA"
表示的是控制元件自身的左側在buttonA的右側
ID取值
1、子控制元件和子控制元件之間的約束
和 子控制元件和Guideline(新增的Guideline其實就是一個在螢幕上不顯示的View,可用於輔助約束)的約束引數取值是 ID(@id/btn_xxx)(相對約束的控制元件ID,如:
app:layout_constraintTop_toTopOf="@+id/btn_xxx"
但如果是為了加鏈條的話,可能需要寫成,詳見鏈條部分
app:layout_constraintBottom_toTopOf="@+id/buttonB"
2、子控制元件和父控制元件的約束 是”parent”,如:
app:layout_constraintBottom_toBottomOf="parent"
Margins
1、margin和以往的使用一致,注意margin不能為負值
margin的方向需要和layout_constraintXXX_toYYYOf搭配使用
例如:
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="100dp"
在相對佈局中可以省略掉
app:layout_constraintTop_toTopOf="parent"
也能有margin效果,但是約束佈局中不能省略
2、比相對佈局多了一個屬性layout_goneMarginXXX(xxx取值為start等等),此屬性與 android:layout_marginXXX配合使用,“xxx”要一致,它在與之約束的控制元件消失(gone)的時候才會生效
尺寸約束
- 可以為ConstraintLayout 自身定義最小的尺寸,他會在 ConstraintLayout為WRAP_CONTENT時起作用。
android:minWidth
android:minHeight
- 用0dp意思是MATCH_CONSTRAINT。在指定方向,鋪滿約束裡的區域,效果類似以前的MATCH_PARENT。其餘用法跟以前一樣。
android:layout_width="0dp"
上面程式碼會在水平方向約束條件內鋪滿
比例
以比例去定義View的寬高,需要將至少一個約束維度設定為0dp(即MATCH_CONSTRAINT,而且如果兩個維度均設定為MATCH_CONSTRAINT(0dp),也可以使用比例。 在這種情況下,系統會使用滿足所有約束條件和比率的最大尺寸。)
並將屬性layout_constraintDimentionRatio設定為給定的比例。預設值是寬比高,如:
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="3:1"
如果需要根據一個維度的尺寸去約束另一個維度的尺寸。
則可以在比率值的前面新增 W 或者 H 來分別約束寬度或者高度。H,表示高比寬。
上面的程式碼其實可看作
app:layout_constraintDimensionRatio="W,3:1"
鏈條(建議看原文)
簡單說就是我中有你,你中有我,簡單的程式碼
app:layout_constraintRight_toLeftOf="@+id/buttonB"
app:layout_constraintLeft_toRightOf="@+id/buttonA"
鏈條有頭,水平鏈的頭是鏈中最左邊的View,垂直鏈的頭是鏈中最頂端的View。
chainStyle只作用於頭
在spread下才可以使用加權app:layout_constraintHorizontal_weight和app:layout_constraintVertical_weight
鏈條引用控制元件時,要注意”@+id/buttonB”和”@id/buttonB”的差別
<Button
android:id="@+id/buttonA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ButtonA"
app:layout_constraintBottom_toTopOf="@+id/buttonB"
/>
<Button
android:id="@+id/buttonB"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="ButtonB"
app:layout_constraintTop_toBottomOf="@id/buttonA"
/>
上面如果寫成了app:layout_constraintBottom_toTopOf=”@id/buttonB”編譯是會報錯的,提示
Error:(28, 46) No resource found that matches the given name (at 'layout_constraintBottom_toTopOf' with value '@id/buttonB').