Daniel Oliveira
12/06/2021, 11:01 PMZach Klippenstein (he/him) [MOD]
12/06/2021, 11:23 PMDaniel Oliveira
12/07/2021, 12:47 AMZach Klippenstein (he/him) [MOD]
12/07/2021, 4:07 AMDaniel Oliveira
12/07/2021, 11:56 AMStylianos Gakis
12/07/2021, 12:01 PMDaniel Oliveira
12/07/2021, 1:36 PM@OptIn(ExperimentalMaterialApi::class)
class HomeAnimationState constructor(
val horizontalSwipeState: SwipeableState<MenuState>,
val verticalSwipeState: SwipeableState<CardState>,
coroutineScope: CoroutineScope
) {
private var previousCardState = verticalSwipeState.currentValue
val collapsedCardProgress by derivedStateOf {
when (verticalSwipeState.progress.from) {
CardState.Collapsed -> if (verticalSwipeState.progress.fraction == 1f) 1f
else 1 - verticalSwipeState.progress.fraction
CardState.Expanded -> if (verticalSwipeState.progress.fraction == 1f) 0f
else verticalSwipeState.progress.fraction
}
}
init {
coroutineScope.launch {
snapshotFlow { horizontalSwipeState.isAnimationRunning }
.distinctUntilChanged()
.filter { it }
.collect {
transition()
}
}
}
private suspend fun transition() {
val targetHorizontalState = horizontalSwipeState.targetValue
val currentVerticalState = verticalSwipeState.currentValue
when {
targetHorizontalState == MenuState.Opened &&
currentVerticalState == CardState.Expanded -> {
previousCardState = CardState.Expanded
verticalSwipeState.animateTo(CardState.Collapsed)
}
targetHorizontalState == MenuState.Closed &&
previousCardState == CardState.Expanded -> {
verticalSwipeState.animateTo(CardState.Expanded)
}
targetHorizontalState == MenuState.Opened &&
currentVerticalState == CardState.Collapsed -> {
previousCardState = CardState.Collapsed
}
}
}
}