Merge pull request #1460 from fansangg/fix/read-sheet-animation

fix:修复二级菜单手势滑动高度变化滞后与Tab高亮闪烁问题
This commit is contained in:
Kudomaga
2026-06-16 00:41:36 +08:00
committed by GitHub
3 changed files with 72 additions and 42 deletions
@@ -87,6 +87,7 @@ internal fun HeaderFooterPage(
)
val pagerState = rememberPagerState(pageCount = { 3 })
var selectedTab by remember { mutableIntStateOf(0) }
var clickScrollCount by remember { mutableIntStateOf(0) }
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
@@ -183,7 +184,11 @@ internal fun HeaderFooterPage(
}
LaunchedEffect(pagerState) {
snapshotFlow { pagerState.settledPage }.collect { selectedTab = it }
snapshotFlow { pagerState.currentPage }.collect { page ->
if (clickScrollCount == 0) {
selectedTab = page
}
}
}
Column(
@@ -195,11 +200,16 @@ internal fun HeaderFooterPage(
selectedTabIndex = selectedTab,
onTabSelected = { index ->
selectedTab = index
clickScrollCount++
scope.launch {
pagerState.animateScrollToPage(
page = index,
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
try {
pagerState.animateScrollToPage(
page = index,
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
} finally {
clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
}
}
},
modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),
@@ -108,6 +108,7 @@ internal fun SystemMenuPage(
val scope = rememberCoroutineScope()
val pagerState = rememberPagerState(pageCount = { 3 })
var selectedTab by remember { mutableIntStateOf(0) }
var clickScrollCount by remember { mutableIntStateOf(0) }
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
@@ -119,7 +120,11 @@ internal fun SystemMenuPage(
var showIconSheet by remember { mutableStateOf(false) }
LaunchedEffect(pagerState) {
snapshotFlow { pagerState.settledPage }.collect { selectedTab = it }
snapshotFlow { pagerState.currentPage }.collect { page ->
if (clickScrollCount == 0) {
selectedTab = page
}
}
}
Column(
@@ -135,11 +140,16 @@ internal fun SystemMenuPage(
selectedTabIndex = selectedTab,
onTabSelected = { index ->
selectedTab = index
clickScrollCount++
scope.launch {
pagerState.animateScrollToPage(
page = index,
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
try {
pagerState.animateScrollToPage(
page = index,
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
} finally {
clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
}
}
},
modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),
@@ -79,9 +79,14 @@ fun ReadStyleTextTitleContent(
)
val pagerState = rememberPagerState(pageCount = { 3 })
var selectedTab by remember { mutableIntStateOf(0) }
var clickScrollCount by remember { mutableIntStateOf(0) }
LaunchedEffect(pagerState) {
snapshotFlow { pagerState.settledPage }.collect { selectedTab = it }
snapshotFlow { pagerState.currentPage }.collect { page ->
if (clickScrollCount == 0) {
selectedTab = page
}
}
}
ReadStyleTextTitleContent(
@@ -95,11 +100,16 @@ fun ReadStyleTextTitleContent(
onOpenTitleFontSelect = onOpenTitleFontSelect,
animateToPage = { page ->
selectedTab = page
clickScrollCount++
scope.launch {
pagerState.animateScrollToPage(
page = page,
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
try {
pagerState.animateScrollToPage(
page = page,
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
} finally {
clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
}
}
},
modifier = modifier,
@@ -144,25 +154,28 @@ internal fun ReadStyleTextTitleContent(
.clipToBounds()
.pagerHeight(animatedHeight),
) { page ->
val pageModifier = Modifier.onSizeChanged { size ->
pageHeights[page] = size.height
}
when (page) {
0 -> TextEffectsPage(
onOpenShadowSet = onOpenShadowSet,
onOpenUnderlineConfig = onOpenUnderlineConfig,
onOpenHighlightRule = onOpenHighlightRule,
onOpenFontSelect = onOpenFontSelect,
modifier = pageModifier,
onIntent = onIntent,
)
Box(
modifier = Modifier
.fillMaxWidth()
.onSizeChanged { size ->
pageHeights[page] = size.height
}
) {
when (page) {
0 -> TextEffectsPage(
onOpenShadowSet = onOpenShadowSet,
onOpenUnderlineConfig = onOpenUnderlineConfig,
onOpenHighlightRule = onOpenHighlightRule,
onOpenFontSelect = onOpenFontSelect,
onIntent = onIntent,
)
1 -> LayoutSpacingPage(modifier = pageModifier, onIntent = onIntent)
2 -> TitleSettingsPage(
onOpenTitleFontSelect = onOpenTitleFontSelect,
modifier = pageModifier,
onIntent = onIntent,
)
1 -> LayoutSpacingPage(onIntent = onIntent)
2 -> TitleSettingsPage(
onOpenTitleFontSelect = onOpenTitleFontSelect,
onIntent = onIntent,
)
}
}
}
}
@@ -181,11 +194,10 @@ internal fun LayoutSpacingPage(
var indentCount by remember { mutableIntStateOf(ReadBookConfig.paragraphIndent.length) }
Column(
modifier = Modifier
modifier = modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
.then(modifier),
.verticalScroll(rememberScrollState()),
) {
Text(
text = stringResource(R.string.read_config_body_spacing),
@@ -255,11 +267,10 @@ internal fun TextEffectsPage(
var colorPickerInitial by remember { mutableIntStateOf(0) }
Column(
modifier = Modifier
modifier = modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
.then(modifier),
.verticalScroll(rememberScrollState()),
) {
Text(
text = stringResource(R.string.text_typeface),
@@ -421,11 +432,10 @@ internal fun TitleSettingsPage(
)
Column(
modifier = Modifier
modifier = modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
.then(modifier),
.verticalScroll(rememberScrollState()),
) {
TinyDropdownSettingItem(
title = stringResource(R.string.body_title),