I have this composable here with a history, an input/output, and a button to show/hide the history (I have removed the parameters unnecessary to my concern):
@Composable
fun MainWindow(
isShowingHistory: Boolean,
showHistory: () -> Unit,
hideHistory: () -> Unit,
) {
Column(modifier = Modifier.fillMaxSize()) {
History(modifier = Modifier.weight(1f))
Surface(
color = contentColor.copy(0.04f),
modifier = Modifier.fillMaxWidth(),
) {
Column(
horizontalAlignment = Alignment.End,
verticalArrangement = Arrangement.Bottom,
) {
if (!isShowingHistory) {
Spacer(modifier = Modifier.weight(1f))
}
InputResult(isCompact = isShowingHistory)
if (!isShowingHistory) {
Spacer(modifier = Modifier.weight(1f))
}
HistoryIconButton(
onClick = if (!isShowingHistory) showHistory else hideHistory,
modifier = Modifier.padding(16.dp),
)
}
}
}
}
It looks like this:
If isShowingHistory
is false
If isShowingHistory
is true
The appearance is correct. However, I want to animate the entrance of History
. One way I thought I could make that work is by using AnimatedVisibility
on the spacers. However, since the spacers use the modifier weight
, I cannot do that since weight
only works for direct children of the column.
@Composable
fun MainWindow(
isShowingHistory: Boolean,
showHistory: () -> Unit,
hideHistory: () -> Unit,
) {
Column(modifier = Modifier.fillMaxSize()) {
History(modifier = Modifier.weight(1f))
Surface(
color = contentColor.copy(0.04f),
modifier = Modifier.fillMaxWidth(),
) {
Column(
horizontalAlignment = Alignment.End,
verticalArrangement = Arrangement.Bottom,
) {
AnimatedVisibility(visible = !isShowingHistory) {
Spacer(modifier = Modifier.weight(1f))
}
InputResult(isCompact = isShowingHistory)
AnimatedVisibility(visible = !isShowingHistory) {
Spacer(modifier = Modifier.weight(1f))
}
HistoryIconButton(
onClick = if (!isShowingHistory) showHistory else hideHistory,
modifier = Modifier.padding(16.dp),
)
}
}
}
}
If isShowingHistory
is false
while using AnimatedVisibility
I have also tried moving the weight modifier to the AnimatedVisibility
like this:
@Composable
fun MainWindow(
isShowingHistory: Boolean,
showHistory: () -> Unit,
hideHistory: () -> Unit,
) {
Column(modifier = Modifier.fillMaxSize()) {
History(modifier = Modifier.weight(1f))
Surface(
color = contentColor.copy(0.04f),
modifier = Modifier.fillMaxWidth(),
) {
Column(
horizontalAlignment = Alignment.End,
verticalArrangement = Arrangement.Bottom,
) {
AnimatedVisibility(
visible = !isShowingHistory,
modifier = Modifier.weight(1f),
) {}
InputResult(isCompact = isShowingHistory)
AnimatedVisibility(
visible = !isShowingHistory,
modifier = Modifier.weight(1f),
) {}
HistoryIconButton(
onClick = if (!isShowingHistory) showHistory else hideHistory,
modifier = Modifier.padding(16.dp),
)
}
}
}
}
However, this does not animate the visibility of the spacers, even if I explicitly set the enter
and exit
parameters to expandVertically
and shrinkVertically
, since AnimatedVisibility
animates its contents, not itself.
How do I animate the weighted spacers? Or better yet, how do I properly animate the visibility of the History
composable, following the layout shown in the first two screenshots?