前言
Constraint Layout是Google在2016年的Google I/O大会上提出的一个可以灵活控制子控件的位置和大小的新布局。并且其号称可以实现布局最大程度的扁平化。
基本属性
View之间的约束关系建立的基本配置属性有一下13中:
- 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_toStartOf
- layout_constraintStart_toEndOf
- layout_constraintEnd_toStartOf
- layout_constraintEnd_toEndOf
总结:可以看出约束的对象就是 左右排列组合,上下排列组合,开始末尾排列组合,再加上一个文字底线对齐。
拿左右组合来说,button1设置app:layout_constraintLeft_toRightOf="@id/button2"
属性,button1的左边就会button2的右边,以此类推。

baseline对齐(文字底部)
可以设置文本View的文字底部基线对齐

边距
除了设置普通边距android:layout_marginXxx(Start|End|Left|Right|Top|Bottom)
上下左右开头末尾的边距,还可以使用layout_goneMarginXxx(Start|End|Left|Right|Top|Bottom)
配置依赖对象状态为gone时的margin
拉伸居中
layout_contraintX1xx_toX1xxOf="parent"
layout_contraintX2xx_toX2xxOf="parent"
在使用约束属性时,当X1xx和X2xx相对(即X1xx=Left,X2xx=Right)就会造成拉升情况。
layout_contraintLeft_toLeftOf="parent"
layout_contraintRight_toRightOf="parent"

偏压
在拉伸时可以设置拉伸的比例
layout_contraintHorizontal_bias="0.3"
layout_contraintVertical_bias="0.3"

圆形定位(在V1.1增加)
![]() |
![]() |
---|
在ConstraintLayout中可以设置View以另外一个View为圆心定位
<Button android:id="@+id/buttonB"
······
layout_constraintCircle="@id/buttonA"
layout_constraintCircleRadius="100dp"
layout_constraintCircleAngle="45"/> // 0~360
View的大小
在上面的拉伸居中其实隐藏一个前提条件,那就是子View的大小小于ConstraintLayout。
ConstraintLayout的子View设置android:layout_width
或者android:layout_height
时,match_parent
是无效的,可以使用0dp
来替代。

// (a)
<Button ······
android:layout_width="wrap_content" // 或者是固定值
app:layout_contraintLeft_toLeftOf="parent"
app:layout_contraintRight_toRightOf="parent"/>
// (b)
<Button ······
android:layout_width="0dp"
app:layout_contraintLeft_toLeftOf="parent"
app:layout_contraintRight_toRightOf="parent"/>
强制约束(在1.1增加)
在子View使用wrap_content,内容可能会超出最大使用空间,导致约束失效。可以用强制约束来保证约束的正常。
app:layout_contrainedWidth="true|false"
app:layout_contrainedHeight="true|false"
宽高百分比设置
子View参照父类宽高百分比设置大小前提
1、宽度要设置百分比要设置layout_width="0dp"
,高也相同
2、要设置任意一个约束约束关系
参照父类宽高

参照自身
<Button android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_contraintTop_toTopOf="parent"
app:layout_contraintDimensionRatio="3:4" // 0.75

app:layout_contraintDimensionRatio
的值是可以用比例或者float
表示宽高比;也可以指定限制w和h来表示限制的高度或者宽度
chains(链)
- 如果一组小部件通过双向连接,显示一个最小链,并带有两个小部件)连接在一起,则它们被视为链。

- 链由链的第一个元素(链的“头”)上设置的属性控制
- 头是水平链最左边的部件,也是垂直链最顶端的部件。

设置属性layout_constraintHorizontal_chainStyle或layout_constraintVertical_chainStyle链条的第一个元素时,链条的行为将根据指定的样式(默认为CHAIN_SPREAD)更改。
- CHAIN_SPREAD - 元素将被分散(默认样式)
- 加权链式CHAIN_SPREAD模式下,如果某些小部件设置为MATCH_CONSTRAINT,它们将拆分可用空间
- CHAIN_SPREAD_INSIDE - 类似,但链条的终点不会被分散
- CHAIN_PACKED - 链条的元素将被打包在一起。小孩的水平或垂直偏向属性将影响打包元素的位置

Guideline
辅助对象,可以做为参数线设置空间对齐,本身不会显示。有竖直和水平两种,可以设置距离begin/end
dp数值,可以按照高宽的百分设置。

<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="100dp"
app:layout_constraintGuide_end="100dp"
app:layout_constraintGuide_percent="0.5"/>
查看源码可以看出,在Guideline所有构造方法中,设置为隐藏(public static final int GONE = 0x00000008;
),并重写了setVisibility(int visibility)
为空实现。
public class Guideline extends View {
public Guideline(Context context) {
super(context);
super.setVisibility(8);
}
// 空实现
public void setVisibility(int visibility) {
}
// 设置宽高等于0
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
this.setMeasuredDimension(0, 0);
}
······其他方法
使用Guideline来居中对齐两个按钮

优点:
- 功能强大,合适使用基本可以改善嵌套层级过多问题。
- 集成了LinearLayout、Relativelayout、percent-support-lib 特点
缺点:
- 布局复杂,控件比较多时,使用拖拉不太方便,容易误伤,建议代码编写布局
网友评论