全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

ConstraintSet详解

发布时间:2023-11-24 10:36:55
发布人:xqq

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。

composer卸载包

相关文章

使用xversion进行版本控制

使用xversion进行版本控制

2023-11-24
如何解决Tomcat的404错误

如何解决Tomcat的404错误

2023-11-24
linux系统杀进程的命令,linux常用命令杀进程

linux系统杀进程的命令,linux常用命令杀进程

2023-11-24
wherenotexists详解

wherenotexists详解

2023-11-24

最新文章

武汉新媒体行业公司排名

武汉新媒体行业公司排名

2023-11-01
武汉新媒体就业现状好吗

武汉新媒体就业现状好吗

2023-11-01
武汉全媒体行业发展现状及趋势

武汉全媒体行业发展现状及趋势

2023-10-31
武汉全媒体现状

武汉全媒体现状

2023-10-31
在线咨询 免费试学 教程领取