ConstraintLayout 是个功能超级强大的布局,很多复杂的布局之前需要很多层嵌套现在都可以使用一个 ConstraintLayout 来解决,很大程度上解决了布局嵌套层级过多问题,不仅如此,还提供了很多其他高级功能,对习惯用拖拽布局的同学也很友好。
其中主要包含了如下几个功能点:
- 相对定位(Relative positioning)
- 居中定位(Centering position)及偏移(bias)
- 角度定位(Circular position)
- 链表定位(Chains)
- 边距(Margins)
- 尺寸限制(Dimension constraints)
- 辅助工具:Guideline、Barrier、Group、Placeholder
- 优化器(Optimizer)
下面逐一介绍:
定位约束
相对定位(Relative positioning)
相对定位的概念类似 RelativeLayout,使用一个控件相对于另一个控件的位置来描述其在整个布局中的位置。
例如我们让按钮 B 在按钮 A 的左边,可以使用如下代码:
<Button android:id="@+id/buttonA" ... />
<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toRightOf="@+id/buttonA" />
layout_constraintLeft_toRightOf 意为:当前按钮(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
可以看到参数命名是有规则的,前缀都是 layout_constraint,后面跟着的是两个空间的方位,第一个方位意思是当前按钮的某个部位,Left 就代表当前按钮的左边,第二个方位是目标按钮的部位,Right 就是右边,所以根据参数名字我们就能猜到作用,layout_constraintLeft_toLeftOf 就是约束当前控件的左边对其目标控件的左边。
很多布局控件都有 start 及 end 相关的参数,使用起来好像跟 left 和 right 没什么区别,实际上,控件方向一般来说都是从左到右,但也有部分国家的习惯是从右到左,当控件方向是从左到右时,start 等于 left,end 等于 right;控件方向从右至左时,start 等于 right,end 等于 left。
控件的方位约束如下图所示:
其中 BaseLine 是文本的 BaseLine,例如我们如果想让两个 Button 的文本对其,但是两个 Btn 的文本大小又不同,我们可以这么设置:
<Button android:id="@+id/buttonA" ...
android:textSize="40sp"/>
<Button android:id="@+id/buttonB" ...
android:textSize="20sp"
app:layout_constraintBaseline_toBaselineOf="@+id/buttonA" />
这样在显示的时候两个文本大小不同的控件就会居中对其。
另外,我们相对定位不仅可以相对于别的控件 ID,还可以相对于父布局(parent),如果我们想让一个控件在布局的左上角,可以这么设置:
<Button android:id="@+id/buttonA" ...
app:layout_constraintLeft_toLeftOf="parent"