type
status
date
slug
summary
tags
category
password
icon
过渡动画使⽤
有两种使⽤⽅式
TransitionManager#beginDelayedTransition
TransitionManager#go()
其中使⽤go()
调⽤,需要重新绑定数据(因为 View 会被重新添加)。
过渡动画和属性动画的区别
过渡动画是创建一个开始状态,和一个结束状态,有过渡动画将开始状态切换到结束状态,这个过程中,会真正的修改组件的属性。
属性动画是基于组件的属性做缩放/位移/旋转,但组件实际的属性并未修改(实际修改了,但是不会影响到其他组件)
过渡动画原理
过渡动画指的是两个场景之间的过渡,⼀个「开始场景」⼀个「结束场景」
- 我们就要从场景上记录⾥⾯控件的各种参数
- 根据两个场景的各种参数,创建出属性动画,播放属性动画
对应 Transition 上的关键函数
- 捕获并记录对应属性
captureStartValues
和 captureEndValues
- 基于捕获的值创建对应动画,并播放动画
createAnimator
和 playTransition
MotionLayout
MotionLayout 使⽤
ConstraintLayout
改为MotionLayout
- 创建
MotionScene
⽂件并使⽤app:layoutDescription
关联
MotionLayout 继承了 ConstraintLayout
Constraint 节点
- 运动模型
弧线路径,时间模型等
- 布局相关
注意, width 、 height 和 margin 的命名空间是 android: (beta1 开始)⽽约束相关的命名空间是 app (或 motion )
- 动画变换
做旋转,位移,缩放,海拔等属性
- ⾃定义属性
attributeName
会加上set/get
反射找到真正的函数名,⽐如backgroundColor
就会调⽤setBackgroundColor()
函数custom(xxx)Value
对应属性的数据类型
- 特定的属性
visibility
、 alpha
等属性时间模型
- 每个控件可以单独设置时间模型
在
<Motion>
节点中使⽤ app:transitionEasing
- 整个
Transition
也可以设置插值器
在
<Transition>
中使⽤ app:motionInterpolator
MotionScene
Transition 节点
- motion:motionInterpolator:设置全局的运动差值器。
onSwipe
<OnSwipe>
添加在 <Transtion>
节点中⽀持的参数:touchAnchorId
指的是哪⼀个控件响应触摸事件。
dragDirection
拖拽的⽅向
onTouchUp
默认是autoComplete
,会根据动画完成的百分⽐⾃动到最近的⼀个状态
OnClick
targetId
指定控件
clickAction
toggle
反转状态transitionToEnd/Start
通过动画到结束/起始状态jumpToEnd/Start
没有动画直接到结束/起始状态
KeyFrameSet
内部的子标签都具有下面两个属性:
app:motionTarget
⽬标对象 id
app:framePosition
动画完成度百分⽐ (0 ‐ 100)
KeyAttribute 属性关键字
可以设置位移,旋转,缩放等属性,同时还可以通过
CustomAttribute
添加⾃定义属性KeyPosition 位置关键帧
percentX/Y
在关键帧时,对应路径的对应百分⽐percentWidth/Height
在关键帧时,控件⼤⼩改变的百分⽐curveFit
运动路径的样式(直线,曲线等)motion:pathMotionArc
设置运动轨迹的模式,使用时开始位置也需要设置该属性,通过如下方式:keyPositionType
坐标系 (结合课上的画图理解)- parentRelative
(0,0)为⽗容器左上⻆
(1,1)为⽗容器右下⻆
- deltaRelative
(0,0)为起始控件中⼼
(1,1)为结束控件中⼼
- pathRelative
(0,0)为起始控件中⼼
(1,0)为结束控件中⼼
KeyCycle 和 KeyTimeCycle
通过 3 个 KeyCycle 定义⼀个准确的循环关键帧
wavePeriod
循环次数 (KeyTimeCycle
表示的每秒循环次数)waveShape
数学模型KeyTrigger
绑定触发指定方法
例如:在动画正向执行到 80% 时,调用
@id/view
这个 View 的 hide 方法如果想要触发的方法不存在,也可以对 MotionLayout 设置监听
ConstraintSet
android:id="@+id/[start|end]"
设置开始和结束时,动画的状态
ConstraintOverride
Constraint
android:id="@+id/view"
所对应的 View 的 id
也可以像这么写 Constraint
这种写法就是把原来布局中 View 的布局直接搬过来,就表示这个 View 这时的状态。那么开始和结束的状态就必须将这些属性都带上,不然就会使用默认值。
而使用下面的子节点的方式,就可以专门针对性的控制,不用把所有的属性都带上。
子节点有
- Layout
节点的布局状态
- Motion
motion:pathMotionArc
设置运动轨迹的模式motion:transitionEasing
设置运动速度模型
- CustomAttribute
app:attributeName=”backgroundColor”
自定义属性名app:customXxxxValue=“value”
该属性的值
- PropertySet
android:alpha
android:visibility
app:visibilityMode
app:layout_constraintTag
app:motionProgress
- Transform
android:rotation
设置旋转android:scaleX/Y
设置缩放
- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/cf3aee25-2c4a-4ba6-963b-646becdb7d54
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。