为更方便地实现控件的变换动画,Android引入了ConstraintSet,来看下下面这个例子,我们需要将图1两个按钮的位置变换成图2两个按钮的位置,用补间动画和属性动画都可以实现,这里不讲这两种方式,来看看ConstraintSet的实现方式:
![](https://img.haomeiwen.com/i24073781/09673e34db641dec.png)
![](https://img.haomeiwen.com/i24073781/f35aee49a4bf36c8.png)
两者的布局分别是activity_main.xml
![](https://img.haomeiwen.com/i24073781/7166644d605efdd8.png)
和activity_main1.xml
![](https://img.haomeiwen.com/i24073781/290b9af53d40f258.png)
MainActivity.java中的实现代码:
private ConstraintSetcs1, cs2;
private ConstraintLayoutcl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cs1 =new ConstraintSet();
cs2 =new ConstraintSet();
cl = findViewById(R.id.cl_container);
cs1.clone(cl);
cs2.clone(this, R.layout.activity_main1);
}
/**
* 变换成垂直
*/
private void vertical() {
TransitionManager.beginDelayedTransition(cl);
cs2.applyTo(cl);
}
/**
* 变换成水平
*/
private void horizontal() {
TransitionManager.beginDelayedTransition(cl);
cs1.applyTo(cl);
}
来看看效果:
![](https://img.haomeiwen.com/i24073781/442f3c1fba2cb453.gif)
![](https://img.haomeiwen.com/i24073781/5568942551ddb52f.gif)
两个布局的ConstraintLayout的必须一致,子控件的id也必须一致,否则对应不上。ConstraintLayout中的子控件必须都有id,否则会报java.lang.RuntimeException: All children of ConstraintLayout must have ids to use ConstraintSet异常。假如activity_main1.xml的按钮1删掉了,则变换过程中Button1位置和样式不会发生变化。
网友评论