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

This commit is contained in:
HapeLee
2026-03-25 01:38:06 +08:00
parent 25abbdaf1e
commit f16bec9dc7
12 changed files with 68 additions and 10 deletions
@@ -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"
@@ -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")
@@ -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(
@@ -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
)
}
@@ -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
)
}
@@ -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 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 {
@@ -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
}
}
}