ConstraintLayout的使用


ConstraintLayout的使用

來源 https://yuweiguocn.github.io/using-the-constraintlayout/

 

本文介紹了ConstraintLayout的使用。

使用ConstraintLayout可以創建復雜的扁平化View層級的布局。它和RelativeLayout很相似都是通過View之間和父布局的關系擺放所有View的。它比RelativeLayout更靈活並且使用Android Studio的布局編輯器更方便。

ConstraintLayout兼容至Android 2.3 (API level 9)。本文基於Android Studio 2.3環境。

添加依賴

1.在Module的build.gradle文件中添加倉庫依賴:

1
2
3
4
5
repositories {
maven {
url 'https://maven.google.com'
}
}

2.在build.gradle文件中添加依賴:

1
2
3
dependencies {
compile 'com.android.support.constraint:constraint-layout:1.0.2'
}

 

或者如果你訪問google有困難的話,你可以使用https://github.com/paronos/constraint-layout 幫我們提供好的依賴:

1
2
3
4
5
6
7
8
repositories {
maven{ url 'https://jitpack.io'}
}

dependencies {
compile 'com.github.paronos.constraint-layout:constraint-layout-solver:6353c6d'
compile 'com.github.paronos.constraint-layout:constraint-layout:6353c6d'
}

 

創建布局

1.對原有布局我們可以在設計視圖右擊組件樹或預覽圖,選擇轉換為ConstraintLayout:

選擇轉換為ConstraintLayout后Android Studio會有一個如下提示:

提示說明Android Studio會按照現有View位置自動添加約束,你可能還需要調整約束。選擇第一個選項,它會移除所有的嵌套布局。第二個選項是不移除帶有ID屬性的嵌套布局,因為有可能會在Java代碼中引用。

2.創建新布局根元素選擇android.support.constraint.ConstraintLayout

添加約束

從控件面板拖出一個IamgeView到藍圖預覽圖,View的四個角的小方塊用於控制View的大小。

添加一個約束,會有一個默認的margin,可以在工具欄設置。

創建約束,請記住以下規則:

  • 每個View至少需要一個水平約束和一個垂直約束,但通常需要更多約束。
  • 垂直面(左邊和右邊)的約束只能與垂直面創建約束,水平面(上邊和下邊)的約束只能與水平面創建約束;基線只能約束到別的基線。
  • 每個約束柄只能約束一次,同一個錨點可以創建多個約束(來自多個View)。

對於刪除約束我們可以點擊View四邊的約束柄,或者左下角的圖標刪除當前View的所有約束。

對齊

一個View的邊可以對齊到另一個View的邊,使用菜單進行對齊:

使用約束柄進行對齊:

基線對齊

一個 文本View 的基線可以與另一個 文本View 的基線對齊。點擊  可以調出基線約束柄。

GUIDELINES對齊

我們可以添加一個垂直或水平guideline約束View,並且guideline對用戶是不可見的。Guideline相對於布局邊界的單位可以是dp或百分比。點擊Guideline邊上的圓點可以切換測量模式。

調整約束偏移

調整View大小

我們可以利用View的四個角的小方塊用於調整View的大小,但這樣調整的View大小是固定的。打開右上角的Properties窗口,我們可以看到如下圖所示(這個只對約束布局中的View可用):


圖 Properties 窗口包含的功能:1大小比例,2刪除約束,3高度/寬度模式,4margins,5約束偏移。

你可以點擊圖中符號3所對應的位置來切換高度或寬度計算的方式。這些符號代表的模式大小如下所示:

  •  Wrap Content: View的大小為內容的大小.
  •  Match Constraints: 除去margin后View會根據需要擴展到約束的地方。但是,如果所給尺寸只有一個約束,那么View會擴展為它內容的大小。在高度或寬度上使用這個模式允許你設置一個大小比例。
  •  Fixed: View的大小為指定的大小。

注意:ConstraintLayout中的所有View不應該使用match_parent,應該使用”match constraints” (0dp).

設置大小比例

如果View的尺寸至少設置了一個”match constraints” (0dp)那你可以給View的大小設置一個比例。

調整VIEW MARGINS

我們可以通過工具欄設置默認的margin,這只對后面添加的View生效。我們也可以在 Properties 窗口設置margin。


圖 工具欄 Margin 按鈕

用鏈控制線性組

一個鏈是一組View互相鏈接雙向約束。例如,下圖說明了兩個View互相約束,因此創建了一個水平鏈。

一個鏈可以使用下面的樣式水平或垂直分散一組View,如下圖所示:

  1. Spread:View會均勻分布。這是也默認的。
  2. Spread inside:鏈兩端的第一個和最后一個View靠着約束,其余均勻分布。
  3. Weighted:當鏈設置為 spread 或 spread inside ,你可以在一個或多個View上設置”match constraints” (0dp)填充剩余空間。默認情況下,設置”match constraints”的每個View之間是均勻分布的,但你也可以使用layout_constraintHorizontal_weightlayout_constraintVertical_weight屬性設置權重。
  4. Packed:View會打包到一起(除去margin)。然后你可以調整個鏈的偏移(上下或左右)通過修改鏈head View的偏移。

鏈的”head” View(水平鏈為最左邊的View,垂直鏈為最上邊的View) 在XML中定義了鏈的樣式。點擊  可以切換樣式。

注意事項:

  • 一個View可以同時是水平和垂直鏈的一部分,這可以很方便創建表格布局。
  • 只有當鏈的兩端約束到同一軸的其它對象時鏈才可以正常工作。
  • 雖然鏈的方向可以是水平或垂直,但它並不會對齊View。

自動創建約束

除了通過給布局中的每個View添加約束,你也可以移動View到期望的位置,然后點擊Infer Constraints

自動連接是單獨的特性可以打開或關閉。當打開后,它會自動為添加到布局的View創建兩個或多個約束,但只有當View可以適當地約束到父布局。自動連接不會為布局中的其它View創建約束。

自動連接默認是關閉的,你可以通過工具欄點擊Turn on Autoconnect  打開自動連接。

ConstraintSet

我們也可以使用代碼創建約束集合用於ConstraintLayout。使用ConstraintSet可以創建和保存約束,並且應用到ConstraintLayout。使用不同方式創建ConstraintsSet:
1.手動,使用ConstraintSet提供的方法

1
c = new ConstraintSet(); c.connect(....);

2.從布局加載

1
2
c = new ConstraintSet();
c.clone(context, R.layout.layout1);

 

3.從ConstraintLayout加載

1
2
c = new ConstraintSet();
c.clone(clayout);//如果布局已經inflate,使用這種方法更快。

 

注意兩個布局中View及ID應該保持一致,最后使用ConstraintsSet的applyTo方法應用約束到布局。

示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import android.content.Context;
import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.support.constraint.ConstraintSet;
import android.support.transition.TransitionManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {
ConstraintSet mConstraintSet1 = new ConstraintSet(); // create a Constraint Set
ConstraintSet mConstraintSet2 = new ConstraintSet(); // create a Constraint Set
ConstraintLayout mConstraintLayout; // cache the ConstraintLayout
boolean mOld = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context context = this;
mConstraintSet2.clone(context, R.layout.state2); // get constraints from layout
setContentView(R.layout.state1);
mConstraintLayout = (ConstraintLayout) findViewById(R.id.activity_main);
mConstraintSet1.clone(mConstraintLayout); // get constraints from ConstraintSet
}

public void foo(View view) {
TransitionManager.beginDelayedTransition(mConstraintLayout);
if (mOld = !mOld) {
mConstraintSet1.applyTo(mConstraintLayout); // set new constraints
} else {
mConstraintSet2.applyTo(mConstraintLayout); // set new constraints
}
}
}

 

參考

 

============== End

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM