您可以使用Animatable动画来设置您在里面绘制的任何内容的位置Canvas,并像这样绘制旧/新图像:
var currentBackground by remember { mutableStateOf<ImageBitmap?>(null) }
var newBackground by remember { mutableStateOf<ImageBitmap?>(null) }
val offset = remember { Animatable(0f) }
LaunchedEffect(background) {
if (currentBackground == null) {
currentBackground = background
return@LaunchedEffect
}
newBackground = background
offset.animateTo(1f)
currentBackground = background
newBackground = null
offset.snapTo(0f)
}
Canvas(modifier = Modifier.fillMaxSize()) {
fun drawImage(image: ImageBitmap, offset: Float) {
drawImage(
image,
srcSize = IntSize(image.width, image.height),
dstSize = IntSize(size.width.roundToInt(), size.height.roundToInt()),
dstOffset = IntOffset(0, (size.height * offset).roundToInt()),
)
}
clipRect {
currentBackground?.let {
drawImage(it, offset.value)
}
newBackground?.let {
drawImage(it, offset.value - 1)
}
}
}
结果:
