Transition
面向状态
- Transition支持我们面向定义好的状态,在状态切换的过程中,去针对View做多个属性相关的动画操作。
var scaleUp by remember {
mutableStateOf(false)
}
val scaleTransition = updateTransition(targetState = scaleUp, label = "")//声明一个状态流转的Transition
val scaleSize by scaleTransition.animateFloat(label = "scale", transitionSpec = {
if (false isTransitioningTo true) {//当状态从false转换到true时,使用tween动画曲线
tween(1000, easing = FastOutSlowInEasing)
} else {//当状态从true转换到false时,使用spring动画曲线
spring(Spring.DampingRatioHighBouncy, Spring.StiffnessMediumLow)
}
}) {
if (it) {
1.1f
} else {
1.0f
}
}
val corner by scaleTransition.animateDp(label = "corner", transitionSpec = {
tween(1000, easing = FastOutSlowInEasing)
}) {
if (it) {
30.dp
} else {
10.dp
}
}
Column(
modifier = Modifier
.width(330.dp)
.height(460.dp)
.scale(scaleSize)//transition一次性控制scale
.background(Color.Red)
.clip(RoundedCornerShape(cornor))//transition一次性控制圆角
.clickable {
scaleUp = !scaleUp
}
.onGloballyPositioned { pos },
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top
) {
Box(modifier = Modifier.size(330.dp).background(Color.Red))
{}
}
对比差异
- 上面的动画效果,animateXXXState也能够轻松实现。
- 区别是什么呢:
- 效率
- animateXXXState在动画的时候,会产生每一个animate,一个协程
- 如上动画,scale和Corner两个动画,会产生两个协程
- 但是使用Transition,只会有一个协程产生,这是对效率是有影响的。
- 流程控制更方便,可以针对各个状态切换做更定制更方便管理的动画。
rememberInfiniteTransition
- 用法和updateTransition一致,但它提供里无限循环动画的实现。