ConstraintLayout你可能要了解的一些內容

筆墨Android發表於2018-07-31

好久沒有寫文章了!以至於我都不知道該寫什麼了?最近專案中對ConstraintLayout的使用明顯增多了!所以今天和大家分享一下關於ConstraintLayout的一些你應該瞭解的內容!

本文知識點

  • ConstraintLayout的一些相應的屬性及展示;
    1. 約束的相關屬性
    2. 邊距相關的屬性
    3. 位置相關的屬性
    4. 鏈相關的屬性
    5. 輔助線相關的屬性
    6. 一些不知怎麼歸類的屬性
  • ConstraintLayout佈局的時候應該注意的一些內容;
    1. 關於ID的問題
    2. 關於設定"0dp"的問題
    3. 關於螢幕適配的問題

1.ConstraintLayout的一些相應的屬性及展示

關於這個控制元件我想大家應該都見過,只不過是你沒有注意過吧!如果你的Android Studio的版本在3.0以上的話,那麼跟佈局一般都是ConstraintLayout,以前一般的做法都是,直接替換成相應的佈局,直到有一天,我突然發現這個控制元件如此之強大,強大到我都不再想用其它控制元件了!但是強烈建議你們使用程式碼去寫!不要使用拖拽的那種方式,因為我覺得每次拖拽的時候我的電腦卡的不行!這個理由是不是很牽強~~~哈哈!

關於ConstraintLayout屬性,我準備分成幾類進行講解

  • 1.約束的相關屬性
  • 2.邊距相關的屬性
  • 3.位置相關的屬性
  • 4.鏈相關的屬性
  • 5.輔助線相關的屬性
  • 6.一些不知怎麼歸類的屬性

1.1 約束的相關屬性

  • layout_constraintLeft_toLeftOf
  • layout_constraintLeft_toRightOf
  • layout_constraintRight_toLeftOf
  • layout_constraintRight_toRightOf
  • layout_constraintTop_toTopOf
  • layout_constraintTop_toBottomOf
  • layout_constraintBottom_toTopOf
  • layout_constraintBottom_toBottomOf
  • layout_constraintBaseline_toBaselineOf
  • layout_constraintStart_toEndOf
  • layout_constraintStart_toStartOf
  • layout_constraintEnd_toStartOf
  • layout_constraintEnd_toEndOf

這裡和你說一個簡單方便記憶的方法,XXX_toXXXOf前面的是你現在的控制元件,後面的XXX是你要依賴的控制元件,拿layout_constraintLeft_toLeftOf說明一下:

<?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:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕1按鈕1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

    <Button
        app:layout_constraintTop_toBottomOf="@id/btn1"
        app:layout_constraintLeft_toLeftOf="@id/btn1"
        app:layout_constraintRight_toRightOf="@id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕2" />

</android.support.constraint.ConstraintLayout>
複製程式碼

效果圖

  1. 先主要看按鈕1的約束條件,按鈕1的左邊以父控制元件的左邊為約束條件,右邊以父控制元件的右邊為約束條件,這個時候,會有相應的居中顯示(也就是說,如果你左右都設定了約束條件的話,那麼如果有相應的空間,那麼它會居中顯示)!

  2. 在看按鈕2的約束條件,按鈕2的左邊以按鈕1的左邊為約束條件,按鈕2的右邊以按鈕1的右邊為約束條件,這裡注意一點,如果兩個控制元件不一樣大的時候,會以中心線對齊!

基本上就這麼多,沒有什麼好說的。這裡建議大家使用看一下效果,使用多了自然就知道效果了!

1.2 邊距相關的屬性

  • android:layout_marginStart
  • android:layout_marginEnd
  • android:layout_marginLeft
  • android:layout_marginTop
  • android:layout_marginRight
  • android:layout_marginBottom
  • layout_goneMarginStart
  • layout_goneMarginEnd
  • layout_goneMarginLeft
  • layout_goneMarginTop
  • layout_goneMarginRight
  • layout_goneMarginBottom

這裡的邊距和之前的邊距是一樣的,但是layout_goneMarginXXX這個屬性是當位置約束目標的可見性為View.GONE,您還可以使用以下屬性指示要使用的不同邊距值。這裡說明一下:如果你約束的控制元件GONE了之後,是以左上開始計算距離的,剩下的試一下你就知道了!

1.3 位置相關的屬性

首先我真的不知道,這麼分這些屬性是否正確,所以只要看相關的屬性就可以了!

1.3.1 百分比的屬性

  • layout_constraintHorizontal_bias 水平的百分比
  • layout_constraintVertical_bias 垂直的百分比
<?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:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕1按鈕1"
        app:layout_constraintHorizontal_bias="0.3"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

</android.support.constraint.ConstraintLayout>
複製程式碼

效果圖

這裡的layout_constraintXXX_bias相當於一個百分比也就是距離的百分比,像上面的的就是距離左邊30%那麼右邊的就是70%了!

  • app:layout_constraintDimensionRatio="1:1" 設定相應的寬高比
<?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:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:text="按鈕1"
        app:layout_constrainedWidth="true"
        app:layout_constraintDimensionRatio="1:1" />
</android.support.constraint.ConstraintLayout>
複製程式碼

效果圖

上面是寬高比是"1:1",這裡預設是寬高比的!

如果你像設定高度比這樣寫就可以了**"h,2:1"**但是","別千萬別忘了

效果圖

1.3.2 圓角半徑的一些屬性

  • layout_constraintCircle :引用另一個小部件ID
  • layout_constraintCircleRadius :到其他小部件中心的距離
  • layout_constraintCircleAngle :小部件應該處於哪個角度(以度為單位,從0到360)
<?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:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕2"
        app:layout_constraintCircle="@id/btn1"
        app:layout_constraintCircleAngle="135"
        app:layout_constraintCircleRadius="100dp" />
</android.support.constraint.ConstraintLayout>
複製程式碼

效果圖

這裡為了更好的說明,所以我準備在用兩張圖說明一下:

ConstraintLayout你可能要了解的一些內容 ConstraintLayout你可能要了解的一些內容

首先,角度是逆時針計算的,半徑是以圖形的中心進行計算的!剩下的你寫一遍基本上就知道了!!!

1.3.3 限制的一些屬性

  • android:minWidth 設定佈局的最小寬度
  • android:minHeight 設定佈局的最小高度
  • android:maxWidth 設定佈局的最大寬度
  • android:maxHeight 設定佈局的最大高度

這些屬性沒有什麼說的,和之前一樣!

1.4 鏈相關的屬性

關於連結串列的屬性很有意思,我個人理解他是LinearLayout中weight的加強版!我們先說說簡單的實現吧!為什麼叫做鏈呢?因為所有的同方向的約束組成了一個鏈式結構!

  • layout_constraintHorizontal_chainStyle
  • layout_constraintVertical_chainStyle
<?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:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕1"
        app:layout_constrainedWidth="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/btn2" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕2"
        app:layout_constrainedWidth="true"
        app:layout_constraintLeft_toRightOf="@id/btn1"
        app:layout_constraintRight_toLeftOf="@id/btn3" />

    <Button
        android:id="@+id/btn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕3"
        app:layout_constrainedWidth="true"
        app:layout_constraintLeft_toRightOf="@id/btn2"
        app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
複製程式碼

效果圖

這裡要注意一個相應的問題,怎麼理解上面我說的鏈式結構呢?仔細看的童鞋,在上面這個例子中可能會發現,每一個控制元件左右的都有相應的約束,所以才叫連結串列式的結構!

效果圖
這張圖完全能說明我上面說的內容!

  • layout_constraintHorizontal_weight
  • layout_constraintVertical_weight

這裡既然說到LinearLayout就在這裡說一下這兩個屬性吧!因為這兩個屬性和weight屬性差不多,基本上的用法是一樣的

<?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:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="按鈕1"
        app:layout_constrainedWidth="true"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/btn2" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="按鈕2"
        app:layout_constrainedWidth="true"
        app:layout_constraintHorizontal_weight="2"
        app:layout_constraintLeft_toRightOf="@id/btn1"
        app:layout_constraintRight_toLeftOf="@id/btn3" />

    <Button
        android:id="@+id/btn3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="按鈕3"
        app:layout_constrainedWidth="true"
        app:layout_constraintHorizontal_weight="3"
        app:layout_constraintLeft_toRightOf="@id/btn2"
        app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
複製程式碼

這裡就是設定了相應的一些weight的屬性!效果圖就變成了這個樣子!!!

效果圖

在說說上面的兩個屬性,關於這兩個屬性都差不多,只是一個是約束水平的一個是約束垂直的,還是用一張圖說明一下,看一眼效果你就知道了!!!

效果圖

這張效果圖,說明了chainStyle可以設定的一些屬性!關於鏈式結構基本上注意的內容就這麼多!!!也都是平時專案上能用到的!但是千萬要注意一點,必須左右都有相應的約束!否則不會有這種效果

"三遍" 重要的事情說"三遍" 哈哈!!!

1.5 輔助線相關的屬性

在ConstraintLayout中有一個輔助線的概念,它是不會顯示在頁面上的,只是一條你假象的線,然後你可以以此為約束進行佈局!

  • android:orientation 輔助線的方向
  • app:layout_constraintGuide_begin 距離頂部的距離
  • app:layout_constraintGuide_end 距離底部的距離
  • app:layout_constraintGuide_percent 相當於父容器的百分比
<android.support.constraint.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="100dp" />
複製程式碼

效果圖

可以看出,Guideline計算的距離都是依靠父容器的距離進行約束的,所以這裡你即使設定了相應的控制元件約束,其實是不好使的!我試過,但是如果你真的像以控制元件進行約束也不是不可以的,我的做法是:直接把控制元件的大小寫出來,這樣不用上面的三個距離的尺寸就可以進行相應的佈局了,雖然這樣有點傻!剩下兩個你試一下就可以了!圖就不往上貼了!!!

1.6 一些不知怎麼歸類的屬性

  • layout_constraintBaseline_toBaselineOf 基線對其
<?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:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:text="按鈕1" />

    <Button
        android:id="@+id/btn2"
        app:layout_constraintBaseline_toBaselineOf="@id/btn1"
        app:layout_constraintLeft_toRightOf="@id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:text="按鈕2" />
</android.support.constraint.ConstraintLayout>
複製程式碼

效果圖

  • layout_constraintWidth_percent
  • layout_constraintHeight_percent

寬度和高度佔父控制元件的百分比,其中的值是0~1的!

<?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:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintWidth_percent="0.5"
        app:layout_constraintHeight_percent="0.5"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:text="按鈕1" />
    
</android.support.constraint.ConstraintLayout>
複製程式碼

效果圖

其實就相當於佔用父容器的百分比,上面就相當於50%

2. ConstraintLayout佈局的時候應該注意的一些內容

2.1 關於ID的問題

其實我也不是到是Android Studio還是SDK的版本影響,但是有的時候在使用鏈式結構的時候,會出現控制元件找不到的現象?為什麼呢?因為在使用鏈式結構的時候,前面往往使用後面的控制元件ID,但是有的時候就不會出現這種狀況,後來,我找到了一種解決方法,就是在前面引用的時候這樣寫"@+id/xxx",乍一看沒有什麼,但是其實多了一個"+"號,這個"+"號的作用是在沒有發現這個控制元件ID的時候,主動建立一個相應的ID!就醬紫。。。

2.2 關於設定"0dp"的問題

其實在不涉及到左右或者上下比例的情況下,只要你在相應方向都有約束的情況,那麼相應的方向上設定"0dp"的時候,它會直接鋪滿全屏的!但是如果涉及到左右或者上下比例的情況下,就需要設定相應的layout_constraintXXX_weight了!

2.3 關於螢幕適配的問題

都知道Android螢幕適配真的是一件非常頭疼的事情,其實這個控制元件能幫我們解決相當大的一部分問題;一般我的做法是使用layout_constraintXXX_percent直接把控制元件按照百分比進行相應的計算!能解決一部分的適配問題,但是內部的自己沒有辦法解決,需要你自己去解決!!!!

基本上知道了上面這些,對於這個控制元件的使用就可以非常輕鬆了!!!不知道還有沒有什麼落下的,如果有落下的我想起來在進行補充,如果你有什麼問題也可以給我留言,我看到了一定及時回覆你!!!

相關文章