fix:修复二级菜单手势滑动高度变化滞后与Tab高亮闪烁问题

This commit is contained in:
fansan
2026-06-15 18:49:31 +08:00
parent 6dc79761f6
commit ea9ff5a578
3 changed files with 72 additions and 42 deletions
@@ -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),