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 :
    • 仅针对Float类型做TweenSpec动画
  • FloatSpringSpec :
    • 仅针对Float类型做SpringSpec动画
  • 很少用到,因为tween()和spring()支持全量数据类型,这套API是底层做更精细的计算的时候,才会去使用,上层API调用,tween()和spring()足够了。

VectorizedAnimationSpec

  • 上层tween()和spring()等动画的底层对应AnimationSpec实现。
  • 事实上Compose的动画,最终都会转换成对应的VectorizedAnimationSpec的矢量类型动画接口实现。
  • 比如之前说过的AnimationVector1D等维度相关的动画参数: Animate2:Animatable

 评论