1. 程式人生 > >ConstraintLayout約束佈局學習筆記

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)的時候才會生效

尺寸約束

  1. 可以為ConstraintLayout 自身定義最小的尺寸,他會在 ConstraintLayout為WRAP_CONTENT時起作用。
android:minWidth
android:minHeight
  1. 用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').