动画流程控制

block

  • 支持动画监听的工作。
    suspend fun animateTo(
        targetValue: T,
        animationSpec: AnimationSpec<T> = defaultSpringSpec,
        initialVelocity: T = velocity,
        block: (Animatable<T, V>.() -> Unit)? = null  //block就是动画回调的接口,作用域是一个Animatable对象
    )
anim.animateTo(size){
    Log.i(TAG,"float value is ${this.value}")
}

animate的控制

被动结束

  • 当同一个animate执行过程中,如果出现再次调用animateTo(),Compose会终止之前的动画,重新执行
    • 动画执行的过程中,如果出现这种情形,animate所在的协程,会抛出一个CancellationException。

主动结束

  • animate提供了stop函数。
  • stop函数是suspend修饰的,需要在协程中执行
  • 同时因为animateTo()等也是suspend修饰,所以他们不能并存在一个LaunchedEffect()作用域
LaunchedEffect(Unit){
    anim.animateTo(1000.dp)
}

lifecycleScop.launch{
    anim.stop()
}

updateBounds

  • 动画更新的界限(允许开发者自定义动画更新界限),当它到达界限时,动画会结束,但是不会抛出异常,是一种正常的结束

end reason

  • 当动画触达界限的时候,会结束,animateTo()返回的结构AnimationResult,endReason会是(BoundReached):
    • BoundReached
    • Finished

多维动画

  • 当有多个动画结合的情况下,如果动画其中一个纬度达到的BoundReached,动画会立即全部停止
  • 所以定义动画Bound的时候,需要把不同纬度的动画,分别执行,避免他们因为BoundReached产生相互影响。(比如横向、纵向的滑动)

LaunchedEffect(Unit){
    anim.animateTo(2000.dp)
}
anim.updateBounds(upperBound = maxWidth - 100.dp)
Box(Modifier.padding(anim.value, 0.dp, 0.dp, 0.dp)
   .size(100.dp))

 评论