Android ConstraintLayout 之ConstraintSet

326 阅读3分钟

日常开发中ConstraintLayout(约束布局)用到的越来越多,xml布局家常便饭了,但是牵扯到代码中动态修改布局的属性还是用到LayoutParams.ConstraintSet用的很少,所以就整理下ConstraintSet的一些设置的方法,方便后边使用

方法属性

方法名作用说明参数简述备注
clone(layout)复制已有 ConstraintLayout 的约束信息layout: ConstraintLayout用于基于现有布局修改
applyTo(layout)应用当前 ConstraintSet 到目标 ConstraintLayoutlayout: ConstraintLayout动态生效修改
connect(startId, startSide, endId, endSide, margin=0)连接两个控件或控件与父布局的边建立约束startId, startSide, endId, endSide, marginmargin 默认 0,指定间距
clear(viewId, side)清除控件指定方向的约束viewId, side避免约束冲突
constrainWidth(viewId, value)设置控件宽度viewId, value支持固定值或 MATCH_CONSTRAINT
constrainHeight(viewId, value)设置控件高度viewId, value支持固定值或 MATCH_CONSTRAINT
setDimensionRatio(viewId, ratio)设置控件宽高比例viewId, "W:H" 格式字符串例如 "16:9", "1:1"
setMargin(viewId, side, value)设置控件在指定方向的 marginviewId, side, value控件可见时的间距
setGoneMargin(viewId, side, value)设置控件 GONE 时指定方向的 marginviewId, side, value控件隐藏时生效
setHorizontalBias(viewId, bias)设置控件水平方向偏移比例viewId, bias(0~1)0为左,1为右
setVerticalBias(viewId, bias)设置控件垂直方向偏移比例viewId, bias(0~1)0为顶,1为底

1.ConstraintSet是什么

ConstraintSet 是 Android ConstraintLayout 提供的一个非常好用的工具类,它可以让你在 Java/Kotlin 代码中动态修改布局约束,而不必重新加载 XML 布局。

ConstraintSet是ConstraintLayout的一个工具类,可以在代码中动态修改属性.

2.ConstraintSet的使用

val constraintSet = ConstraintSet()
constraintSet.clone(constraintLayout) // 克隆当前布局的约束
// 这里修改各种属性
constraintSet.connect(viewId, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, margin)
constraintSet.applyTo(constraintLayout) // 应用修改

3.ConstraintSet 的方法

// 1. 创建 ConstraintSet 对象
ConstraintSet constraintSet = new ConstraintSet()

// 2. 克隆已有 ConstraintLayout 的约束信息(复制当前状态)
constraintSet.clone(ConstraintLayout)

3.1 clone(layout) 克隆一个 ConstraintLayout

// 1. 创建 ConstraintSet 对象
ConstraintSet constraintSet = new ConstraintSet()
constraintSet.clone(ConstraintLayout)

3.2 applyTo(layout) 应用当前ConstraintSet到ConstraintLayout

val constraintSet = ConstraintSet()
constraintSet.clone(constraintLayout) // 克隆当前布局的约束
// 这里修改各种属性
constraintSet.connect(viewId, ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, margin)
constraintSet.applyTo(constraintLayout) // 应用修改

3.3 connect(startID, startSide, endID, endSide, margin=0) 连接两个控件的边,建立约束

// 3.3 连接两个控件的边界,建立约束关系,支持设置 margin
constraintSet.connect(
    startViewId, startSide,    // 起点控件及边
    endViewId, endSide,        // 终点控件及边(可以是父控件ID)
    margin                     // 可选,间距
)

3.4 clear(viewId, anchor) 清除控件某个方向上的约束

// 3.4 清除某个控件指定方向的约束
constraintSet.clear(viewId, SIDE)

3.5 constrainWidth(viewId, value) 设定控件宽度

// 3.5 设置控件宽度(单位 px)
constraintSet.constrainWidth(viewId, widthPx)

3.6 constrainHeight(viewId, value)

// 3.6 设置控件高度(单位 px)
constraintSet.constrainHeight(viewId, heightPx)

3.7 setDimensionRatio(viewId, ratio) 设置宽高比例

// 3.7 设置宽高比例(字符串格式 "W:H")
constraintSet.setDimensionRatio(viewId, "16:9")

3.8 setMargin(viewId, anchor, value) 设置控件在某个方向的 margin

// 3.8 设置控件某个方向的 margin
constraintSet.setMargin(viewId, side, marginPx)

3.9 setGoneMargin(viewId, anchor, value) 当控件 GONE 时,设置 margin

// 3.9 设置控件某个方向的 gone 时的 margin
constraintSet.setGoneMargin(viewId, side, marginPx)

3.10 setHorizontalBias(viewId, bias) 设置控件水平方向偏移,0 左,1 右

// 3.10 设置控件水平方向偏移,范围 0.0(左)~ 1.0(右)
constraintSet.setHorizontalBias(viewId, bias)

3.11 setVerticalBias(viewId, bias) 设置控件垂直方向偏移,0 顶部,1 底部

// 3.11 设置控件水平方向偏移,范围 0.0(左)~ 1.0(右)
constraintSet.setVerticalBias(viewId, bias)

总结

ConstraintSet 是 Android ConstraintLayout 中用于动态修改布局约束的核心类,能在运行时方便地调整视图的位置、大小和关联关系。记录一下 方便cv