使用代码修改效果
MotionLayout 通过xml 写着很方便,但有时我们需要动态的改变转场效果,就需要通过代码来实现了。比如初始状态是xml 描述的转场效果,当我们点击按钮时,变成另外一种转场效果,类似如下效果图:

初始转场动画是一个简单的位移动画。
点击状态1按钮,转场动画变成除了平移转场动画外,还有rotationY 从1到180 和alpha 从1到0.1的过度转场动画。点击状态2按钮,平移转场结束的位置变了。
核心代码如下:
1 | btnState1.setOnClickListener(new View.OnClickListener() { |
通过代码动态改变转场大致有以下三步
- 通过MotionLayout的getConstraintSet获取要修改的的约束集ConstrainSet;
- 通过ConstrainSet的getConstraint的方法获取对应Contraint;
- 拿到Contraint之后,利用提供的方法,就可以改成自己想要的效果了。
和ViewPager组合使用
让动画随着ViewPager的滑动而运动。效果如下:

MotionLayout 有一个setProgress(float pos) 方法,当滑动ViewPager时,改变MotionLayout的执行进度。
布局如下:
1 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
viewpager_header.xml:
1 | <androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android" |
viewpager_header_scene.xml:
1 | <MotionScene xmlns:android="http://schemas.android.com/apk/res/android" |
核心代码如下:
1 | viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { |
添加viewPager的page改变监听器,在onPageScrolled 中根据位置和偏移量计算当前活动的进度,修改MotionLayout的progress的值,从而实现MotionLayout和ViewPager的联动。如果其它控件想实现联动也是类似方式。
参考资料:
knight康康 MotionLayout 使用说明书(进阶+实战)