refactor: extract pager height animation calculation to helper function
This commit is contained in:
@@ -80,32 +80,7 @@ internal fun HeaderFooterPage(
|
|||||||
var selectedTab by remember { mutableIntStateOf(0) }
|
var selectedTab by remember { mutableIntStateOf(0) }
|
||||||
|
|
||||||
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
|
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
|
||||||
val density = LocalDensity.current
|
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Header state
|
// Header state
|
||||||
var headerMode by remember { mutableIntStateOf(ReadBookConfig.headerMode) }
|
var headerMode by remember { mutableIntStateOf(ReadBookConfig.headerMode) }
|
||||||
|
|||||||
@@ -55,32 +55,7 @@ fun ReadStyleContent(
|
|||||||
var currentPage by remember { mutableIntStateOf(0) }
|
var currentPage by remember { mutableIntStateOf(0) }
|
||||||
|
|
||||||
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
|
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
|
||||||
val density = LocalDensity.current
|
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LaunchedEffect(pagerState) {
|
LaunchedEffect(pagerState) {
|
||||||
snapshotFlow { pagerState.currentPage }.collect { page ->
|
snapshotFlow { pagerState.currentPage }.collect { page ->
|
||||||
@@ -171,3 +146,36 @@ internal fun Modifier.pagerHeight(height: Dp) = this.layout { measurable, constr
|
|||||||
placeable.placeRelative(0, 0)
|
placeable.placeRelative(0, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
internal fun rememberPagerAnimatedHeight(
|
||||||
|
pagerState: androidx.compose.foundation.pager.PagerState,
|
||||||
|
pageHeights: Map<Int, Int>
|
||||||
|
): androidx.compose.runtime.State<Dp> {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -100,32 +100,7 @@ internal fun SystemMenuPage(
|
|||||||
var selectedTab by remember { mutableIntStateOf(0) }
|
var selectedTab by remember { mutableIntStateOf(0) }
|
||||||
|
|
||||||
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
|
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
|
||||||
val density = LocalDensity.current
|
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shared state for sheets
|
// Shared state for sheets
|
||||||
var showColorPicker by remember { mutableStateOf(false) }
|
var showColorPicker by remember { mutableStateOf(false) }
|
||||||
|
|||||||
Reference in New Issue
Block a user