前言
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为圆心定位
// 0~360
View的大小
在上面的拉伸居中其实隐藏一个前提条件,那就是子View的大小小于ConstraintLayout。
ConstraintLayout的子View设置android:layout_width
或者android:layout_height
时,match_parent
是无效的,可以使用0dp
来替代。
// (a)
// (b)
强制约束(在1.1增加)
在子View使用wrap_content,内容可能会超出最大使用空间,导致约束失效。可以用强制约束来保证约束的正常。
app:layout_contrainedWidth="true|false"
app:layout_contrainedHeight="true|false"
宽高百分比设置
子View参照父类宽高百分比设置大小前提
1、宽度要设置百分比要设置layout_width="0dp"
,高也相同
2、要设置任意一个约束约束关系
参照父类宽高
参照自身
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数值,可以按照高宽的百分设置。
查看源码可以看出,在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 特点
缺点:
- 布局复杂,控件比较多时,使用拖拉不太方便,容易误伤,建议代码编写布局