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

相关推荐
千里马学框架11 分钟前
安卓系统中线程优先级Priority查看方式汇总
android·framework·线程·安卓framework开发·优先级·priority
沐怡旸15 分钟前
【Android】Handler/Looper机制相关的类图和流程图
android
生莫甲鲁浪戴21 分钟前
Android Studio新手开发第二十一天
android·ide·android studio
生莫甲鲁浪戴22 分钟前
Android Studio新手开发第二十二天
android·ide·android studio
用户41659673693551 小时前
Jetpack Compose 中实现带圆角边框的单词级富文本效果(分词与布局实践)
android
顾林海1 小时前
Android UI优化:让你的APP从“卡顿掉帧”到“丝滑如德芙”
android·面试·性能优化
啊森要自信1 小时前
【MySQL 数据库】MySQL用户管理
android·c语言·开发语言·数据库·mysql
黄毛火烧雪下1 小时前
(二)Flutter插件之Android插件开发
android·flutter
2501_916007472 小时前
iOS 上架技术支持全流程解析,从签名配置到使用 开心上架 的实战经验分享
android·macos·ios·小程序·uni-app·cocoa·iphone
sakoba3 小时前
MySQL的json处理相关方法
android·学习·mysql·json