千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > ConstraintSet详解

ConstraintSet详解

来源:千锋教育
发布人:xqq
时间: 2023-11-24 10:36:55 1700793415

ConstraintSet是Android中一个非常有用的布局控制器,可以帮助开发者实现高级的布局效果。在本文中,我们将从多个方面来详细介绍ConstraintSet。

一、ConstraintSet无效

在使用ConstraintSet时,可能会遇到它无效的情况。实际上,ConstraintSet本身并不会让布局无效,而是在使用它的时候,有一些常见的错误容易导致它无效。

首先,要注意在设置ConstraintSet之前,必须先将布局视图的全部控件从布局中移除,并且将他们重置:


constraintLayout.removeAllViews();
constraintSet.clone(constraintLayout);

其次,在使用ConstraintSet对控件进行布局时,需要注意设置控件的宽高。如果没有设置宽高,约束条件也会变得无效:


constraintSet.connect(view.getId(), ConstraintSet.TOP, parent.getId(), ConstraintSet.TOP);
constraintSet.connect(view.getId(), ConstraintSet.LEFT, parent.getId(), ConstraintSet.LEFT);
constraintSet.constrainWidth(view.getId(), ConstraintSet.WRAP_CONTENT);
constraintSet.constrainHeight(view.getId(), ConstraintSet.WRAP_CONTENT);

最后,记得使用applyTo()方法将ConstraintSet应用到布局视图中:


constraintSet.applyTo(constraintLayout);

二、ConstraintSet动态

ConstraintSet可以动态地修改布局。这对于需要实时修改UI布局的应用程序特别有用。例如,可以在用户单击一个按钮时,添加或删除控件的约束条件,或者改变控件的位置或大小。

在动态地修改布局时,我们可以使用ConstraintSet的属性设置方法,例如:


constraintSet.setHorizontalBias(view.getId(),0.5f);
constraintSet.setVerticalBias(view.getId(),0.5f);
constraintSet.centerHorizontally(view.getId(),parent.getId());
constraintSet.centerVertically(view.getId(),parent.getId());
constraintSet.clear(view.getId(), ConstraintSet.TOP);
constraintSet.clear(view.getId(), ConstraintSet.LEFT);

在设置完属性之后,我们还要调用applyTo()方法将修改后的ConstraintSet应用到布局中:


constraintSet.applyTo(constraintLayout);

三、ConstraintSet动画

通过ConstraintSet,我们可以实现非常丰富的动画效果,例如渐变动画、缩放动画、移动动画等等。

实现动画的方式是,我们可以通过ConstraintSet来指定开始状态和结束状态,然后通过TransitionManager来自动地执行动画效果。例如,在实现一个渐变动画时,可以这样做:


//创建一个新的ConstraintSet,命名为set2
ConstraintSet set2 = new ConstraintSet();

//设置set2的控件属性
set2.clone(constraintLayout);
set2.clear(R.id.view1, ConstraintSet.LEFT);
set2.clear(R.id.view1, ConstraintSet.TOP);
set2.connect(R.id.view1, ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT);
set2.connect(R.id.view1, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM);

//设置TransitionManager
TransitionManager.beginDelayedTransition(constraintLayout);
set2.applyTo(constraintLayout);

上面的代码将控件view1从屏幕的左上角移动到右下角。在设置完属性之后,我们调用了TransitionManager的beginDelayedTransition()方法,该方法会自动地生成动画效果。

四、ConstraintSet动态修改

有时,我们需要动态地修改已有的控件的约束条件,例如改变控件的位置、大小、间距等。

首先,我们需要使用ConstraintSet.clone()方法创建一个新的ConstraintSet,然后使用ConstraintSet.connect()方法建立新的约束条件。例如,在动态地修改控件间距时,可以这样做:


//新建ConstraintSet
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout);

//建立新的约束条件
constraintSet.setMargin(R.id.view1, ConstraintSet.TOP, 50);
constraintSet.setMargin(R.id.view2, ConstraintSet.LEFT, 50);

//应用新的ConstraintSet
constraintSet.applyTo(constraintLayout);

上面的代码将控件view1和view2与父布局的距离都增加了50。

五、ConstraintSet动态修改控件位置

除了改变约束条件,我们还可以直接改变控件的位置,例如左上角、右下角等等。我们可以使用ConstraintSet.setX()和ConstraintSet.setY()方法,同时也可以使用ConstraintSet.setWidth()和ConstraintSet.setHeight()方法来改变控件的大小。

例如,在动态地修改控件位置和大小时,可以这样做:


//新建ConstraintSet
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout);

//设置控件的位置和大小
constraintSet.clear(R.id.view1, ConstraintSet.LEFT);
constraintSet.clear(R.id.view1, ConstraintSet.TOP);
constraintSet.connect(R.id.view1, ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT);
constraintSet.connect(R.id.view1, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM);
constraintSet.constrainWidth(R.id.view1, ConstraintSet.MATCH_CONSTRAINT);
constraintSet.constrainHeight(R.id.view1, ConstraintSet.MATCH_CONSTRAINT);

//应用新的ConstraintSet
constraintSet.applyTo(constraintLayout);

上面的代码将控件view1的位置设置为了右下角,并且将大小设置为MATCH_CONSTRAINT。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT