fix:潜在的布局高度测量缺陷与优化建议

This commit is contained in:
fansangg
2026-06-14 17:54:03 +08:00
parent a37297a001
commit a99dd4b765
2 changed files with 30 additions and 23 deletions
@@ -140,7 +140,11 @@ fun ReadStyleContent(
internal fun Modifier.pagerHeight(height: Dp) = this.layout { measurable, constraints -> internal fun Modifier.pagerHeight(height: Dp) = this.layout { measurable, constraints ->
val placeable = measurable.measure(constraints) val placeable = measurable.measure(constraints)
val layoutHeight = if (height != Dp.Unspecified) height.roundToPx() else placeable.height val layoutHeight = if (height != Dp.Unspecified) {
height.roundToPx().coerceIn(constraints.minHeight, constraints.maxHeight)
} else {
placeable.height
}
layout(placeable.width, layoutHeight) { layout(placeable.width, layoutHeight) {
placeable.placeRelative(0, 0) placeable.placeRelative(0, 0)
} }
@@ -80,7 +80,7 @@ fun ReadStyleTextTitleContent(
var selectedTab by remember { mutableIntStateOf(0) } var selectedTab by remember { mutableIntStateOf(0) }
LaunchedEffect(pagerState) { LaunchedEffect(pagerState) {
snapshotFlow { pagerState.currentPage }.collect { selectedTab = it } snapshotFlow { pagerState.settledPage }.collect { selectedTab = it }
} }
ReadStyleTextTitleContent( ReadStyleTextTitleContent(
@@ -92,6 +92,7 @@ fun ReadStyleTextTitleContent(
onOpenHighlightRule = onOpenHighlightRule, onOpenHighlightRule = onOpenHighlightRule,
onOpenFontSelect = onOpenFontSelect, onOpenFontSelect = onOpenFontSelect,
animateToPage = { page -> animateToPage = { page ->
selectedTab = page
scope.launch { scope.launch {
pagerState.animateScrollToPage( pagerState.animateScrollToPage(
page = page, page = page,
@@ -140,25 +141,21 @@ internal fun ReadStyleTextTitleContent(
.clipToBounds() .clipToBounds()
.pagerHeight(animatedHeight), .pagerHeight(animatedHeight),
) { page -> ) { page ->
Box( val pageModifier = Modifier.onSizeChanged { size ->
modifier = Modifier pageHeights[page] = size.height
.fillMaxWidth() }
.onSizeChanged { size -> when (page) {
pageHeights[page] = size.height 0 -> TextEffectsPage(
} onOpenShadowSet = onOpenShadowSet,
) { onOpenUnderlineConfig = onOpenUnderlineConfig,
when (page) { onOpenHighlightRule = onOpenHighlightRule,
0 -> TextEffectsPage( onOpenFontSelect = onOpenFontSelect,
onOpenShadowSet = onOpenShadowSet, modifier = pageModifier,
onOpenUnderlineConfig = onOpenUnderlineConfig, onIntent = onIntent,
onOpenHighlightRule = onOpenHighlightRule, )
onOpenFontSelect = onOpenFontSelect,
onIntent = onIntent,
)
1 -> LayoutSpacingPage(onIntent = onIntent) 1 -> LayoutSpacingPage(modifier = pageModifier, onIntent = onIntent)
2 -> TitleSettingsPage(onIntent = onIntent) 2 -> TitleSettingsPage(modifier = pageModifier, onIntent = onIntent)
}
} }
} }
} }
@@ -168,6 +165,7 @@ internal fun ReadStyleTextTitleContent(
@Composable @Composable
internal fun LayoutSpacingPage( internal fun LayoutSpacingPage(
modifier: Modifier = Modifier,
onIntent: (ReadBookIntent) -> Unit, onIntent: (ReadBookIntent) -> Unit,
) { ) {
var letterSpacing by remember { mutableFloatStateOf(ReadBookConfig.letterSpacing) } var letterSpacing by remember { mutableFloatStateOf(ReadBookConfig.letterSpacing) }
@@ -179,7 +177,8 @@ internal fun LayoutSpacingPage(
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),
@@ -238,6 +237,7 @@ internal fun TextEffectsPage(
onOpenUnderlineConfig: () -> Unit, onOpenUnderlineConfig: () -> Unit,
onOpenHighlightRule: () -> Unit, onOpenHighlightRule: () -> Unit,
onOpenFontSelect: () -> Unit, onOpenFontSelect: () -> Unit,
modifier: Modifier = Modifier,
onIntent: (ReadBookIntent) -> Unit, onIntent: (ReadBookIntent) -> Unit,
) { ) {
var textItalic by remember { mutableStateOf(ReadBookConfig.textItalic) } var textItalic by remember { mutableStateOf(ReadBookConfig.textItalic) }
@@ -251,7 +251,8 @@ internal fun TextEffectsPage(
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),
@@ -386,6 +387,7 @@ internal fun TextEffectsPage(
@Composable @Composable
internal fun TitleSettingsPage( internal fun TitleSettingsPage(
modifier: Modifier = Modifier,
onIntent: (ReadBookIntent) -> Unit, onIntent: (ReadBookIntent) -> Unit,
) { ) {
var titleMode by remember(ReadBookConfig.titleMode) { mutableIntStateOf(ReadBookConfig.titleMode) } var titleMode by remember(ReadBookConfig.titleMode) { mutableIntStateOf(ReadBookConfig.titleMode) }
@@ -411,7 +413,8 @@ internal fun TitleSettingsPage(
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),