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

This commit is contained in:
HapeLee committed 2026-03-25 01:38:06 +08:00
1 parent 25abbdaf1e
commit f16bec9dc7
12 files changed
+67 -9

No files matched your search

@@ -182,6 +182,7 @@ object PreferKey {
const val cAccent = "colorAccent" const val cAccent = "colorAccent"
const val customMode = "customMode" const val customMode = "customMode"
const val paletteStyle = "paletteStyle" const val paletteStyle = "paletteStyle"
const val materialVersion = "materialVersion"
const val composeEngine = "composeEngine" const val composeEngine = "composeEngine"
const val containerOpacity = "containerOpacity" const val containerOpacity = "containerOpacity"
const val enableBlur = "enableBlur" const val enableBlur = "enableBlur"
@@ -17,6 +17,8 @@ object ThemeConfig {
var paletteStyle by prefDelegate(PreferKey.paletteStyle, "tonalSpot") var paletteStyle by prefDelegate(PreferKey.paletteStyle, "tonalSpot")
var materialVersion by prefDelegate(PreferKey.materialVersion, "material3")
var appTheme by prefDelegate(PreferKey.appTheme, "0") var appTheme by prefDelegate(PreferKey.appTheme, "0")
var themeMode by prefDelegate(PreferKey.themeMode, "0") var themeMode by prefDelegate(PreferKey.themeMode, "0")
@@ -278,6 +278,13 @@ fun ThemeConfigScreen(
entryValues = stringArrayResource(R.array.customContrast_value), entryValues = stringArrayResource(R.array.customContrast_value),
onValueChange = { ThemeConfig.customContrast = it } 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) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@@ -759,7 +765,8 @@ private fun getThemeColorPalette(
value: String, value: String,
isDark: Boolean, isDark: Boolean,
isAmoled: Boolean, isAmoled: Boolean,
paletteStyle: String? paletteStyle: String?,
materialVersion: String? = null
): ThemeColorPalette { ): ThemeColorPalette {
val appThemeMode = ThemeResolver.resolveThemeMode(value) val appThemeMode = ThemeResolver.resolveThemeMode(value)
val colorScheme = ThemeManager.getColorScheme( val colorScheme = ThemeManager.getColorScheme(
@@ -767,7 +774,8 @@ private fun getThemeColorPalette(
mode = appThemeMode, mode = appThemeMode,
darkTheme = isDark, darkTheme = isDark,
isAmoled = isAmoled, isAmoled = isAmoled,
paletteStyle = paletteStyle paletteStyle = paletteStyle,
materialVersion = materialVersion
) )
return ThemeColorPalette( return ThemeColorPalette(
@@ -784,7 +792,8 @@ private fun getThemeColors(
value: String, value: String,
isDark: Boolean, isDark: Boolean,
isAmoled: Boolean, isAmoled: Boolean,
paletteStyle: String? paletteStyle: String?,
materialVersion: String? = null
): ThemeColors { ): ThemeColors {
val appThemeMode = ThemeResolver.resolveThemeMode(value) val appThemeMode = ThemeResolver.resolveThemeMode(value)
val colorScheme = ThemeManager.getColorScheme( val colorScheme = ThemeManager.getColorScheme(
@@ -792,7 +801,8 @@ private fun getThemeColors(
mode = appThemeMode, mode = appThemeMode,
darkTheme = isDark, darkTheme = isDark,
isAmoled = isAmoled, isAmoled = isAmoled,
paletteStyle = paletteStyle paletteStyle = paletteStyle,
materialVersion = materialVersion
) )
return ThemeColors( return ThemeColors(
@@ -21,15 +21,17 @@ fun AppTheme(
val appThemeMode = ThemeResolver.resolveThemeMode(ThemeConfig.appTheme) val appThemeMode = ThemeResolver.resolveThemeMode(ThemeConfig.appTheme)
val isPureBlack = ThemeConfig.isPureBlack val isPureBlack = ThemeConfig.isPureBlack
val paletteStyle = ThemeConfig.paletteStyle val paletteStyle = ThemeConfig.paletteStyle
val materialVersion = ThemeConfig.materialVersion
val colorScheme = val colorScheme =
remember(context, appThemeMode, darkTheme, isPureBlack, paletteStyle) { remember(context, appThemeMode, darkTheme, isPureBlack, paletteStyle, materialVersion) {
ThemeManager.getColorScheme( ThemeManager.getColorScheme(
context = context, context = context,
mode = appThemeMode, mode = appThemeMode,
darkTheme = darkTheme, darkTheme = darkTheme,
isAmoled = isPureBlack, isAmoled = isPureBlack,
paletteStyle = paletteStyle paletteStyle = paletteStyle,
materialVersion = materialVersion
) )
} }
@@ -4,20 +4,25 @@ import androidx.compose.material3.ColorScheme
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import com.materialkolor.PaletteStyle import com.materialkolor.PaletteStyle
import com.materialkolor.dynamicColorScheme import com.materialkolor.dynamicColorScheme
import io.legado.app.ui.theme.ThemeResolver.resolveColorSpecVersion
class CustomColorScheme( class CustomColorScheme(
seed: Int, seed: Int,
style: PaletteStyle, style: PaletteStyle,
colorSpec: ThemeColorSpec = ThemeColorSpec.SPEC_2021,
) : BaseColorScheme() { ) : BaseColorScheme() {
private val contrastLevel: Double = ThemeResolver.resolveContrastLevel() private val contrastLevel: Double = ThemeResolver.resolveContrastLevel()
private val specVersion = resolveColorSpecVersion(colorSpec)
override val lightScheme: ColorScheme = dynamicColorScheme( override val lightScheme: ColorScheme = dynamicColorScheme(
seedColor = Color(seed), seedColor = Color(seed),
isDark = false, isDark = false,
isAmoled = false, isAmoled = false,
style = style, style = style,
contrastLevel = contrastLevel contrastLevel = contrastLevel,
specVersion = specVersion
) )
override val darkScheme: ColorScheme = dynamicColorScheme( override val darkScheme: ColorScheme = dynamicColorScheme(
@@ -25,6 +30,7 @@ class CustomColorScheme(
isDark = true, isDark = true,
isAmoled = false, isAmoled = false,
style = style, style = style,
contrastLevel = contrastLevel contrastLevel = contrastLevel,
specVersion = specVersion
) )
} }
@@ -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)")
}
@@ -8,6 +8,7 @@ import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.theme.ThemeResolver.resolvePaletteStyle 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.AugustColorScheme
import io.legado.app.ui.theme.colorScheme.CarlottaColorScheme import io.legado.app.ui.theme.colorScheme.CarlottaColorScheme
import io.legado.app.ui.theme.colorScheme.ElinkColorScheme import io.legado.app.ui.theme.colorScheme.ElinkColorScheme
@@ -45,10 +46,12 @@ object ThemeManager {
darkTheme: Boolean, darkTheme: Boolean,
isAmoled: Boolean, isAmoled: Boolean,
paletteStyle: String?, paletteStyle: String?,
materialVersion: String? = null,
forceOpaque: Boolean = false forceOpaque: Boolean = false
): ColorScheme { ): ColorScheme {
val style = resolvePaletteStyle(paletteStyle) val style = resolvePaletteStyle(paletteStyle)
val colorSpec = resolveThemeColorSpec(materialVersion)
val actualMode = if (forceOpaque && mode == AppThemeMode.Transparent) { val actualMode = if (forceOpaque && mode == AppThemeMode.Transparent) {
AppThemeMode.WH AppThemeMode.WH
} else { } else {
@@ -2,6 +2,7 @@ package io.legado.app.ui.theme
import com.materialkolor.Contrast import com.materialkolor.Contrast
import com.materialkolor.PaletteStyle import com.materialkolor.PaletteStyle
import com.materialkolor.dynamiccolor.ColorSpec
import io.legado.app.ui.config.themeConfig.ThemeConfig import io.legado.app.ui.config.themeConfig.ThemeConfig
object ThemeResolver { 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
}
}
} }
@@ -1389,6 +1389,7 @@
<string name="read_color">颜色样式</string> <string name="read_color">颜色样式</string>
<string name="reverse_volume_key_page">反转音量键翻页方向</string> <string name="reverse_volume_key_page">反转音量键翻页方向</string>
<string name="palette_style">调色板样式</string> <string name="palette_style">调色板样式</string>
<string name="material_version">颜色规格</string>
<string name="tip_compose_set">这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。</string> <string name="tip_compose_set">这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。</string>
<string name="is_blur_enable">启用控件模糊</string> <string name="is_blur_enable">启用控件模糊</string>
<string name="use_underline">总是使用下划线表示强调文本</string> <string name="use_underline">总是使用下划线表示强调文本</string>
+5
View File
@@ -98,6 +98,11 @@
<item>content</item> <item>content</item>
</string-array> </string-array>
<string-array name="materialVersion_value">
<item>material3</item>
<item>material3Expressive</item>
</string-array>
<string-array name="composeEngine_value"> <string-array name="composeEngine_value">
<item>material</item> <item>material</item>
<item>salt</item> <item>salt</item>
+5
View File
@@ -212,6 +212,11 @@
<item>Content</item> <item>Content</item>
</string-array> </string-array>
<string-array name="materialVersion">
<item>Material 3 (2021)</item>
<item>Material 3 Expressive (2025)</item>
</string-array>
<string-array name="composeEngine"> <string-array name="composeEngine">
<item>Material Design</item> <item>Material Design</item>
<item>SaltUI</item> <item>SaltUI</item>
+1
View File
@@ -1393,6 +1393,7 @@
<string name="read_color">颜色样式</string> <string name="read_color">颜色样式</string>
<string name="reverse_volume_key_page">反转音量键翻页方向</string> <string name="reverse_volume_key_page">反转音量键翻页方向</string>
<string name="palette_style">调色板样式</string> <string name="palette_style">调色板样式</string>
<string name="material_version">颜色规格</string>
<string name="tip_compose_set">这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。</string> <string name="tip_compose_set">这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。</string>
<string name="is_blur_enable">启用控件模糊</string> <string name="is_blur_enable">启用控件模糊</string>
<string name="use_underline">总是使用下划线表示强调文本</string> <string name="use_underline">总是使用下划线表示强调文本</string>