Jetpack Compose - 在状态变化时播放复杂的动画
Jetpack Compose - Play complex animation on state change
如何在切换到特定状态时使用协程播放复杂的动画?
@Composable
fun SomeView(viewModel: SomeViewModel) {
val state by viewModel.stateFlow.collectAsState()
val scope = rememberCoroutineScope()
...
val shutterAlpha by remember { mutableStateOf(0f) }
Box(modifier = Modifier
.fillMaxSize()
.alpha(shutterAlpha)
.background(Color.Black)
)
val transition = updateTransition(targetState = state, label = "label")
<on transitioning to CaptureState> { // need actual condition check code here
scope.launch {
animate(0f, 1f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
animate(1f, 0f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
}
}
}
LaunchedEffect
是答案:
@Composable
fun SomeView(viewModel: SomeViewModel) {
val state by viewModel.stateFlow.collectAsState()
...
val shutterAlpha by remember { mutableStateOf(0f) }
Box(modifier = Modifier
.fillMaxSize()
.alpha(shutterAlpha)
.background(Color.Black)
)
LaunchedEffect(state) {
if (state == CaptureState) {
animate(0f, 1f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
animate(1f, 0f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
}
}
}
如何在切换到特定状态时使用协程播放复杂的动画?
@Composable
fun SomeView(viewModel: SomeViewModel) {
val state by viewModel.stateFlow.collectAsState()
val scope = rememberCoroutineScope()
...
val shutterAlpha by remember { mutableStateOf(0f) }
Box(modifier = Modifier
.fillMaxSize()
.alpha(shutterAlpha)
.background(Color.Black)
)
val transition = updateTransition(targetState = state, label = "label")
<on transitioning to CaptureState> { // need actual condition check code here
scope.launch {
animate(0f, 1f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
animate(1f, 0f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
}
}
}
LaunchedEffect
是答案:
@Composable
fun SomeView(viewModel: SomeViewModel) {
val state by viewModel.stateFlow.collectAsState()
...
val shutterAlpha by remember { mutableStateOf(0f) }
Box(modifier = Modifier
.fillMaxSize()
.alpha(shutterAlpha)
.background(Color.Black)
)
LaunchedEffect(state) {
if (state == CaptureState) {
animate(0f, 1f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
animate(1f, 0f, animationSpec = tween(150)) { value, _ -> shutterAlpha = value }
}
}
}