动画流程控制
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,动画会立即全部停止
- 所以定义动画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))