В чем разница между барьером и руководством в макете ограничений?

92

Недавно пытался реализовать, Constraint Layoutно нашел Barrierи Guidelineработает так же. Оба работают как разделитель. Есть ли между ними разница?

Даа2508
источник

Ответы:

201

Когда использовать барьеры

Предположим, у вас есть два TextViewвиджета с динамической высотой, и вы хотите разместить один Buttonчуть ниже самого высокого TextView:

Просмотр задач

Только способ осуществить это прямо в макете, чтобы использовать горизонтальную Barrier. Это Barrierпозволяет вам указать ограничение на основе высоты этих двух TextViews. Затем вы ограничиваете верх своей Buttonнижней части горизонтали Barrier.

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

    <TextView
        android:id="@+id/left_text_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        android:textSize="16sp"
        android:background="#AAA"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/right_text_view"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/right_text_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:text="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
        android:textSize="16sp"
        android:background="#DDD"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/left_text_view"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="bottom"
        app:constraint_referenced_ids="left_text_view,right_text_view" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/barrier" />

</android.support.constraint.ConstraintLayout>

Когда использовать рекомендации

Предположим, вы хотите ограничить вышеупомянутые TextViewвысоты до 30% от высоты экрана, независимо от содержимого, которое они имеют.

Просмотр теста

Чтобы реализовать это, вы должны добавить горизонталь Guidelineс процентным положением и ограничить TextViewнижнюю часть этим 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/left_text_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="#AAA"
        android:text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        android:textSize="16sp"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toStartOf="@+id/right_text_view"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/right_text_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:background="#DDD"
        android:text="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
        android:textSize="16sp"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/left_text_view"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.3" />

</android.support.constraint.ConstraintLayout>

Вывод

Единственное различие между Barrierи Guidelineсостоит в том, что Barrierпозиция является гибкой и всегда зависит от размера нескольких элементов пользовательского интерфейса, содержащихся в ней, а Guidelineпозиция всегда фиксирована.

Евгений Брюсов
источник
ценный ответ!
Алиреза Нурали 01
Заявление: «ЕДИНСТВЕННЫЙ способ реализовать это непосредственно в макете - использовать горизонтальный барьер». ложно. Для этого вы можете использовать указание, ограничив оба текстовых поля указателем ниже. (Т.е.app:layout_constraintBottom_toTopOf="@id/guideline"
Chrispher
11

Официальная документация по Barrier :

Barrier ссылается на несколько виджетов в качестве входных данных и создает виртуальную направляющую на основе самого крайнего виджета на указанной стороне. Например, левый барьер будет выровнен слева от всех видов, на которые есть ссылка.

Учебные документы по Barrier :

Подобно руководству, барьер - это невидимая линия, которой вы можете ограничить представление. Кроме того, что барьер не определяет свою позицию; вместо этого положение барьера перемещается в зависимости от положения содержащихся в нем представлений. Это полезно, когда вы хотите ограничить представление набором представлений, а не одним конкретным представлением.

доминикодер
источник