From 082e05584aee82317f48ff1e639499fd6458feaf Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Thu, 30 Nov 2023 01:32:18 +0800 Subject: [PATCH] Fix FAB animation --- .../com/hippo/ehviewer/ui/main/FabLayout.kt | 24 +++++++++++++++---- .../ehviewer/ui/screen/DownloadsScreen.kt | 1 + .../ehviewer/ui/screen/FavoritesScreen.kt | 1 + .../ehviewer/ui/screen/GalleryListScreen.kt | 1 + .../ehviewer/ui/screen/SearchBarScreen.kt | 4 ++-- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt index e4048e58a..41dbeb095 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt @@ -15,8 +15,10 @@ import androidx.compose.material3.Icon import androidx.compose.material3.SmallFloatingActionButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer @@ -39,8 +41,12 @@ fun FabLayout( expanded: Boolean, onExpandChanged: (Boolean) -> Unit, autoCancel: Boolean, + showAddButton: Boolean = true, + delayOnShow: Boolean = false, fabBuilder: FabBuilder.() -> Unit, ) { + var delayOnExpand by remember { mutableStateOf(hidden) } + var delayOnHide by remember { mutableStateOf(expanded) } val secondaryFab = remember(fabBuilder) { buildList { fabBuilder { icon, action -> @@ -62,9 +68,9 @@ fun FabLayout( val coroutineScope = rememberCoroutineScope() val appearState by animateFloatAsState( targetValue = if (hidden) 0f else 1f, - animationSpec = tween(FAB_ANIMATE_TIME, if (hidden) 0 else FAB_ANIMATE_TIME), + animationSpec = tween(FAB_ANIMATE_TIME, if (delayOnHide || !hidden && delayOnShow) FAB_ANIMATE_TIME else 0), label = "hiddenState", - ) + ) { delayOnExpand = hidden } Box( modifier = Modifier.fillMaxSize().navigationBarsPadding().padding(16.dp), contentAlignment = Alignment.BottomEnd, @@ -77,7 +83,11 @@ fun FabLayout( }, contentAlignment = Alignment.Center, ) { - val animatedProgress by animateFloatMergePredictiveBackAsState(expanded, tween(FAB_ANIMATE_TIME)) { + val animatedProgress by animateFloatMergePredictiveBackAsState( + expanded, + tween(FAB_ANIMATE_TIME, if (delayOnExpand) FAB_ANIMATE_TIME else 0), + finishedListener = { delayOnHide = expanded }, + ) { onExpandChanged(false) } FloatingActionButton( @@ -86,8 +96,12 @@ fun FabLayout( Icon( imageVector = Icons.Default.Close, contentDescription = null, - modifier = Modifier.graphicsLayer { - rotationZ = lerp(0f, -135f, animatedProgress) + modifier = if (showAddButton) { + Modifier.graphicsLayer { + rotationZ = lerp(0f, -135f, animatedProgress) + } + } else { + Modifier }, ) } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt index c8ec0d503..a356efa78 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt @@ -497,6 +497,7 @@ fun DownloadsScreen(navigator: DestinationsNavigator) { selectMode = false }, autoCancel = false, + showAddButton = false, ) { onClick(Icons.Default.DoneAll) { val info = list.associateBy { it.gid } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt index 2cab31548..ed4727112 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt @@ -321,6 +321,7 @@ fun FavouritesScreen(navigator: DestinationsNavigator) { selectMode = false }, autoCancel = !selectMode, + delayOnShow = true, ) { if (!select) { onClick(EhIcons.Default.GoTo) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt index 9bbe78ed1..be7931b43 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt @@ -813,6 +813,7 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { expanded = expanded, onExpandChanged = { expanded = it }, autoCancel = true, + delayOnShow = true, ) { onClick(Icons.Default.Refresh) { urlBuilder.setIndex(null) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt index 1a78cc90c..c74ca1d13 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt @@ -250,8 +250,8 @@ fun SearchBarScreen( }, floatingActionButton = { val hiddenState by animateFloatAsState( - targetValue = if (showSearchFab) 1f else 0f, - animationSpec = tween(FAB_ANIMATE_TIME, if (showSearchFab) FAB_ANIMATE_TIME else 0), + targetValue = if (showSearchFab && !active) 1f else 0f, + animationSpec = tween(FAB_ANIMATE_TIME, if (showSearchFab && !active) FAB_ANIMATE_TIME else 0), label = "hiddenState", ) FloatingActionButton(