MotionLayout

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"

                       MotionLayout_第1张图片 

MotionLayout特别之处在于,它并没有包含在布局文件中。

而是将所有的信息保存在一个独立的xml文件里面,保存在xml文件中的信息优先级将会比layout中的高。

布局文件中只包含了View和它的属性,并没有包含他们的定位或者运动情况。

ConstraintSets

ConstraintSet是跟随ConstraintLayout 一起的,它封装了layout中的布局规则信息。

可以使用多个ConstraintSet

可以决定使用哪些布局规则作用到你的layout上

MotionScene

这个特殊的独立的xml就是MotionScene,存放在res/xml目录中。

一个MotionScene可以包含指定动画的所需要的一切。

  1. ConstraintSets
  2. 各种ConstraintSets 之间的变换
  3. 关键帧,触摸处理等等

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

 

你可能感兴趣的:(MotionLayout)