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