diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt index c9fb983c7..24d0eb1d7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt @@ -668,6 +668,7 @@ private fun ReadBookMenuSurface( title = stringResource(R.string.read_config_text_effects), maxHeight = maxHeight, bottomPadding = if (extendSurfaceToNavigationBar) navBarHeight else 0.dp, + animateSize = false, onBack = { onIntent(ReadBookIntent.ReadMenuBack) }, ) { ReadStyleTextTitleContent( @@ -686,7 +687,6 @@ private fun ReadBookMenuSurface( onOpenTitleFontSelect = { onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.TitleFontSelect)) }, - modifier = Modifier.padding(horizontal = 16.dp), onIntent = onIntent, ) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt index 6d874e8e0..1cb92d9fc 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt @@ -140,7 +140,11 @@ fun ReadStyleContent( internal fun Modifier.pagerHeight(height: Dp) = this.layout { measurable, 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) { placeable.placeRelative(0, 0) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt index bb3291c25..0e9117661 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt @@ -1,5 +1,8 @@ package io.legado.app.ui.book.read.sheet +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -25,12 +28,16 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clipToBounds +import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -80,14 +87,21 @@ fun ReadStyleTextTitleContent( ReadStyleTextTitleContent( tabTitles = tabTitles, selectedTab = selectedTab, - onSelectedTabChange = { selectedTab = it }, pagerState = pagerState, onOpenShadowSet = onOpenShadowSet, onOpenUnderlineConfig = onOpenUnderlineConfig, onOpenHighlightRule = onOpenHighlightRule, onOpenFontSelect = onOpenFontSelect, onOpenTitleFontSelect = onOpenTitleFontSelect, - animateToPage = { page -> scope.launch { pagerState.animateScrollToPage(page) } }, + animateToPage = { page -> + selectedTab = page + scope.launch { + pagerState.animateScrollToPage( + page = page, + animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing) + ) + } + }, modifier = modifier, onIntent = onIntent, ) @@ -97,7 +111,6 @@ fun ReadStyleTextTitleContent( internal fun ReadStyleTextTitleContent( tabTitles: List, selectedTab: Int, - onSelectedTabChange: (Int) -> Unit, pagerState: PagerState, onOpenShadowSet: () -> Unit, onOpenUnderlineConfig: () -> Unit, @@ -108,6 +121,9 @@ internal fun ReadStyleTextTitleContent( modifier: Modifier = Modifier, onIntent: (ReadBookIntent) -> Unit, ) { + val pageHeights = remember { mutableStateMapOf() } + val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights) + Column( modifier = modifier .fillMaxWidth() @@ -116,27 +132,35 @@ internal fun ReadStyleTextTitleContent( tabTitles = tabTitles, selectedTabIndex = selectedTab, onTabSelected = { index -> - onSelectedTabChange(index) animateToPage(index) }, - modifier = Modifier.padding(bottom = 8.dp), + modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp), ) HorizontalPager( state = pagerState, - modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.Top, + modifier = Modifier + .fillMaxWidth() + .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, ) - 1 -> LayoutSpacingPage(onIntent = onIntent) + 1 -> LayoutSpacingPage(modifier = pageModifier, onIntent = onIntent) 2 -> TitleSettingsPage( onOpenTitleFontSelect = onOpenTitleFontSelect, + modifier = pageModifier, onIntent = onIntent, ) } @@ -148,6 +172,7 @@ internal fun ReadStyleTextTitleContent( @Composable internal fun LayoutSpacingPage( + modifier: Modifier = Modifier, onIntent: (ReadBookIntent) -> Unit, ) { var letterSpacing by remember { mutableFloatStateOf(ReadBookConfig.letterSpacing) } @@ -158,7 +183,9 @@ internal fun LayoutSpacingPage( Column( modifier = Modifier .fillMaxWidth() - .verticalScroll(rememberScrollState()), + .padding(horizontal = 16.dp) + .verticalScroll(rememberScrollState()) + .then(modifier), ) { Text( text = stringResource(R.string.read_config_body_spacing), @@ -217,6 +244,7 @@ internal fun TextEffectsPage( onOpenUnderlineConfig: () -> Unit, onOpenHighlightRule: () -> Unit, onOpenFontSelect: () -> Unit, + modifier: Modifier = Modifier, onIntent: (ReadBookIntent) -> Unit, ) { var textItalic by remember { mutableStateOf(ReadBookConfig.textItalic) } @@ -229,7 +257,9 @@ internal fun TextEffectsPage( Column( modifier = Modifier .fillMaxWidth() - .verticalScroll(rememberScrollState()), + .padding(horizontal = 16.dp) + .verticalScroll(rememberScrollState()) + .then(modifier), ) { Text( text = stringResource(R.string.text_typeface), @@ -365,6 +395,7 @@ internal fun TextEffectsPage( @Composable internal fun TitleSettingsPage( onOpenTitleFontSelect: () -> Unit, + modifier: Modifier = Modifier, onIntent: (ReadBookIntent) -> Unit, ) { var titleMode by remember(ReadBookConfig.titleMode) { mutableIntStateOf(ReadBookConfig.titleMode) } @@ -392,7 +423,9 @@ internal fun TitleSettingsPage( Column( modifier = Modifier .fillMaxWidth() - .verticalScroll(rememberScrollState()), + .padding(horizontal = 16.dp) + .verticalScroll(rememberScrollState()) + .then(modifier), ) { TinyDropdownSettingItem( title = stringResource(R.string.body_title),