[优化] 添加了自定义主题下的颜色规格选项
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user