Android ConstraintLayout 之ConstraintSet

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

方法属性

方法名 作用说明 参数简述 备注
clone(layout) 复制已有 ConstraintLayout 的约束信息 layout: ConstraintLayout 用于基于现有布局修改
applyTo(layout) 应用当前 ConstraintSet 到目标 ConstraintLayout layout: ConstraintLayout 动态生效修改
connect(startId, startSide, endId, endSide, margin=0) 连接两个控件或控件与父布局的边建立约束 startId, startSide, endId, endSide, margin margin 默认 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) 设置控件在指定方向的 margin viewId, side, value 控件可见时的间距
setGoneMargin(viewId, side, value) 设置控件 GONE 时指定方向的 margin viewId, 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的使用

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

3.ConstraintSet 的方法

scss 复制代码
// 1. 创建 ConstraintSet 对象
ConstraintSet constraintSet = new ConstraintSet()

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

3.1 clone(layout) 克隆一个 ConstraintLayout

scss 复制代码
// 1. 创建 ConstraintSet 对象
ConstraintSet constraintSet = new ConstraintSet()
constraintSet.clone(ConstraintLayout)

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

scss 复制代码
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) 连接两个控件的边,建立约束

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

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

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

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

scss 复制代码
// 3.5 设置控件宽度(单位 px)
constraintSet.constrainWidth(viewId, widthPx)

3.6 constrainHeight(viewId, value)

scss 复制代码
// 3.6 设置控件高度(单位 px)
constraintSet.constrainHeight(viewId, heightPx)

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

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

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

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

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

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

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

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

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

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

总结

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

相关推荐
robotx1 小时前
安卓线程相关
android
消失的旧时光-19432 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon3 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon3 小时前
VSYNC 信号完整流程2
android
dalancon3 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013844 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android4 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才5 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶6 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙6 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github