要使动画在 Compose 中工作,您需要为某个特定修改器的值设置动画。您无法在不同的修改器之间设置动画。
按照此文档段落,您可以为Modifier.size
.
首先,我等待确定图像的大小,使用这个值size
可以设置修改器(我之前使用then
的是空Modifier
的),然后可以为这个值设置动画。
这是一个示例:
Column {
val animatableSize = remember { Animatable(Size.Zero, Size.VectorConverter) }
val (containerSize, setContainerSize) = remember { mutableStateOf<Size?>(null) }
val (imageSize, setImageSize) = remember { mutableStateOf<Size?>(null) }
val density = LocalDensity.current
val scope = rememberCoroutineScope()
Button(onClick = {
scope.launch {
if (imageSize == null || containerSize == null) return@launch
val targetSize = if (animatableSize.value == imageSize) containerSize else imageSize
animatableSize.animateTo(
targetSize,
animationSpec = tween(durationMillis = 1000)
)
}
}) {
Text("Animate")
}
Box(
Modifier
.padding(20.dp)
.size(300.dp)
.background(Color.LightGray)
.onSizeChanged { size ->
setContainerSize(size.toSize())
}
) {
Image(
Icons.Default.Person,
contentDescription = null,
modifier = Modifier
.then(
if (animatableSize.value != Size.Zero) {
animatableSize.value.run {
Modifier.size(
width = with(density) { width.toDp() },
height = with(density) { height.toDp() },
)
}
} else {
Modifier
}
)
.onSizeChanged { intSize ->
if (imageSize != null) return@onSizeChanged
val size = intSize.toSize()
setImageSize(size)
scope.launch {
animatableSize.snapTo(size)
}
}
)
}
}
结果:
