原文:
ConstraintLayout layouts
作者:
Mark Allison
、
Sebastiano Poggi
本文将列举讲述如何使用
ConstraintLayout
来代替常见的三种布局 LinearLayout 、 RelatvieLayout 、
PercentLayout
的用法,本文使用的 Android Studio 都是
2.4 alpha 7
版本的,而 ConstraintLayout 库是使用的
1.0.2
。
LinearLayout
浮动对齐特性
在 XML 中实现浮动对齐特性
在 XML 中实现该特性也仅仅是为每一个 View 实现一个约束属性
app:layout_constraintTop_toBottomOf
到整个浮动布局中在它之前的 View。
|
子组件权重特性
要想创建跟 LinearLayout 类似的 weight 权重特性的话,我们需要创建约束 Chain 链,详细可以看看我的 另一篇文章 ,表现如下图:
Chain 链创建后,我们只需要在属性视图中为每个需要设置 weight 权重的链组件修改
layout_width
为
match_constraint
或者
0dp
(两者是一样的),然后再设置对应的权重值到
weight
的配置属性,因为这个例子中我们使用的是水平的 Chain 链,所以设置权重的时候设置的属性是
horizontal_weight
,如下图。
最后,我们就可以再 blueprint 蓝图视图下看到如下的展现:
在 XML 中实现权重特性
首先要如之前的教程一样,
在 XML 创建 Chain 链
,然后实现如上的效果只需要对
textView3
修改属性
android:layout_width="0dp"
并且设置新属性
app:layout_constraintHorizontal_weight="1"
,如下:
|
这里
app:layout_constraintHorizontal_weight
属性设置的值与
LinearLayout
中设置的
android:layout_weight
是一样的值并且用法一样,将会根据所有子组件的设置的权重比分割剩余的空间。
RelativeLayout
在视图编辑器中实现 RelativeLayout
相似效果的属性对应表
上面已经提到了
RelativeLayout
和
ConstraintLayout
的基本特性概念非常相似。你可以通过查阅我的
另一篇文章
来熟悉
ConstraintLayout
的基础,然后使用如下面的表格中对应的属性来转换
RelativeLayout
中的属性到
ConstraintLayout
。
相对父组件
RelativeLayout
属性
|
ConstraintLayout
属性
|
---|---|
android:layout_alignParentLeft="true"
|
app:layout_constraintLeft_toLeftOf="parent"
|
android:layout_alignParentLeft="true"
|
app:layout_constraintLeft_toLeftOf="parent"
|
android:layout_alignParentStart="true"
|
app:layout_constraintStart_toStartOf="parent"
|
android:layout_alignParentTop="true"
|
app:layout_constraintTop_toTopOf="parent"
|
android:layout_alignParentRight="true"
|
app:layout_constraintRight_toRightOf="parent"
|
android:layout_alignParentEnd="true"
|
app:layout_constraintEnd_toEndOf="parent"
|
android:layout_alignParentBottom="true"
|
app:layout_constraintBottom_toBottomOf="parent"
|
android:layout_centerHorizontal="true"
|
app:layout_constraintStart_toStartOf="parent"
和
app:layout_constraintEnd_toEndOf="parent"
|
android:layout_centerVertical="true"
|
app:layout_constraintTop_toTopOf="parent"
和
app:layout_constraintBottom_toBottomOf="parent"
|
android:layout_centerInParent="true"
|
app:layout_constraintStart_toStartOf="parent"
,
app:layout_constraintTop_toTopOf="parent"
,
app:layout_constraintEnd_toEndOf="parent"
, 和
app:layout_constraintBottom_toBottomOf="parent"
|
对齐到其他 View 组件边缘或者基线
RelativeLayout
属性
|
ConstraintLayout
属性
|
---|---|
android:layout_toLeftOf
|
app:layout_constraintRight_toLeftOf
|
android:layout_toStartOf
|
app:layout_constraintEnd_toStartOf
|
android:layout_above
|
app:layout_constraintBottom_toTopOf
|
android:layout_toRightOf
|
app:layout_constraintLeft_toRightOf
|
android:layout_toEndOf
|
app:layout_constraintStart_toEndOf
|
android:layout_below
|
app:layout_constraintTop_toBottomOf
|
android:layout_alignLeft
|
app:layout_constraintLeft_toLeftOf
|
android:layout_alignStart
|
app:layout_constraintStart_toStartOf
|
android:layout_alignTop
|
app:layout_constraintTop_toTopOf
|
android:layout_alignRight
|
app:layout_constraintRight_toRightOf
|
android:layout_alignEnd
|
app:layout_constraintEnd_toEndOf
|
android:layout_alignBottom
|
app:layout_constraintBottom_toBottomOf
|
android:layout_alignBaseline
|
app:layout_constraintBaseline_toBaselineOf
|
Constraint 约束对于不显示的
GONE
Views
PercentLayout
PercentLayout
通常被用于响应式布局设计,当需要根据父组件来缩放子组件到百分比的情况。
相对父组件的百分比宽高
然后我们就需要创建一个 View 将它的创建约束到父组件的
start
边缘以及
end
约束到参照线。在此处,我们没有使用
left
而使用
start
是为了更友好的支持 RTL 语言(从右到左布局,right to left)
同时,我们还需要注意的是我们需要设置
android:layout_width
是被设置成了
0dp
或者
match_constraint
(源码层面,他们是一样的)。然后移除这个 View 的外边距,那么这个 View 的宽度就会自动设置成父组件的
25%
,进一步操作如下图所示:
在 XML 中实现百分比宽高
|
实际上真正对齐百分比宽高是由 Guidline 完成的,百分比宽的 TextView 只是创建了一个约束到参照线 Guideline就能实现固定的百分比宽高。
相对父组件的百分比外边距 margin
然后,在这个例子中我们还设置这个 View 的宽度
android:layout_width="wrap_content"
,然后移除各个方向的外边距 margin ,然后 View 就会有相对于父组件的 25% 宽度外边距 margin。
在 XML 中实现百分比外边距
在 XML 中,参照线 Guidline 是跟上面的例子一样的设置,如下:
|
实现固定横纵比布局
最后一个特性就是实现
PercentLayout
的横纵比特性,通过它可以让高度固定比例为宽度的函数,或者反过来。关于
ConstraintLayout
如何实现横纵比尺寸,我有
另一篇文章
更详细的讲解了这个特性。首先我们设置一个固定的比例,然后设置这个 View 的宽高为
match_constraint
或
0dp
:
然后我们设置好水平方向的两个约束条件,然后至少保留一个垂直方向的约束不设置,那么我们的组件 View 高度就会是依赖于宽度的函数,然后通过移动参照线来缩放 View 的宽度的时候就会发现高度也会相应的根据函数变化。
在 XML 中设置横纵比布局
在 XML 中,真正设置了宽高比的属性是
app:layout_constraintDimensionRatio
为想要的值,其他规则跟在视图编辑器中是一样的。
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" |
最后提醒一下,没懂的小伙伴可以看看另一篇文章 ConstraintLayout基础系列之尺寸横纵比 dimensions 。