上篇Android布局ConstraintLayout代码修改约束讲解了通过代码设置ConstraintLayout的属性,这次来讲讲一个强大的工具。
在 Android 中,ConstraintSet
是 ConstraintLayout 的强大工具,用于在运行时修改布局约束。它可以设置几乎所有在 XML 中定义的约束属性。以下是 ConstraintSet 支持的主要属性分类:
// 设置视图的水平约束
constraintSet.connect(R.id.viewId, ConstraintSet.START, R.id.anchorId, ConstraintSet.START);
constraintSet.connect(R.id.viewId, ConstraintSet.END, R.id.anchorId, ConstraintSet.END);
constraintSet.connect(R.id.viewId, ConstraintSet.LEFT, R.id.anchorId, ConstraintSet.RIGHT);
constraintSet.connect(R.id.viewId, ConstraintSet.RIGHT, R.id.anchorId, ConstraintSet.LEFT);
// 设置视图的垂直约束
constraintSet.connect(R.id.viewId, ConstraintSet.TOP, R.id.anchorId, ConstraintSet.BOTTOM);
constraintSet.connect(R.id.viewId, ConstraintSet.BOTTOM, R.id.anchorId, ConstraintSet.TOP);
// 设置边距
constraintSet.setMargin(R.id.viewId, ConstraintSet.START, 16);
constraintSet.setMargin(R.id.viewId, ConstraintSet.END, 16);
// 设置百分比位置
constraintSet.setHorizontalBias(R.id.viewId, 0.5f); // 水平居中
constraintSet.setVerticalBias(R.id.viewId, 0.75f); // 垂直方向75%位置
// 设置固定尺寸
constraintSet.constrainWidth(R.id.viewId, 200);
constraintSet.constrainHeight(R.id.viewId, ConstraintSet.WRAP_CONTENT);
// 设置百分比尺寸
constraintSet.constrainPercentWidth(R.id.viewId, 0.5f); // 宽度为父布局的50%
constraintSet.constrainPercentHeight(R.id.viewId, 0.3f); // 高度为父布局的30%
// 设置尺寸比例
constraintSet.setDimensionRatio(R.id.viewId, "16:9"); // 宽高比16:9
constraintSet.setDimensionRatio(R.id.viewId, "H,2:1"); // 高度是宽度的2倍
// 创建水平链
constraintSet.createHorizontalChain(
ConstraintSet.PARENT_ID, ConstraintSet.START,
ConstraintSet.PARENT_ID, ConstraintSet.END,
new int[]{R.id.view1, R.id.view2, R.id.view3},
null, // 权重
ConstraintSet.CHAIN_SPREAD // 链样式
);
// 创建垂直链
constraintSet.createVerticalChain(
ConstraintSet.PARENT_ID, ConstraintSet.TOP,
ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM,
new int[]{R.id.view1, R.id.view2},
new float[]{1f, 2f}, // 权重
ConstraintSet.CHAIN_PACKED // 链样式
);
// 设置链的样式
constraintSet.setHorizontalChainStyle(R.id.view1, ConstraintSet.CHAIN_SPREAD_INSIDE);
// 设置 Barrier
constraintSet.createBarrier(R.id.barrierId, ConstraintSet.END, R.id.view1, R.id.view2);
constraintSet.setBarrierMargin(R.id.barrierId, 16);
// 设置 Guideline
constraintSet.createGuideline(R.id.guidelineId, ConstraintSet.VERTICAL, 0.5f); // 垂直50%位置
// 设置 Group 可见性
constraintSet.setVisibility(R.id.groupId, View.VISIBLE);
// 设置动画插值器
constraintSet.setInterpolator(R.id.viewId, android.R.interpolator.accelerate_decelerate);
// 设置过渡动画持续时间
constraintSet.setTransitionDuration(500); // 500毫秒
// 设置视图消失/出现的动画
constraintSet.setAnimateChangeBounds(true);
// 设置可见性
constraintSet.setVisibility(R.id.viewId, View.GONE);
// 设置旋转
constraintSet.setRotation(R.id.viewId, 45f);
// 设置缩放
constraintSet.setScaleX(R.id.viewId, 0.8f);
constraintSet.setScaleY(R.id.viewId, 0.8f);
// 设置偏移
constraintSet.setTranslationX(R.id.viewId, 100f);
constraintSet.setTranslationY(R.id.viewId, -50f);
// 设置重要性
constraintSet.setImportantForAccessibility(R.id.viewId, View.IMPORTANT_FOR_ACCESSIBILITY_YES);
// 创建 ConstraintSet
ConstraintSet constraintSet = new ConstraintSet();
// 克隆当前布局约束
constraintSet.clone(constraintLayout);
// 修改约束
constraintSet.connect(R.id.textView, ConstraintSet.START, R.id.button, ConstraintSet.END, 16);
constraintSet.constrainWidth(R.id.textView, ConstraintSet.WRAP_CONTENT);
constraintSet.setRotation(R.id.textView, 15f);
// 应用新约束
constraintSet.applyTo(constraintLayout);
R.id.viewId
引用布局中的视图applyTo()
可能影响性能,建议批量修改约束TransitionManager
使用可实现平滑动画效果通过 ConstraintSet,您可以在运行时灵活地修改布局约束,实现复杂的动画和响应式界面。