AnimationSpec II
- 前面文章我们介绍了TweenSpec、SnapSpec、KeyframesSpec,他们都是时间固定的动画,也就是duration是需要指定的。
- 我们还会碰到,duration不固定的动画。比如不论原生Property Animation也好,还是Compose现在的动画框架,在弹簧类型效果这种物理模型,就没有办法设置动画时长。
SpringSpec
- Spring:首先不是春天的意思,是弹簧。
- 所以这个就是弹簧效果。
- SpringSpec的参数:
class SpringSpec<T>(
val dampingRatio: Float = Spring.DampingRatioNoBouncy,//阻尼比(阻尼系数,弹簧嘛,顾名思义,就是弹簧的效果 ) 默认(1)NoBouncy,就是没有弹性.
val stiffness: Float = Spring.StiffnessMedium,//弹簧刚度(表示弹簧作用的频率强度) 默认1500f
val visibilityThreshold: T? = null//可见度阈值(现实世界里,运动是永远不停止的,所以为了节约GPU又更逼近现实,所以有了一个可见度控制变量) 默认0.01
) : FiniteAnimationSpec<T> {
const val StiffnessHigh = 10_000f
const val StiffnessMedium = 1500f
const val StiffnessMediumLow = 400f
const val StiffnessLow = 200f
const val StiffnessVeryLow = 50f
const val DampingRatioHighBouncy = 0.2f
const val DampingRatioMediumBouncy = 0.5f
const val DampingRatioLowBouncy = 0.75f
const val DampingRatioNoBouncy = 1f
}
属性 |
解释 |
dampingRatio |
阻尼比(阻尼系数,弹簧嘛,顾名思义,就是弹簧的效果 ) 默认NoBouncy,就是没有弹性. |
(0 -无穷大]代表弹性从(Q弹)->(毫无弹性,甚至出现到达target位置速度变慢的情况) |
stiffness |
弹簧刚度(表示弹簧作用的频率强度) |
(0- 无穷大]代表频率从低到高 |
visibilityThreshold |
可见度阈值(现实世界里,运动是永远不停止的,所以为了节约GPU又更逼近现实,所以有了一个可见度控制变量) |
一般不需要设置 |
anim.animateTo(48.dp, spring(0.1f, Spring.StiffnessMedium), 2000.dp)
RepeatableSpec
属性 |
解释 |
iterations |
重复次数(不可以为0,会报错,1的时候动画仅执行一次) |
[1,无穷大] |
animation |
DurationBasedAnimationSpec,就是其他有动画时长属性的动画的父接口 |
SnapSpec、TweenSpec等(不包括SpringSpec、按我的理解是因为没有固定动画时常) |
repeatMode |
重复模式 |
RepeatMode.Restart/RepeatMode.Reverse |
initialStartOffset |
启动时间的偏移 |
StartOffset(Int,StartOffsetType) |
- StartOffsetType:
- 启动时间偏移类型
- 延迟启动 -> StartOffsetType.Delay
- 快进 -> StartOffsetType.FastForward
anim.animateTo(90.dp, repeatable(2, tween(), RepeateMode.Restart, StartOffset(100, StartOffsetType.FastForward)))
InfiniteRepeatableSpec
- 无限循环AnimationSpec
- 这个API其实是RepeatableSpec的一个语法糖封装,底层原理是一致的,我理解只是为了开发者编写方便。
- 关键差异就只是不需要填写iterations
属性 |
解释 |
animation |
DurationBasedAnimationSpec,就是其他有动画时长属性的动画的父接口 |
SnapSpec、TweenSpec等(不包括SpringSpec、按我的理解是因为没有固定动画时常) |
repeatMode |
重复模式 |
RepeatMode.Restart/RepeatMode.Reverse |
initialStartOffset |
启动时间的偏移 |
StartOffset(Int,StartOffsetType) |
- 动画结束:
- 当动画所依赖的协程结束,animateTo就结束了。(协程取消就结束动画了、比如重组过程中,LaunchedEffect不在重组范围内了,那么协程就结束了)
anim.animateTo(90.dp, infiniteRepeatable(tween(), RepeateMode.Reverse, StartOffset(100, StartOffsetType.FastForward)))
FloatAnimationSpec
- FloatTweenSpec :
- FloatSpringSpec :
- 很少用到,因为tween()和spring()支持全量数据类型,这套API是底层做更精细的计算的时候,才会去使用,上层API调用,tween()和spring()足够了。
VectorizedAnimationSpec
- 上层tween()和spring()等动画的底层对应AnimationSpec实现。
- 事实上Compose的动画,最终都会转换成对应的VectorizedAnimationSpec的矢量类型动画接口实现。
- 比如之前说过的AnimationVector1D等维度相关的动画参数: Animate2:Animatable