From f31138338bac5717cc9157c70af1dbfa7e4e5b1d Mon Sep 17 00:00:00 2001
From: HapeLee <63206378+HapeLee@users.noreply.github.com>
Date: Sat, 28 Mar 2026 01:01:57 +0800
Subject: [PATCH] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E6=9C=AA=E5=BC=80=E5=90=AF=E6=A8=A1=E7=B3=8A=E6=97=B6=E7=9A=84?=
=?UTF-8?q?=E9=A1=B6=E6=A0=8F=E4=B8=8E=E5=BA=95=E6=A0=8F=E9=80=8F=E6=98=8E?=
=?UTF-8?q?=E5=BA=A6=E9=80=89=E9=A1=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/io/legado/app/constant/PreferKey.kt | 2 +
.../app/ui/config/themeConfig/ThemeConfig.kt | 4 +
.../config/themeConfig/ThemeConfigScreen.kt | 58 ++++++++--
.../java/io/legado/app/ui/main/MainScreen.kt | 6 +-
.../ui/main/bookshelf/BookshelfConfigSheet.kt | 105 +++++++++---------
.../GlassMediumFlexibleTopAppBar.kt | 18 ++-
.../widget/components/SplicedColumnGroup.kt | 6 +-
app/src/main/res/values-zh-rCN/strings.xml | 4 +
app/src/main/res/values-zh-rHK/strings.xml | 4 +
app/src/main/res/values-zh-rTW/strings.xml | 4 +
app/src/main/res/values/strings.xml | 4 +
11 files changed, 144 insertions(+), 71 deletions(-)
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