Przeglądaj źródła

[优化] 添加了自定义主题下的颜色规格选项

HapeLee 7 miesięcy temu
rodzic
commit
f16bec9dc7

+ 1 - 0
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"

+ 2 - 0
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")

+ 15 - 5
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(

+ 4 - 2
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
             )
         }
 

+ 8 - 2
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
     )
 }

+ 6 - 0
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)")
+}

+ 3 - 0
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 {

+ 16 - 0
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
+        }
+    }
+
 }

+ 1 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -1389,6 +1389,7 @@
     <string name="read_color">颜色样式</string>
     <string name="reverse_volume_key_page">反转音量键翻页方向</string>
     <string name="palette_style">调色板样式</string>
+    <string name="material_version">颜色规格</string>
     <string name="tip_compose_set">这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。</string>
     <string name="is_blur_enable">启用控件模糊</string>
     <string name="use_underline">总是使用下划线表示强调文本</string>

+ 5 - 0
app/src/main/res/values/array_values.xml

@@ -98,6 +98,11 @@
         <item>content</item>
     </string-array>
 
+    <string-array name="materialVersion_value">
+        <item>material3</item>
+        <item>material3Expressive</item>
+    </string-array>
+
     <string-array name="composeEngine_value">
         <item>material</item>
         <item>salt</item>

+ 6 - 1
app/src/main/res/values/arrays.xml

@@ -212,7 +212,12 @@
         <item>Content</item>
     </string-array>
 
-    <string-array name="composeEngine">
+	<string-array name="materialVersion">
+		<item>Material 3 (2021)</item>
+		<item>Material 3 Expressive (2025)</item>
+	</string-array>
+
+	<string-array name="composeEngine">
         <item>Material Design</item>
         <item>SaltUI</item>
         <item>Miuix</item>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -1393,6 +1393,7 @@
     <string name="read_color">颜色样式</string>
     <string name="reverse_volume_key_page">反转音量键翻页方向</string>
     <string name="palette_style">调色板样式</string>
+    <string name="material_version">颜色规格</string>
     <string name="tip_compose_set">这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。</string>
     <string name="is_blur_enable">启用控件模糊</string>
     <string name="use_underline">总是使用下划线表示强调文本</string>