最近尝试实施Constraint Layout,但我发现Barrier并且Guideline工作方式相同。两者都像分隔线一样工作。它们之间有什么区别吗?
Constraint Layout
Barrier
Guideline
假设您有两个TextView具有动态高度的小部件,并且您希望将 aButton放置在最高的下方TextView:
TextView
Button
直接在布局中实现它的 _ 唯一_Barrier方法是使用水平. 这Barrier允许您根据这两个TextViews 的高度指定一个约束。然后你将你的顶部约束Button到水平的底部Barrier。
<?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" 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" /> <androidx.constraintlayout.widget.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" /> </androidx.constraintlayout.widget.ConstraintLayout>
假设您想将上述TextView高度限制为屏幕高度的 30%,无论它们有什么内容。
要实现这一点,您应该添加Guideline带有百分比位置的水平并将TextView底部限制在该位置Guideline。
<?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" 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" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.3" /> </androidx.constraintlayout.widget.ConstraintLayout>
Barrier和之间的唯一区别Guideline是Barrier‘ 的位置是灵活的,并且始终基于其中包含的多个 UI 元素的大小,而Guideline‘ 的位置始终是固定的。