1. 程式人生 > >Android基礎之布局ConstraintLayout

Android基礎之布局ConstraintLayout

工具類 disable star next 出版 vertica 基本用法 特性 box

Google I/O 2016 上發布了 ConstraintLayout,據說很強大,那就一探究竟吧!

gradle配置

      compile ‘com.android.support.constraint:constraint-layout:1.0.0-beta2‘  
  • 1
  • 1

閱讀前提:熟悉四大基礎布局

一、位置控制

  • 8個邊界控制屬性
    註:最左邊表示可移動的最左邊,左邊表示View的左邊邊界
    app:layout_constraintLeft_toLeftOf 
    app:layout_constraintLeft_toRightOf 我最左邊的位置 在別人的右邊 下面的意思類似
    app:layout_constraintRight_toRightOf 
    app:layout_constraintRight_toLeftOf
    app:layout_constraintTop_toTopOf 
    app:layout_constraintTop_toBottomOf
    app:layout_constraintBottom_toBottomOf
    app:layout_constraintBottom_toTopOf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

不明白沒關系,看例子。

* 例如:

技術分享

    <!--如圖,左邊一個A,右邊一個C,我如果想新建一個B在A C之間,如下-->
     <Button
        app:layout_constraintLeft_toRightOf="@+id/bt_a"
        app:layout_constraintRight_toLeftOf="@+id/bt_c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="B"/>
    <!--字面理解:1.我最左邊的位置,在button A的右邊-->
    <!--字面理解:1.我最右邊的位置,在button C的左邊-->
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如上圖中,最左邊和最右邊的位置已經確定,B出現在A和C中間,但是如果我不想在中間怎麽辦(比如說我想靠右一點)

  • 這裏引入2個偏移屬性
    layout_constraintHorizontal_bias(水平方向偏移)(範圍0-1)
    layout_constraintVertical_bias(垂直方向偏移)(範圍0-1)  
  • 1
  • 2
  • 1
  • 2

怎麽理解?我只發圖不說話,看圖
如圖:B的水平偏移為0
技術分享

    app:layout_constraintHorizontal_bias="0"
  • 1
  • 1

如圖:B的水平偏移為0.5
技術分享

    app:layout_constraintHorizontal_bias="0.5"
  • 1
  • 1

如圖:B的水平偏移為0.7
技術分享

    app:layout_constraintHorizontal_bias="0.7"
  • 1
  • 1

如圖:B的水平偏移為1
技術分享

    app:layout_constraintHorizontal_bias="1"    
  • 1
  • 1

總結:(明白了嗎?不明白請繼續看圖)
1.通過8個邊界約束屬性可以固定View的最左邊、最右邊、最上面、最下面的位置
2.通過設置偏移屬性,可以控制View在邊界範圍移動,最左邊是0,最右邊是1,中間是0.5
3.當設置了邊界約束屬性後,View會自動出現在中間,也就是說,默認的偏移屬性是0.5

二、大小控制

  • 先介紹兩個布局大小控制屬性
    layout_constraintHorizontal_weight //水平方向上比重,類似線性布局
    layout_constraintVertical_weight  //垂直方向上比重,類似線性布局
  • 1
  • 2
  • 1
  • 2

下面我將用ConstraintLayout來模仿一個水平方向的線性布局的例子

完整布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="MissingConstraints">
        <!--A邊界控制屬性 有 左 和 右-->
        <Button
            android:id="@+id/bt_a"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="A"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toLeftOf="@id/bt_b"/>
        <!--B邊界控制屬性 也有 左 和 右-->
        <Button
            android:id="@+id/bt_b"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="B"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toRightOf="@id/bt_a"
            app:layout_constraintRight_toLeftOf="@id/bt_c"/>
        <!--C邊界控制屬性 只有右-->
        <Button
            android:id="@+id/bt_c"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="C"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintRight_toRightOf="parent"/>
    </android.support.constraint.ConstraintLayout>
  • 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
  • 34
  • 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
  • 34

效果如下(效果圖中C明顯比較小,說明C 比重設置沒有效果)
技術分享

結論:
1.實現水平方向線性布局,所有的View都必須設置左右邊界控制屬性,而且相互控制
2.實現比重大小控制,必須設置layout_width=”0dp”

如圖布局(能看懂基本上說明你已經掌握了比重控制)

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="MissingConstraints">
        <TextView
            android:background="#0f0"
            android:id="@+id/bt_a"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:text="A"
            app:layout_constraintBottom_toTopOf="@id/bt_b"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toLeftOf="@id/bt_b"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_weight="1"/>
        <TextView
            android:background="#0f0"
            android:id="@+id/bt_b"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:text="B"
            app:layout_constraintBottom_toTopOf="@id/bt_c"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toRightOf="@id/bt_a"
            app:layout_constraintRight_toLeftOf="@id/bt_c"
            app:layout_constraintTop_toBottomOf="@id/bt_a"
            app:layout_constraintVertical_weight="1"/>
        <TextView
            android:background="#0f0"
            android:id="@+id/bt_c"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:text="C"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toRightOf="@id/bt_b"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/bt_b"
            app:layout_constraintVertical_weight="1"/>
    </android.support.constraint.ConstraintLayout>
  • 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
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 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
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

效果圖如下:
技術分享

三、位置控制補充

絕對坐標:父布局左上角默認為(0,0),這個坐標是是相對於父布局左上角的坐標

    layout_editor_absoluteX 絕對坐標x
    layout_editor_absoluteY 絕對坐標y
  • 1
  • 2
  • 1
  • 2

當設置了左邊界控制屬性,x絕對坐標失效,請使用基礎布局的(layout_marginLeft替代)
當設置了上邊界控制屬性,y絕對坐標失效,請使用基礎布局的(layout_marginTop替代)

因此,,絕對坐標。。不好適配,也不好控制。差評。

另外附上一張
Android Studio 超智能的控制設置圖,如下

技術分享

4
0

相關文章推薦
  • • Android新特性介紹,ConstraintLayout完全解析
  • • 有關Activity樣式 、狀態欄透明、屏幕亮度問題應用場景及其總結
  • • ConstraintLayout 的入門用法
  • • Android ConstraintLayout 約束布局詳解
  • • 歷久而新,我的新書《第二行代碼》已出版!
  • • Android圖片加載框架最全解析(一),Glide的基本用法
  • • android網絡編程--從網絡下載圖片,並保存到內存卡
  • • 了解使用Android ConstraintLayout
  • • Android ConstraintLayout詳解
  • • 探索Android ConstraintLayout布局
猜你在找

Android基礎之布局ConstraintLayout