diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index c0f9bcf2f..bccea64ad 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -186,6 +186,8 @@ object PreferKey { const val materialVersion = "materialVersion" const val composeEngine = "composeEngine" const val containerOpacity = "containerOpacity" + const val topBarOpacity = "topBarOpacity" + const val bottomBarOpacity = "bottomBarOpacity" const val enableBlur = "enableBlur" const val enableProgressiveBlur = "enableProgressiveBlur" const val useFlexibleTopAppBar = "useFlexibleTopAppBar" diff --git a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt index ba3a11553..9337cd8d8 100644 --- a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt +++ b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt @@ -9,6 +9,10 @@ object ThemeConfig { var containerOpacity by prefDelegate(PreferKey.containerOpacity, 100) + var topBarOpacity by prefDelegate(PreferKey.topBarOpacity, 100) + + var bottomBarOpacity by prefDelegate(PreferKey.bottomBarOpacity, 100) + var enableBlur by prefDelegate(PreferKey.enableBlur, false) var enableProgressiveBlur by prefDelegate(PreferKey.enableProgressiveBlur, true) diff --git a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt index 584cf9ce8..097287985 100644 --- a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.os.Handler import android.os.Looper +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Canvas @@ -365,6 +366,51 @@ fun ThemeConfigScreen( checked = ThemeConfig.useFlexibleTopAppBar, onCheckedChange = { ThemeConfig.useFlexibleTopAppBar = it } ) + SwitchSettingItem( + title = stringResource(R.string.is_blur_enable), + checked = ThemeConfig.enableBlur, + onCheckedChange = { + ThemeConfig.enableBlur = it + if (!it) ThemeConfig.enableProgressiveBlur = false + } + ) + AnimatedVisibility(visible = ThemeConfig.enableBlur) { + SwitchSettingItem( + title = stringResource(R.string.is_blur_progressive_enable), + checked = ThemeConfig.enableProgressiveBlur, + onCheckedChange = { ThemeConfig.enableProgressiveBlur = it } + ) + } + AnimatedVisibility(visible = !ThemeConfig.enableBlur) { + Column( + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + SliderSettingItem( + title = stringResource(R.string.top_bar_opacity), + description = stringResource( + R.string.top_bar_opacity_summary, + ThemeConfig.topBarOpacity + ), + value = ThemeConfig.topBarOpacity.toFloat(), + defaultValue = 100f, + valueRange = 0f..100f, + steps = 99, + onValueChange = { ThemeConfig.topBarOpacity = it.toInt() } + ) + SliderSettingItem( + title = stringResource(R.string.bottom_bar_opacity), + description = stringResource( + R.string.bottom_bar_opacity_summary, + ThemeConfig.bottomBarOpacity + ), + value = ThemeConfig.bottomBarOpacity.toFloat(), + defaultValue = 100f, + valueRange = 0f..100f, + steps = 99, + onValueChange = { ThemeConfig.bottomBarOpacity = it.toInt() } + ) + } + } SliderSettingItem( title = stringResource(R.string.container_opacity), description = stringResource( @@ -377,18 +423,6 @@ fun ThemeConfigScreen( steps = 99, onValueChange = { ThemeConfig.containerOpacity = it.toInt() } ) - SwitchSettingItem( - title = stringResource(R.string.is_blur_enable), - checked = ThemeConfig.enableBlur, - onCheckedChange = { ThemeConfig.enableBlur = it } - ) - if (ThemeConfig.enableBlur) { - SwitchSettingItem( - title = stringResource(R.string.is_blur_progressive_enable), - checked = ThemeConfig.enableProgressiveBlur, - onCheckedChange = { ThemeConfig.enableProgressiveBlur = it } - ) - } } SplicedColumnGroup(title = stringResource(R.string.day)) { diff --git a/app/src/main/java/io/legado/app/ui/main/MainScreen.kt b/app/src/main/java/io/legado/app/ui/main/MainScreen.kt index d92054be6..4f9398bcb 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainScreen.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainScreen.kt @@ -56,6 +56,7 @@ import io.legado.app.R import io.legado.app.ui.book.info.BookInfoActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.config.mainConfig.MainConfig +import io.legado.app.ui.config.themeConfig.ThemeConfig import io.legado.app.ui.main.bookshelf.BookshelfScreen import io.legado.app.ui.main.bookshelf.BookshelfViewModel import io.legado.app.ui.main.explore.ExploreScreen @@ -243,7 +244,10 @@ fun MainScreen( containerColor = GlassDefaults.glassColor( noBlurColor = BottomAppBarDefaults.containerColor, blurAlpha = GlassDefaults.DefaultBlurAlpha - ) + ).let { baseColor -> + val opacity = (ThemeConfig.bottomBarOpacity.coerceIn(0, 100)) / 100f + baseColor.copy(alpha = (baseColor.alpha * opacity).coerceIn(0f, 1f)) + } ) { val alwaysShowLabel = when (labelVisibilityMode) { "labeled" -> true diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigSheet.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigSheet.kt index 4fb175eb3..b9195137f 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigSheet.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigSheet.kt @@ -1,6 +1,7 @@ package io.legado.app.ui.main.bookshelf import android.content.res.Configuration +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateContentSize import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -95,7 +96,9 @@ fun BookshelfConfigSheet( // Layout Mode val layoutMode = - if (isLandscape) BookshelfConfig.bookshelfLayoutModeLandscape else BookshelfConfig.bookshelfLayoutModePortrait + if (isLandscape) BookshelfConfig.bookshelfLayoutModeLandscape + else BookshelfConfig.bookshelfLayoutModePortrait + CompactDropdownSettingItem( title = "布局模式", description = stringResource(if (isLandscape) R.string.screen_landscape else R.string.screen_portrait), @@ -109,59 +112,61 @@ fun BookshelfConfigSheet( } ) - if (layoutMode == 1) { - CompactDropdownSettingItem( - title = "网格样式", - selectedValue = BookshelfConfig.bookshelfGridLayout.toString(), - displayEntries = stringArrayResource(R.array.bookshelf_grid_layout), - entryValues = Array(stringArrayResource(R.array.bookshelf_grid_layout).size) { it.toString() }, - imageVector = Icons.Default.ViewCompact, - onValueChange = { BookshelfConfig.bookshelfGridLayout = it.toInt() } - ) - CompactSwitchSettingItem( - title = "标题小字体", - checked = BookshelfConfig.bookshelfTitleSmallFont, - imageVector = Icons.Default.TextFormat, - color = MaterialTheme.colorScheme.surface, - onCheckedChange = { BookshelfConfig.bookshelfTitleSmallFont = it } - ) + AnimatedVisibility( + visible = layoutMode == 1 + ) { + Column( + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + CompactDropdownSettingItem( + title = "网格样式", + selectedValue = BookshelfConfig.bookshelfGridLayout.toString(), + displayEntries = stringArrayResource(R.array.bookshelf_grid_layout), + entryValues = Array(stringArrayResource(R.array.bookshelf_grid_layout).size) { it.toString() }, + imageVector = Icons.Default.ViewCompact, + onValueChange = { BookshelfConfig.bookshelfGridLayout = it.toInt() } + ) - CompactSwitchSettingItem( - title = "标题居中", - checked = BookshelfConfig.bookshelfTitleCenter, - color = MaterialTheme.colorScheme.surface, - onCheckedChange = { BookshelfConfig.bookshelfTitleCenter = it } - ) - } else { - CompactSwitchSettingItem( - title = "紧凑模式", - checked = BookshelfConfig.bookshelfLayoutCompact, - imageVector = Icons.Default.ViewCompact, - color = MaterialTheme.colorScheme.surface, - onCheckedChange = { BookshelfConfig.bookshelfLayoutCompact = it } - ) - CompactSwitchSettingItem( - title = "显示分隔线", - checked = BookshelfConfig.bookshelfShowDivider, - imageVector = Icons.Default.ViewCompact, - color = MaterialTheme.colorScheme.surface, - onCheckedChange = { BookshelfConfig.bookshelfShowDivider = it } - ) + CompactSwitchSettingItem( + title = "标题小字体", + checked = BookshelfConfig.bookshelfTitleSmallFont, + imageVector = Icons.Default.TextFormat, + color = MaterialTheme.colorScheme.surface, + onCheckedChange = { BookshelfConfig.bookshelfTitleSmallFont = it } + ) + + CompactSwitchSettingItem( + title = "标题居中", + checked = BookshelfConfig.bookshelfTitleCenter, + color = MaterialTheme.colorScheme.surface, + onCheckedChange = { BookshelfConfig.bookshelfTitleCenter = it } + ) + } } - // Grid Count - val gridCount = - if (isLandscape) BookshelfConfig.bookshelfLayoutGridLandscape else BookshelfConfig.bookshelfLayoutGridPortrait - CompactSliderSettingItem( - title = stringResource(R.string.number_rows_columns), - value = gridCount.toFloat(), - valueRange = 1f..15f, - steps = 14, - onValueChange = { - if (isLandscape) BookshelfConfig.bookshelfLayoutGridLandscape = it.toInt() - else BookshelfConfig.bookshelfLayoutGridPortrait = it.toInt() + AnimatedVisibility( + visible = layoutMode != 1 + ) { + Column( + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + CompactSwitchSettingItem( + title = "紧凑模式", + checked = BookshelfConfig.bookshelfLayoutCompact, + imageVector = Icons.Default.ViewCompact, + color = MaterialTheme.colorScheme.surface, + onCheckedChange = { BookshelfConfig.bookshelfLayoutCompact = it } + ) + + CompactSwitchSettingItem( + title = "显示分隔线", + checked = BookshelfConfig.bookshelfShowDivider, + imageVector = Icons.Default.ViewCompact, + color = MaterialTheme.colorScheme.surface, + onCheckedChange = { BookshelfConfig.bookshelfShowDivider = it } + ) } - ) + } CompactSliderSettingItem( title = "标题最大行数", diff --git a/app/src/main/java/io/legado/app/ui/widget/components/GlassMediumFlexibleTopAppBar.kt b/app/src/main/java/io/legado/app/ui/widget/components/GlassMediumFlexibleTopAppBar.kt index e3117f5ee..bd6d1432f 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/GlassMediumFlexibleTopAppBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/GlassMediumFlexibleTopAppBar.kt @@ -74,32 +74,40 @@ object GlassTopAppBarDefaults { } return TopAppBarDefaults.topAppBarColors( - containerColor = containerColor, - scrolledContainerColor = scrolledContainerColor + containerColor = applyTopBarOpacity(containerColor), + scrolledContainerColor = applyTopBarOpacity(scrolledContainerColor) ) } @Composable fun containerColor(): Color { - return GlassDefaults.glassColor( + val baseColor = GlassDefaults.glassColor( noBlurColor = MaterialTheme.colorScheme.surface, blurAlpha = GlassDefaults.TransparentAlpha ) + return applyTopBarOpacity(baseColor) } @Composable fun scrolledContainerColor(): Color { - return GlassDefaults.glassColor( + val baseColor = GlassDefaults.glassColor( noBlurColor = MaterialTheme.colorScheme.surfaceContainer, blurAlpha = GlassDefaults.TransparentAlpha ) + return applyTopBarOpacity(baseColor) } @Composable fun controlContainerColor(): Color { - return GlassDefaults.glassColor( + val baseColor = GlassDefaults.glassColor( noBlurColor = MaterialTheme.colorScheme.surfaceContainerHighest, blurAlpha = GlassDefaults.DefaultBlurAlpha ) + return applyTopBarOpacity(baseColor) + } + + private fun applyTopBarOpacity(color: Color): Color { + val opacity = (ThemeConfig.topBarOpacity.coerceIn(0, 100)) / 100f + return color.copy(alpha = (color.alpha * opacity).coerceIn(0f, 1f)) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/components/SplicedColumnGroup.kt b/app/src/main/java/io/legado/app/ui/widget/components/SplicedColumnGroup.kt index c6cb1912e..739d4e0a4 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/SplicedColumnGroup.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/SplicedColumnGroup.kt @@ -42,11 +42,11 @@ fun SplicedColumnGroup( Card( shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors(containerColor = Color.Transparent), - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() + .animateContentSize() ) { Column( - modifier = Modifier - .animateContentSize(), verticalArrangement = Arrangement.spacedBy(2.dp) ) { content() diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4d787ca37..68ad73fe8 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1397,6 +1397,10 @@ 主题风格 容器背景不透明度 %d + 顶栏不透明度 + %d + 底栏不透明度 + %d 启动应用时打开Web服务 听书预加载数量 %d diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 949c18740..4c58e6c5c 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1216,4 +1216,8 @@ 打开软件时检查是否有新备份,有新备份时提示是否更新 设置本地书籍保存目录,后续也可在设置中修改。 未选择文件夹 + 頂欄不透明度 + %d + 底欄不透明度 + %d diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c904b6037..d88fba834 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1218,4 +1218,8 @@ 打开软件时检查是否有新备份,有新备份时提示是否更新 设置本地书籍保存目录,后续也可在设置中修改。 未选择文件夹 + 頂欄不透明度 + %d + 底欄不透明度 + %d diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4bc2d3a93..5be095fe9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1401,6 +1401,10 @@ 主题风格 容器背景不透明度 %d + 顶栏不透明度 + %d + 底栏不透明度 + %d 启动应用时打开Web服务 听书预加载数量 %d