From 5fb93f65eb4c172fbcb7240cd679d6df5fd7ffff Mon Sep 17 00:00:00 2001 From: fansan Date: Sat, 13 Jun 2026 17:04:19 +0800 Subject: [PATCH] refactor: extract pager height animation calculation to helper function --- .../ui/book/read/sheet/HeaderFooterPage.kt | 27 +-------- .../app/ui/book/read/sheet/ReadStyleSheet.kt | 60 +++++++++++-------- .../app/ui/book/read/sheet/SystemMenuPage.kt | 27 +-------- 3 files changed, 36 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt index 6ed38b145..086fefb4c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt @@ -80,32 +80,7 @@ internal fun HeaderFooterPage( var selectedTab by remember { mutableIntStateOf(0) } val pageHeights = remember { mutableStateMapOf() } - val density = LocalDensity.current - val animatedHeight by remember(pagerState, density) { - derivedStateOf { - val pageCount = pagerState.pageCount - val position = (pagerState.currentPage + pagerState.currentPageOffsetFraction) - .coerceIn(0f, (pageCount - 1).coerceAtLeast(0).toFloat()) - val floorPage = position.toInt().coerceIn(0, pageCount - 1) - val ceilPage = (floorPage + 1).coerceIn(0, pageCount - 1) - - val floorHeight = pageHeights[floorPage] ?: 0 - val ceilHeight = pageHeights[ceilPage] ?: floorHeight - - val fraction = position - floorPage - - val startHeight = if (floorHeight > 0) floorHeight else (pageHeights.values.firstOrNull() ?: 0) - val endHeight = if (ceilHeight > 0) ceilHeight else startHeight - - val interpolated = startHeight + (endHeight - startHeight) * fraction - - if (interpolated > 0) { - with(density) { interpolated.toDp() } - } else { - Dp.Unspecified - } - } - } + val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights) // Header state var headerMode by remember { mutableIntStateOf(ReadBookConfig.headerMode) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt index b0e893e63..c606d3ebd 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt @@ -55,32 +55,7 @@ fun ReadStyleContent( var currentPage by remember { mutableIntStateOf(0) } val pageHeights = remember { mutableStateMapOf() } - val density = LocalDensity.current - val animatedHeight by remember(pagerState, density) { - derivedStateOf { - val pageCount = pagerState.pageCount - val position = (pagerState.currentPage + pagerState.currentPageOffsetFraction) - .coerceIn(0f, (pageCount - 1).coerceAtLeast(0).toFloat()) - val floorPage = position.toInt().coerceIn(0, pageCount - 1) - val ceilPage = (floorPage + 1).coerceIn(0, pageCount - 1) - - val floorHeight = pageHeights[floorPage] ?: 0 - val ceilHeight = pageHeights[ceilPage] ?: floorHeight - - val fraction = position - floorPage - - val startHeight = if (floorHeight > 0) floorHeight else (pageHeights.values.firstOrNull() ?: 0) - val endHeight = if (ceilHeight > 0) ceilHeight else startHeight - - val interpolated = startHeight + (endHeight - startHeight) * fraction - - if (interpolated > 0) { - with(density) { interpolated.toDp() } - } else { - Dp.Unspecified - } - } - } + val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights) LaunchedEffect(pagerState) { snapshotFlow { pagerState.currentPage }.collect { page -> @@ -171,3 +146,36 @@ internal fun Modifier.pagerHeight(height: Dp) = this.layout { measurable, constr placeable.placeRelative(0, 0) } } + +@Composable +internal fun rememberPagerAnimatedHeight( + pagerState: androidx.compose.foundation.pager.PagerState, + pageHeights: Map +): androidx.compose.runtime.State { + val density = LocalDensity.current + return remember(pagerState, density) { + derivedStateOf { + val pageCount = pagerState.pageCount + val position = (pagerState.currentPage + pagerState.currentPageOffsetFraction) + .coerceIn(0f, (pageCount - 1).coerceAtLeast(0).toFloat()) + val floorPage = position.toInt().coerceIn(0, pageCount - 1) + val ceilPage = (floorPage + 1).coerceIn(0, pageCount - 1) + + val floorHeight = pageHeights[floorPage] ?: 0 + val ceilHeight = pageHeights[ceilPage] ?: floorHeight + + val fraction = position - floorPage + + val startHeight = if (floorHeight > 0) floorHeight else (pageHeights.values.firstOrNull() ?: 0) + val endHeight = if (ceilHeight > 0) ceilHeight else startHeight + + val interpolated = startHeight + (endHeight - startHeight) * fraction + + if (interpolated > 0) { + with(density) { interpolated.toDp() } + } else { + Dp.Unspecified + } + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt index 502f243b3..572759a08 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt @@ -100,32 +100,7 @@ internal fun SystemMenuPage( var selectedTab by remember { mutableIntStateOf(0) } val pageHeights = remember { mutableStateMapOf() } - val density = LocalDensity.current - val animatedHeight by remember(pagerState, density) { - derivedStateOf { - val pageCount = pagerState.pageCount - val position = (pagerState.currentPage + pagerState.currentPageOffsetFraction) - .coerceIn(0f, (pageCount - 1).coerceAtLeast(0).toFloat()) - val floorPage = position.toInt().coerceIn(0, pageCount - 1) - val ceilPage = (floorPage + 1).coerceIn(0, pageCount - 1) - - val floorHeight = pageHeights[floorPage] ?: 0 - val ceilHeight = pageHeights[ceilPage] ?: floorHeight - - val fraction = position - floorPage - - val startHeight = if (floorHeight > 0) floorHeight else (pageHeights.values.firstOrNull() ?: 0) - val endHeight = if (ceilHeight > 0) ceilHeight else startHeight - - val interpolated = startHeight + (endHeight - startHeight) * fraction - - if (interpolated > 0) { - with(density) { interpolated.toDp() } - } else { - Dp.Unspecified - } - } - } + val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights) // Shared state for sheets var showColorPicker by remember { mutableStateOf(false) }