From f16bec9dc7d6efa9eab1adb952c4602977470d50 Mon Sep 17 00:00:00 2001
From: HapeLee <1321903405@qq.com>
Date: Wed, 25 Mar 2026 00:56:00 +0800
Subject: [PATCH] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E4=BA=86=E8=87=AA=E5=AE=9A=E4=B9=89=E4=B8=BB=E9=A2=98=E4=B8=8B?=
=?UTF-8?q?=E7=9A=84=E9=A2=9C=E8=89=B2=E8=A7=84=E6=A0=BC=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 | 1 +
.../app/ui/config/themeConfig/ThemeConfig.kt | 2 ++
.../config/themeConfig/ThemeConfigScreen.kt | 20 ++++++++++++++-----
.../java/io/legado/app/ui/theme/AppTheme.kt | 6 ++++--
.../legado/app/ui/theme/CustomColorScheme.kt | 10 ++++++++--
.../io/legado/app/ui/theme/ThemeColorSpec.kt | 6 ++++++
.../io/legado/app/ui/theme/ThemeManager.kt | 3 +++
.../io/legado/app/ui/theme/ThemeResolver.kt | 16 +++++++++++++++
app/src/main/res/values-zh-rCN/strings.xml | 1 +
app/src/main/res/values/array_values.xml | 5 +++++
app/src/main/res/values/arrays.xml | 7 ++++++-
app/src/main/res/values/strings.xml | 1 +
12 files changed, 68 insertions(+), 10 deletions(-)
create mode 100644 app/src/main/java/io/legado/app/ui/theme/ThemeColorSpec.kt
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 396879d07..bfc49a24d 100644
--- a/app/src/main/java/io/legado/app/constant/PreferKey.kt
+++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt
@@ -182,6 +182,7 @@ object PreferKey {
const val cAccent = "colorAccent"
const val customMode = "customMode"
const val paletteStyle = "paletteStyle"
+ const val materialVersion = "materialVersion"
const val composeEngine = "composeEngine"
const val containerOpacity = "containerOpacity"
const val enableBlur = "enableBlur"
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 c527320ee..ba3a11553 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
@@ -17,6 +17,8 @@ object ThemeConfig {
var paletteStyle by prefDelegate(PreferKey.paletteStyle, "tonalSpot")
+ var materialVersion by prefDelegate(PreferKey.materialVersion, "material3")
+
var appTheme by prefDelegate(PreferKey.appTheme, "0")
var themeMode by prefDelegate(PreferKey.themeMode, "0")
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 bc7ae497d..8554a77d0 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
@@ -278,6 +278,13 @@ fun ThemeConfigScreen(
entryValues = stringArrayResource(R.array.customContrast_value),
onValueChange = { ThemeConfig.customContrast = it }
)
+ DropdownListSettingItem(
+ title = stringResource(R.string.material_version),
+ selectedValue = ThemeConfig.materialVersion,
+ displayEntries = stringArrayResource(R.array.materialVersion),
+ entryValues = stringArrayResource(R.array.materialVersion_value),
+ onValueChange = { ThemeConfig.materialVersion = it }
+ )
}
}
@@ -476,7 +483,6 @@ fun ThemeConfigScreen(
}
)
}
-
}
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@@ -759,7 +765,8 @@ private fun getThemeColorPalette(
value: String,
isDark: Boolean,
isAmoled: Boolean,
- paletteStyle: String?
+ paletteStyle: String?,
+ materialVersion: String? = null
): ThemeColorPalette {
val appThemeMode = ThemeResolver.resolveThemeMode(value)
val colorScheme = ThemeManager.getColorScheme(
@@ -767,7 +774,8 @@ private fun getThemeColorPalette(
mode = appThemeMode,
darkTheme = isDark,
isAmoled = isAmoled,
- paletteStyle = paletteStyle
+ paletteStyle = paletteStyle,
+ materialVersion = materialVersion
)
return ThemeColorPalette(
@@ -784,7 +792,8 @@ private fun getThemeColors(
value: String,
isDark: Boolean,
isAmoled: Boolean,
- paletteStyle: String?
+ paletteStyle: String?,
+ materialVersion: String? = null
): ThemeColors {
val appThemeMode = ThemeResolver.resolveThemeMode(value)
val colorScheme = ThemeManager.getColorScheme(
@@ -792,7 +801,8 @@ private fun getThemeColors(
mode = appThemeMode,
darkTheme = isDark,
isAmoled = isAmoled,
- paletteStyle = paletteStyle
+ paletteStyle = paletteStyle,
+ materialVersion = materialVersion
)
return ThemeColors(
diff --git a/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt b/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt
index a47a60a05..76a21a88a 100644
--- a/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt
+++ b/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt
@@ -21,15 +21,17 @@ fun AppTheme(
val appThemeMode = ThemeResolver.resolveThemeMode(ThemeConfig.appTheme)
val isPureBlack = ThemeConfig.isPureBlack
val paletteStyle = ThemeConfig.paletteStyle
+ val materialVersion = ThemeConfig.materialVersion
val colorScheme =
- remember(context, appThemeMode, darkTheme, isPureBlack, paletteStyle) {
+ remember(context, appThemeMode, darkTheme, isPureBlack, paletteStyle, materialVersion) {
ThemeManager.getColorScheme(
context = context,
mode = appThemeMode,
darkTheme = darkTheme,
isAmoled = isPureBlack,
- paletteStyle = paletteStyle
+ paletteStyle = paletteStyle,
+ materialVersion = materialVersion
)
}
diff --git a/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt b/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt
index d66972174..b46f51054 100644
--- a/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt
+++ b/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt
@@ -4,20 +4,25 @@ import androidx.compose.material3.ColorScheme
import androidx.compose.ui.graphics.Color
import com.materialkolor.PaletteStyle
import com.materialkolor.dynamicColorScheme
+import io.legado.app.ui.theme.ThemeResolver.resolveColorSpecVersion
class CustomColorScheme(
seed: Int,
style: PaletteStyle,
+ colorSpec: ThemeColorSpec = ThemeColorSpec.SPEC_2021,
) : BaseColorScheme() {
private val contrastLevel: Double = ThemeResolver.resolveContrastLevel()
+ private val specVersion = resolveColorSpecVersion(colorSpec)
+
override val lightScheme: ColorScheme = dynamicColorScheme(
seedColor = Color(seed),
isDark = false,
isAmoled = false,
style = style,
- contrastLevel = contrastLevel
+ contrastLevel = contrastLevel,
+ specVersion = specVersion
)
override val darkScheme: ColorScheme = dynamicColorScheme(
@@ -25,6 +30,7 @@ class CustomColorScheme(
isDark = true,
isAmoled = false,
style = style,
- contrastLevel = contrastLevel
+ contrastLevel = contrastLevel,
+ specVersion = specVersion
)
}
diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeColorSpec.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeColorSpec.kt
new file mode 100644
index 000000000..e21d12603
--- /dev/null
+++ b/app/src/main/java/io/legado/app/ui/theme/ThemeColorSpec.kt
@@ -0,0 +1,6 @@
+package io.legado.app.ui.theme
+
+enum class ThemeColorSpec(val displayName: String) {
+ SPEC_2021("Material 3 (2021)"),
+ SPEC_2025("Expressive (2025)")
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt
index c2fd91861..561b4d48c 100644
--- a/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt
+++ b/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt
@@ -8,6 +8,7 @@ import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.ui.graphics.Color
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.theme.ThemeResolver.resolvePaletteStyle
+import io.legado.app.ui.theme.ThemeResolver.resolveThemeColorSpec
import io.legado.app.ui.theme.colorScheme.AugustColorScheme
import io.legado.app.ui.theme.colorScheme.CarlottaColorScheme
import io.legado.app.ui.theme.colorScheme.ElinkColorScheme
@@ -45,10 +46,12 @@ object ThemeManager {
darkTheme: Boolean,
isAmoled: Boolean,
paletteStyle: String?,
+ materialVersion: String? = null,
forceOpaque: Boolean = false
): ColorScheme {
val style = resolvePaletteStyle(paletteStyle)
+ val colorSpec = resolveThemeColorSpec(materialVersion)
val actualMode = if (forceOpaque && mode == AppThemeMode.Transparent) {
AppThemeMode.WH
} else {
diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt
index a392cef7a..44b3d8fd1 100644
--- a/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt
+++ b/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt
@@ -2,6 +2,7 @@ package io.legado.app.ui.theme
import com.materialkolor.Contrast
import com.materialkolor.PaletteStyle
+import com.materialkolor.dynamiccolor.ColorSpec
import io.legado.app.ui.config.themeConfig.ThemeConfig
object ThemeResolver {
@@ -47,4 +48,19 @@ object ThemeResolver {
}
}
+ fun resolveThemeColorSpec(value: String?): ThemeColorSpec {
+ return when (value) {
+ "material3" -> ThemeColorSpec.SPEC_2021
+ "material3Expressive" -> ThemeColorSpec.SPEC_2025
+ else -> ThemeColorSpec.SPEC_2021
+ }
+ }
+
+ fun resolveColorSpecVersion(colorSpec: ThemeColorSpec): ColorSpec.SpecVersion {
+ return when (colorSpec) {
+ ThemeColorSpec.SPEC_2025 -> ColorSpec.SpecVersion.SPEC_2025
+ ThemeColorSpec.SPEC_2021 -> ColorSpec.SpecVersion.SPEC_2021
+ }
+ }
+
}
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index b420a0a22..4d787ca37 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1389,6 +1389,7 @@
颜色样式
反转音量键翻页方向
调色板样式
+ 颜色规格
这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。
启用控件模糊
总是使用下划线表示强调文本
diff --git a/app/src/main/res/values/array_values.xml b/app/src/main/res/values/array_values.xml
index 28fce4cd8..01970a0b9 100644
--- a/app/src/main/res/values/array_values.xml
+++ b/app/src/main/res/values/array_values.xml
@@ -98,6 +98,11 @@
- content
+
+ - material3
+ - material3Expressive
+
+
- material
- salt
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 7007950a2..76edcad94 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -212,7 +212,12 @@
- Content
-
+
+ - Material 3 (2021)
+ - Material 3 Expressive (2025)
+
+
+
- Material Design
- SaltUI
- Miuix
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 208e33ff3..4bc2d3a93 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1393,6 +1393,7 @@
颜色样式
反转音量键翻页方向
调色板样式
+ 颜色规格
这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。
启用控件模糊
总是使用下划线表示强调文本