MotionLayout是什么?
是ConstraintLayout的子类
混合了属性动画框架、TransitionManager的布局转换和CoordinatorLayout
属性动画:通过获取控件的一些属性如宽度、高度等的get和set方法,改变控件的形态,实现动画效果
MotionLayout:
1.像TranstionManager一样描述两个布局之间的过渡
2.在转换过程中,任何属性都能以动画的形式过渡(不仅仅是已有属性,自定义属性也可以)
3.支持可见的转换,就像CoordinatorLayout一样转换完全由触摸驱动,并且立即转换到任意点
4.支持触摸处理和关键帧,允许开发者非常容易的定制元素之间的过渡。
API支持最低为14
MotionLayout的限制
只能对其直属的子View提供各种变换功能。
(话题外:ScrollView只能有一个子控件)
什么时候使用MotionLayout
当你想缩放、移动或者缩放页面上的UI元素
需要用户与UI交互,使用户更理解你的程序将会做什么。
MotionLayout的使用
implementation "androidx.constraintlayout:constraintlayout:2.0.0-beta3"
<androidx.constraintlayout.motion.widget.MotionLayout……/>
MotionLayout特别之处在于,它并没有包含在布局文件中。
而是将所有的信息保存在一个独立的xml文件里面,保存在xml文件中的信息优先级将会比layout中的高。
布局文件中只包含了View和它的属性,并没有包含他们的定位或者运动情况。
ConstraintSets
ConstraintSet是跟随ConstraintLayout 一起的,它封装了layout中的布局规则信息。
可以使用多个ConstraintSet
可以决定使用哪些布局规则作用到你的layout上
MotionScene
这个特殊的独立的xml就是MotionScene,存放在res/xml目录中。
一个MotionScene可以包含指定动画的所需要的一切。
- ConstraintSets
- 各种ConstraintSets 之间的变换
- 关键帧,触摸处理等等
OnSwipe handler
这个handler的功能就是让你通过你手指驱动这个变换的进行。
这里有些参数需要设定:
touchAnchorId : 需要跟踪的对象(这里,我们使用@+id/button)
touchAnchorSide: 应该跟踪你手指的物体的侧面(right/left/top/bottom)
dragDirection: 我们拖动物体的方向(dragRight/dragLeft/dragUp/dragDown) 将会定义滑动的完成度(0-1)
独立的MotionScene
MotionLayout也支持直接在MotionScene文件中描述ConstraintSets
ConstraintSet
会替代所有被标记的组件
ConstraintSet的功能不是叠加的,上一个ConstraintSet和下一个ConstraintSet的功能是不相互影响的,后一个ConstraintSet被应用时,前一个ConstraintSet所有的约束都会被清空。
如果你的布局中有非常多的组件,但是只有一个你想使用动画的组件,那么在MotionScene 文件中,只需要关联这个动画组件即可,其他的组件可以不管。
MotionLayout的属性
app:layoutDescription=”reference” 指定你需要绑定的MotionScene XML 文件
app:applyMotionScene=”boolean” 是否启用MotionScene,默认是true
app:showPaths=”boolean” debug模式比较有用的模式,可以显示动画运动的路径
app:progress=”float” 指定转换的完成度 范围是0 - 1
app:currentState=”reference” 强制指定特定的ConstraintSet
示例:
https://github.com/googlesamples/android-ConstraintLayoutExamples