A ConstraintLayout是一个ViewGroup允许您以灵活的方式定位和调整小部件的方法。
注意: ConstraintLayout作为支持库提供,您可以在API级别9(Gingerbread)开始的Android系统上使用。因此,我们计划随着时间的推移丰富其API和功能。
您目前可以使用各种类型的约束:
- 相对定位
- 边距
- 居中定位
- 圆形定位
- 可见性行为
- 尺寸限制
- 链
- 虚拟助手对象
- 优化
请注意,您不能在约束中具有循环依赖关系。
Developer Guide
相对定位
相对定位是在ConstraintLayout中创建布局的基本构建块之一。这些约束允许您将给定的小部件相对于另一个小部件进行定位。您可以在水平和垂直轴上约束小部件:
- 水平轴:左,右,起点和终点
- 垂直轴:顶部,底部和文本基线
一般概念是将窗口小部件的给定侧约束到任何其他窗口小部件的另一侧。
例如,为了将按钮B定位在按钮A的右侧(图1):
你需要这样做:
<Button android:id="@+id/buttonA" ... />
<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toRightOf="@+id/buttonA" />
这告诉系统我们希望按钮B的左侧被约束到按钮A的右侧。这样的位置约束意味着系统将尝试让双方共享相同的位置。
以下是可用约束的列表(上图):
- 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
它们都引用id另一个小部件,或者parent引用父容器,即ConstraintLayout:
<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toLeftOf="parent" />
边距
如果设置了边距,则它们将应用于相应的约束(如果存在)(上图),将边距强制为目标和源边之间的空间。通常的布局边距属性可用于此效果:
- android:layout_marginStart
- android:layout_marginEnd
- android:layout_marginLeft
- android:layout_marginTop
- android:layout_marginRight
- android:layout_marginBottom
请注意,保证金只能是正数或等于零,并且需要a Dimension。
连接到GONE小部件时的边距
当位置约束目标的可见性为View.GONE,您还可以使用以下属性指示要使用的不同边距值:
- layout_goneMarginStart
- layout_goneMarginEnd
- layout_goneMarginLeft
- layout_goneMarginTop
- layout_goneMarginRight
- layout_goneMarginBottom
居中定位和偏压
一个有用的方面ConstraintLayout是它如何处理“不可能”的约束。例如,如果我们有类似的东西:
<android.support.constraint.ConstraintLayout ...>
<Button android:id="@+id/button" ...
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent/>
</android.support.constraint.ConstraintLayout>
在这种情况下发生的事情是,约束的作用就像是相反的力量将小部件拉平(图4); 这样小部件最终将在父容器中居中。这同样适用于垂直约束。
偏压
遇到这种相反的约束时的默认设置是使窗口小部件居中; 但是您可以使用偏差属性调整定位以使一侧偏向另一侧:
- layout_constraintHorizontal_bias
- layout_constraintVertical_bias
例如,以下将使左侧具有30%的偏差而不是默认的50%,使得左侧将更短,小部件更倾向于左侧(如上图):