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

fix:修复二级菜单手势滑动高度变化滞后与Tab高亮闪烁问题
This commit is contained in:
Kudomaga authored and GitHub committed 2026-06-16 00:41:36 +08:00
commit 4fde660a23
3 files changed
+72 -42

No files matched your search

@@ -87,6 +87,7 @@ internal fun HeaderFooterPage(
) )
val pagerState = rememberPagerState(pageCount = { 3 }) val pagerState = rememberPagerState(pageCount = { 3 })
var selectedTab by remember { mutableIntStateOf(0) } var selectedTab by remember { mutableIntStateOf(0) }
var clickScrollCount by remember { mutableIntStateOf(0) }
val pageHeights = remember { mutableStateMapOf<Int, Int>() } val pageHeights = remember { mutableStateMapOf<Int, Int>() }
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights) val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
@@ -183,7 +184,11 @@ internal fun HeaderFooterPage(
} }
LaunchedEffect(pagerState) { LaunchedEffect(pagerState) {
snapshotFlow { pagerState.settledPage }.collect { selectedTab = it } snapshotFlow { pagerState.currentPage }.collect { page ->
if (clickScrollCount == 0) {
selectedTab = page
}
}
} }
Column( Column(
@@ -195,11 +200,16 @@ internal fun HeaderFooterPage(
selectedTabIndex = selectedTab, selectedTabIndex = selectedTab,
onTabSelected = { index -> onTabSelected = { index ->
selectedTab = index selectedTab = index
clickScrollCount++
scope.launch { scope.launch {
pagerState.animateScrollToPage( try {
page = index, pagerState.animateScrollToPage(
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing) 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), modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),
@@ -108,6 +108,7 @@ internal fun SystemMenuPage(
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val pagerState = rememberPagerState(pageCount = { 3 }) val pagerState = rememberPagerState(pageCount = { 3 })
var selectedTab by remember { mutableIntStateOf(0) } var selectedTab by remember { mutableIntStateOf(0) }
var clickScrollCount by remember { mutableIntStateOf(0) }
val pageHeights = remember { mutableStateMapOf<Int, Int>() } val pageHeights = remember { mutableStateMapOf<Int, Int>() }
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights) val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
@@ -119,7 +120,11 @@ internal fun SystemMenuPage(
var showIconSheet by remember { mutableStateOf(false) } var showIconSheet by remember { mutableStateOf(false) }
LaunchedEffect(pagerState) { LaunchedEffect(pagerState) {
snapshotFlow { pagerState.settledPage }.collect { selectedTab = it } snapshotFlow { pagerState.currentPage }.collect { page ->
if (clickScrollCount == 0) {
selectedTab = page
}
}
} }
Column( Column(
@@ -135,11 +140,16 @@ internal fun SystemMenuPage(
selectedTabIndex = selectedTab, selectedTabIndex = selectedTab,
onTabSelected = { index -> onTabSelected = { index ->
selectedTab = index selectedTab = index
clickScrollCount++
scope.launch { scope.launch {
pagerState.animateScrollToPage( try {
page = index, pagerState.animateScrollToPage(
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing) 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), modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),
@@ -79,9 +79,14 @@ fun ReadStyleTextTitleContent(
) )
val pagerState = rememberPagerState(pageCount = { 3 }) val pagerState = rememberPagerState(pageCount = { 3 })
var selectedTab by remember { mutableIntStateOf(0) } var selectedTab by remember { mutableIntStateOf(0) }
var clickScrollCount by remember { mutableIntStateOf(0) }
LaunchedEffect(pagerState) { LaunchedEffect(pagerState) {
snapshotFlow { pagerState.settledPage }.collect { selectedTab = it } snapshotFlow { pagerState.currentPage }.collect { page ->
if (clickScrollCount == 0) {
selectedTab = page
}
}
} }
ReadStyleTextTitleContent( ReadStyleTextTitleContent(
@@ -95,11 +100,16 @@ fun ReadStyleTextTitleContent(
onOpenTitleFontSelect = onOpenTitleFontSelect, onOpenTitleFontSelect = onOpenTitleFontSelect,
animateToPage = { page -> animateToPage = { page ->
selectedTab = page selectedTab = page
clickScrollCount++
scope.launch { scope.launch {
pagerState.animateScrollToPage( try {
page = page, pagerState.animateScrollToPage(
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing) page = page,
) animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
} finally {
clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
}
} }
}, },
modifier = modifier, modifier = modifier,
@@ -144,25 +154,28 @@ internal fun ReadStyleTextTitleContent(
.clipToBounds() .clipToBounds()
.pagerHeight(animatedHeight), .pagerHeight(animatedHeight),
) { page -> ) { page ->
val pageModifier = Modifier.onSizeChanged { size -> Box(
pageHeights[page] = size.height modifier = Modifier
} .fillMaxWidth()
when (page) { .onSizeChanged { size ->
0 -> TextEffectsPage( pageHeights[page] = size.height
onOpenShadowSet = onOpenShadowSet, }
onOpenUnderlineConfig = onOpenUnderlineConfig, ) {
onOpenHighlightRule = onOpenHighlightRule, when (page) {
onOpenFontSelect = onOpenFontSelect, 0 -> TextEffectsPage(
modifier = pageModifier, onOpenShadowSet = onOpenShadowSet,
onIntent = onIntent, onOpenUnderlineConfig = onOpenUnderlineConfig,
) onOpenHighlightRule = onOpenHighlightRule,
onOpenFontSelect = onOpenFontSelect,
onIntent = onIntent,
)
1 -> LayoutSpacingPage(modifier = pageModifier, onIntent = onIntent) 1 -> LayoutSpacingPage(onIntent = onIntent)
2 -> TitleSettingsPage( 2 -> TitleSettingsPage(
onOpenTitleFontSelect = onOpenTitleFontSelect, onOpenTitleFontSelect = onOpenTitleFontSelect,
modifier = pageModifier, onIntent = onIntent,
onIntent = onIntent, )
) }
} }
} }
} }
@@ -181,11 +194,10 @@ internal fun LayoutSpacingPage(
var indentCount by remember { mutableIntStateOf(ReadBookConfig.paragraphIndent.length) } var indentCount by remember { mutableIntStateOf(ReadBookConfig.paragraphIndent.length) }
Column( Column(
modifier = Modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState()),
.then(modifier),
) { ) {
Text( Text(
text = stringResource(R.string.read_config_body_spacing), text = stringResource(R.string.read_config_body_spacing),
@@ -255,11 +267,10 @@ internal fun TextEffectsPage(
var colorPickerInitial by remember { mutableIntStateOf(0) } var colorPickerInitial by remember { mutableIntStateOf(0) }
Column( Column(
modifier = Modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState()),
.then(modifier),
) { ) {
Text( Text(
text = stringResource(R.string.text_typeface), text = stringResource(R.string.text_typeface),
@@ -421,11 +432,10 @@ internal fun TitleSettingsPage(
) )
Column( Column(
modifier = Modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState()),
.then(modifier),
) { ) {
TinyDropdownSettingItem( TinyDropdownSettingItem(
title = stringResource(R.string.body_title), title = stringResource(R.string.body_title),