首頁 > 軟體

Android中ConstraintLayout約束佈局的最全詳細解析

2022-08-21 14:02:12

一、ConstraintLayout概述

ConstraintLayout是Android官方在2016年Google的I/O大會推出的一種可以靈活控制子控制元件的位置和大小的新佈局方式,也是目前Android的幾大佈局中功能最強大的佈局。在最新版的Android Studio中,建立佈局檔案的預設根元素都是ConstraintLayout了。

ConstraintLayout優點

ConstraintLayout之所以成為目前Android開發中主流的佈局,除了官方建議使用ConstraintLayout外還有以下幾個方面的優勢

  1. 功能強大,ConstraintLayout幾乎能實現其他佈局所有的功能
  2. 能減少佈局層次的巢狀,有效能的優勢
  3. 視覺化操作的增強,大部分介面用ConstraintLayout都能通過視覺化編輯區域完成

二、ConstraintLayout基礎篇

2.1 基礎操作

在Android Studio中預設的佈局方式是約束佈局,在約束佈局中新增控制元件非常簡單,只需要從左側的Palette區域拖動控制元件到中間的介面編輯區域即可。

在約束佈局中,點中任意一個控制元件,該控制元件的上下左右四個方向各會出現一個圓圈,該圓圈代表可以新增的約束。

當把滑鼠移動到圓圈上,按住滑鼠左鍵,然後移動滑鼠到父佈局的上下左右任意邊緣再鬆開滑鼠即可給該方向新增約束,新增完約束後該圓圈會由空心圓變成實心圓,同時控制元件也會移動到該父佈局新增約束的方向的邊緣。

當給一個控制元件上下方向都新增約束後該控制元件會在垂直方向居中,同樣的給一個控制元件左右方向都新增約束該控制元件會在水平方向居中。

如果想給一個控制元件去掉約束,選中該控制元件後,在右上角Layout區域,點選該方向上的×符號即可去掉該方向上的約束

也可以拖動Layout區域的水平條和垂直條來控制左右方向和上下方向兩邊約束的比例,該值越小,控制元件會越靠左和上。

給控制元件某個方向新增約束後該控制元件預設會緊靠該方向約束的父佈局邊緣,可以設定控制元件在Layout區域設定該方向與父佈局的邊緣間距。

2.2 控制元件間新增約束

在約束佈局中,除了可以給一個控制元件將約束新增到父佈局邊緣,也可以將一個控制元件的約束新增到另外一個控制元件上,新增約束的方法跟新增都父佈局一樣。當給一個控制元件左邊新增約束到另外一個控制元件左邊,該控制元件左邊緣會平齊另外一個控制元件的左邊緣。給一個控制元件的下邊緣新增約束到另外一個控制元件的上邊緣,該控制元件會緊貼另外一個控制元件的上邊緣

如果給一個控制元件左右兩邊都新增約束到另外一個控制元件的兩邊,這兩個控制元件的大小又不一樣,那麼該兩個控制元件的中軸線會平齊。

2.3 約束佈局xml程式碼實現

用視覺化區域來編寫佈局雖然比較簡單,但是對於一些佈局的微呼叫xml程式碼會更快,要熟練掌握約束佈局,學會用xml程式碼來編寫約束佈局也是必備的技能。

給父佈局新增約束

  • app:layout_constraintBottom_toBottomOf="parent" 底部約束
  • app:layout_constraintEnd_toEndOf="parent" 右邊約束
  • app:layout_constraintStart_toStartOf="parent" 左邊約束
  • app:layout_constraintTop_toTopOf="parent" 頂部約束

這裡的Strart和End 換成Left和Right也可以。

將約束新增到其他

  • app:layout_constraintBottom_toTopOf="@+id/button3" 底部新增約束到其他控制元件頂部
  • app:layout_constraintEnd_toEndOf="@+id/button3" 右邊新增約束到其他控制元件右邊
  • app:layout_constraintStart_toStartOf="@+id/button3" 左邊新增約束到其他控制元件左邊

三、ConstraintLayout 進階篇

3.1 Chains鏈

LinearLayout佈局中weight屬效能夠實現子控制元件講父佈局的控制元件按比例分配,在ConstraintLayout 中通過Chains鏈也能夠實現相同的功能,而且Chains鏈的功能比LinearLayout佈局中weight屬性功能更加強大。

Chains鏈的基本用法如下:選中多個控制元件,右鍵Chains->Create Horizontal Chains 即可將父佈局的剩餘空間進行均勻分佈。

Chains鏈對父控制元件的剩餘空間有三種分配方式,即Spread、spread inside、packed,預設值是Spread即將控制元件包括第一個控制元件和最後一個兩邊均勻分配

spread inside值表示第一個控制元件和最後一個控制元件兩邊不分配空間

spread inside值表示所有控制元件挨在一起,第一個控制元件和最後一個控制元件兩邊均勻分配父控制元件的剩餘空間

3.2 尺寸約束

在其他佈局中,控制元件的尺寸單位有wrap_content、dp固定值、match_parent三種值,在約束佈局中的控制元件還可以給其設定MATCH_CONSTRAINT(0dp),該值的含義代表約束尺寸,即控制元件的尺寸由其左右兩邊的約束來控制。

舉個栗子

比如很多app的首頁都是由底部banner頂部fragment組成,而fragment的高度通常不是固定的,如果用其他的佈局fragment的高度就很難調節,這時候可以用MATCH_CONSTRAINT(0dp)動態調節fragment的尺寸高度,給頂部的fragment設定其高度為0dp,給其上下各新增一個約束,這時候其高度為父佈局的頂部到底部控制元件的頂部。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:context=".MainActivity">

    <TextView
        android:id="@+id/textView4"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="@color/purple_200"
        android:text="底部banner"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@color/teal_200"
        android:gravity="center"
        android:text="頂部fragment"
        app:layout_constraintBottom_toTopOf="@+id/textView4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

3.3 百分比佈局

ConstraintLayout 還支援控制元件的尺寸按照父佈局尺寸的百分比來設定

  • app:layout_constraintWidth_percent 寬度佔父佈局百分比比例
  • app:layout_constraintHeight_percent 高度佔父佈局百分比比例

tips:只有寬度和高度尺寸為0dp百分比屬性才會生效

3.4 radio屬性

有些app的banner圖通常是按照一定比例來設定的,如16:9,1:1等,用其他佈局圖片的寬度如果設定成match_parent,圖片的高度就需要根據比例動態去計算,非常的麻煩。在約束佈局中通過radio屬性很容易實現這樣的需求。

給圖片寬度設定match_parent,高度設定成約束尺寸0dp,然後再新增一個layout_constraintDimensionRatio屬性,屬性的值可以設定h,16:9 其中h表示高寬比的比值,也可以設定成將值設定w,9:16,w表示寬高比的比值。

3.5 圓形定位

ConstraintLayout 還支援圓型定位,將一個控制元件的中心以一定的角度和距離約束到另一個控制元件的中心上,相當於在一個圓上放置一個控制元件。

圓形定位主要通過以下三個屬性值來控制

  • layout_constraintCircle:參照另一個控制元件的 id。
  • layout_constraintCircleRadius:到另一個控制元件中心的距離。
  • layout_constraintCircleAngle:控制元件的角度(順時針,0 - 360 度)。

四、ConstraintLayout 高階篇

4.1 Guideline

Guideline是ConstraintLayout佈局裡面的一個工具類,其作用相當於一條輔助線,預設不可見,可以用於輔助佈局

layout_constraintGuide_percent :按照比例設定輔助線的位置layout_constraintGuide_begin:按照值設定輔助線的位置

Guideline輔助線的位置既可以按照百分比來設定,也可以按照值來設定。

4.2 Group

Group 可以對一組的控制元件同時設定其可見性的值Visible、Invisible或者Gone

其使用方法如下:在佈局中右鍵新增Group,再將一組控制元件拖動到Group中,通過控制Group的屬性來調節一組控制元件的可見性。

4.3 Barrier

Barrier和Guideline 一樣,本身不可見,使用者輔助佈局。

假如有個這樣的需求,頁面中有個兩個Button1和Button2,一個TextView3 ,現在需要讓TextView3 處於Button1或Button2的右邊,對齊Button1和Button2中較寬的控制元件。

如果將TextView3 的左邊約束的加在Button1上,當Button2較寬時會擋住TextView3 ,在不用Barrier時,需要通過再增加一層佈局將Button1和Button2放到佈局中才能實現該需求。

使用Barrier的解決方案:

1、首先在編輯區域右鍵新增一個垂直方向的Barrier,將Button1和Button2拖動到Barrier中

2:將Barrier的barrierDerection屬性設定成right,right屬性表示其他控制元件對齊barrier控制元件中的靠右的控制元件

3、將textview3左邊的約束加到Barrier上

測試效果如下

總結 

到此這篇關於Android中ConstraintLayout約束佈局解析的文章就介紹到這了,更多相關Android ConstraintLayout約束佈局內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com