1. 程式人生 > >android -------- ConstraintLayout Guideline和Barrier(四)

android -------- ConstraintLayout Guideline和Barrier(四)

前面的文章

此博文主要講解:Guideline和Barrier

Guideline (瞭解,實際使用過程中我使用的不多)

當需要一個任意位置的錨點時,可以使用指示線(Guideline)來幫助定位,指示線實際上是 View 的子類,使用方式和普通的 View 相同,但指示線有著如下的特殊屬性:

  • 寬度和高度均為0
  • 可見性為 View.GONE

案例:

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <!--重要的是Guideline是不會顯示到介面上的,預設是GONE的。-->


   <android.support.constraint.Guideline
        android:id="@+id/guidelineBegin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="100dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Button"
        app:layout_constraintLeft_toLeftOf="@+id/guidelineBegin"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Guideline
        android:id="@+id/guidelineEnd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_end="100dp" />

    <Button
        android:id="@+id/buttonEnd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="Button2"
        app:layout_constraintRight_toLeftOf="@+id/guidelineEnd"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Guideline
        android:id="@+id/guidelinePercent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.8" />

    <Button
        android:id="@+id/buttonPercent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="96dp"
        android:text="Button3"
        app:layout_constraintLeft_toLeftOf="@+id/guidelinePercent"
        app:layout_constraintTop_toTopOf="parent" />

    <!--當你要用一個控制元件佔螢幕寬度的一半的時候,可以用layout_constraintGuide_percent -->

</android.support.constraint.ConstraintLayout>

如圖:(有三個指示線)

         

Barrier

直譯為障礙、屏障。在約束佈局中,可以使用屬性constraint_referenced_ids屬性來引用多個帶約束的元件,

從而將它們看作一個整體,Barrier 的介入可以完成很多其他佈局不能完成的功能;

它跟 Guideline  一樣屬於Virtual Helper objects,在執行時的介面上看不到,但是要比Guideline實用多了。

案例

<?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">



    <!--Barrier-->

    <!-- 原始方案: 當改變textView1 的欄位內容時,textView3隨之改變,
                   當改變textView2 的欄位內容時,則失效
        -->


    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="warehouse"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:text="hospita"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView1" />


    <!--現在 Barrier 就已經定義好了,只剩下把textView3的約束從相對於 textView1 改為 相對於 Barrier 了:
        app:layout_constraintLeft_toRightOf="@+id/textView1"  ===> 不設定下面屬性則會出現有的內容看不見  取消下面註釋
        app:layout_constraintLeft_toRightOf="@+id/barrier1"/
        app:layout_constraintStart_toEndOf="@+id/barrier1"

    -->
    <android.support.constraint.Barrier
        android:id="@+id/barrier1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="end"
        app:constraint_referenced_ids="textView1,textView2"
       />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginRight="10dp"
        android:text="為了看到整體的效果,可以切換語言,此時你會看到Barrier會自動位於較寬的那個textView後面,也就間接讓 textView3 也位於了正確的位置:"
        app:layout_constraintLeft_toRightOf="@+id/barrier1"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <!--   <android.support.constraint.Barrier
        android:id="@+id/barrier7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="end"
        app:constraint_referenced_ids="textView2,textView1" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:text="為了看到整體的效果,可以切換語言,此時你會看到 Barrier 會自動位於較寬的那個 textView 後面,也就間接讓 textView3 也位於了正確的位置:"
        app:layout_constraintStart_toEndOf="@+id/barrier7"
        app:layout_constraintTop_toTopOf="parent" />-->


</android.support.constraint.ConstraintLayout>

效果圖:(你可以隨便改變 textview1和textview2的長度,並不會影響textview3的顯示)

            

很實用

參考地址:https://constraintlayout.com/basics/barriers.html