1. 程式人生 > >ContraintLayout的基本屬性與用法

ContraintLayout的基本屬性與用法

開局一張圖,部落格全靠編: 在這裡插入圖片描述 該佈局如果以傳統佈局方式來寫的話是這樣的(由於顯示邏輯問題實際情況更復雜,demo略做精簡)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/product_item"
    android:layout_width="match_parent"
    android:layout_height="140dp"
    android:layout_marginBottom="2dp"
    android:layout_marginLeft="7dp"
    android:layout_marginRight="7dp">

    <FrameLayout
        android:id="@+id/product_img_container"
        android:layout_width="117dp"
        android:layout_height="117dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginBottom="7dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="7dp">
        <!-- 商品圖片 -->
        <ImageView
            android:id="@+id/sku_img"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            tools:src="@drawable/ic_launcher_background" />

        <TextView
            android:id="@+id/sku_num"
            android:layout_width="wrap_content"
            android:layout_height="20dp"
            android:layout_gravity="end|right|bottom"
            android:paddingBottom="2dp"
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            android:paddingTop="2dp"
            android:textColor="#ffffff"
            android:textSize="11dp"
            tools:text="4件" />
    </FrameLayout>


    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="17dp"
        android:layout_marginRight="17dp"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@id/product_img_container"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:maxLines="2"
        android:textColor="#ff000000"
        android:textSize="16dp"
        android:textStyle="bold"
        tools:text="飛利浦乾溼兩a~須a abc def" />

    <!-- 商品介紹 -->
    <TextView
        android:id="@+id/desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@id/title"
        android:layout_below="@+id/title"
        android:layout_marginRight="17dp"
        android:layout_marginTop="9.5dp"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:lineSpacingMultiplier="1.1"
        android:maxLines="1"
        android:textColor="#818181"
        android:textSize="13dp"
        tools:text="西裝作為職場必備 ITEM其修身線條,挺括的外觀,舒適的穿著西裝作為職場必備 ITEM其修身線條,挺括的外觀" />

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@id/title"
        android:layout_marginBottom="12dp">

        <ImageView
            android:id="@+id/author_img"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_alignBottom="@id/author_name"
            android:layout_marginBottom="2dp"
            tools:src="@drawable/ic_launcher_background" />

        <TextView
            android:id="@+id/author_name"
            android:layout_width="wrap_content"
            android:layout_height="25dp"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="5dp"
            android:layout_toRightOf="@+id/author_img"
            android:ellipsize="end"
            android:gravity="center_vertical"
            android:maxLength="6"
            android:textColor="#6A6A6A"
            android:textSize="11sp"
            tools:text="美麗教主" />

        <!--喜歡人數&點贊-->
        <TextView
            android:id="@+id/common_like_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:textSize="13dp"
            android:textColor="@color/colorAccent"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginRight="6dp"
            tools:text="300人喜歡"/>
    </RelativeLayout>
</RelativeLayout>

可以看到,這個簡單的佈局已經做了兩層巢狀 在這裡插入圖片描述 如果我們用ContraintLayout,就一層佈局足以,不用巢狀。之前寫的佈局我們可以以這種方式簡單轉化一下:在desin中右擊 在這裡插入圖片描述 轉化完成後,我們的佈局會亂,因為會把我們所有的巢狀佈局刪掉,如Relativelayout,FrameLayout等。所以我們需要手動調整一下。 當然,你可以直接用contraintLayout佈局編寫,在gradle檔案中新增依賴即可。

implementation 'com.android.support.constraint:constraint-layout:1.1.3'

在編寫XML檔案之前,我們需要了解一下ConstraintLayout的基本屬性:

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

通常情況下,這些屬性足夠讓我們編譯一套複雜的佈局。其實這些屬性很簡單,你完全可以當做加強版本的RelativeLayout來使用,Left_toLeftOf的意思就是我的左邊跟xxid的左邊相鄰,其他意思類推。 例如假設你的textview要在imageView的右邊,那麼程式碼就這麼寫 在textView控制元件中 app:layout_constraintLeft_toRightOf="@圖片控制元件的id" 所以改變完後的程式碼如下:

<?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:id="@+id/product_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="2dp"
    android:layout_marginLeft="7dp"
    android:layout_marginRight="7dp">

    <!-- 商品圖片 -->
    <ImageView
        android:id="@+id/sku_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        tools:src="@drawable/ic_launcher_background" />

    <TextView
        android:id="@+id/sku_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="2dp"
        android:paddingLeft="6dp"
        android:paddingRight="6dp"
        android:paddingTop="2dp"
        android:textColor="#ffffff"
        android:textSize="13dp"
        app:layout_constraintBottom_toBottomOf="@id/sku_img"
        app:layout_constraintRight_toRightOf="@id/sku_img"
        tools:text="4件" />


    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:maxLines="2"
        android:textColor="#ff000000"
        android:textSize="16dp"
        android:textStyle="bold"
        app:layout_constraintLeft_toRightOf="@id/sku_img"
        app:layout_constraintRight_toRightOf="parent"
        tools:text="飛利浦乾溼兩a~須a abc def飛利浦乾溼兩a~須a abc def飛利浦乾溼兩a~須a abc de" />

    <!-- 商品介紹 -->
    <TextView
        android:id="@+id/desc"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:ellipsize="end"
        android:lineSpacingMultiplier="1.1"
        android:maxLines="1"
        android:textColor="#818181"
        android:textSize="13dp"
        app:layout_constraintLeft_toLeftOf="@id/title"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/title"
        tools:text="西裝作為職場必備 ITEM其修身線條,挺括的外觀,舒適的穿著西裝作為職場必備 ITEM其修身線條,挺括的外觀" />


    <ImageView
        android:id="@+id/author_img"
        android:layout_width="30dp"
        android:layout_height="30dp"
        app:layout_constraintBottom_toBottomOf="@id/sku_img"
        app:layout_constraintLeft_toLeftOf="@id/title"
        tools:src="@drawable/ic_launcher_background" />

    <TextView
        android:id="@+id/author_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:maxLength="6"
        android:textColor="#6A6A6A"
        android:textSize="11sp"
        app:layout_constraintBottom_toBottomOf="@id/author_img"
        app:layout_constraintLeft_toRightOf="@id/author_img"
        tools:text="美麗教主" />

    <!--喜歡人數&點贊-->
    <TextView
        android:id="@+id/common_like_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="13dp"
        app:layout_constraintBottom_toBottomOf="@id/sku_img"
        app:layout_constraintRight_toRightOf="parent"
        tools:text="300人喜歡" />

</android.support.constraint.ConstraintLayout>


佈局截圖如下: 在這裡插入圖片描述 可以看到,我們不用巢狀任何一個佈局即可完成該佈局的編碼工作,所以在效能上,尤其是更加複雜的佈局,豈不是很爽。 當然,有可能你在佈局的過程中會遇到以下幾種情況:

  1. 兩個控制元件之間怎麼居中對齊?
  2. 我設定了android:ellipsize="end"為什麼沒生效
  3. 在某些邏輯下我要隱藏很多控制元件,為了方便,我在傳統佈局裡可以將這些控制元件設定在一個ViewGroup裡,就可以達到隱藏ViewGroup來簡化單獨的控制元件隱藏邏輯,現在新佈局不讓用佈局嵌套了,我難道要一個個控制元件單獨隱藏?
  4. 我所依賴的一個控制元件在某些邏輯下setVisibiltyGone後,自身的位置發生了重大偏差,怎麼辦?

這些問題,我們都可以解決,篇幅問題,我們下期會依依解決這些問題,同時引出更多的高階用發,高階屬性。