自定义主题添加选择对比度的选项 #762
Merge pull request #762 * 手动选择对比度 * 样式优化&操作逻辑优化 * [优化] 优化代码,使用kolor自带的枚举值
This commit is contained in:
@@ -178,6 +178,7 @@ object PreferKey {
|
||||
const val disableMangaScale = "disableMangaScale"
|
||||
const val firebaseEnable = "firebaseEnable"
|
||||
const val cPrimary = "colorPrimary"
|
||||
const val customContrast = "customContrast"
|
||||
const val cAccent = "colorAccent"
|
||||
const val customMode = "customMode"
|
||||
const val paletteStyle = "paletteStyle"
|
||||
|
||||
@@ -47,6 +47,10 @@ object ThemeConfig {
|
||||
postEvent(EventBus.RECREATE, "")
|
||||
}
|
||||
|
||||
var customContrast by prefDelegate(PreferKey.customContrast, "Default") {
|
||||
postEvent(EventBus.RECREATE, "")
|
||||
}
|
||||
|
||||
var launcherIcon by prefDelegate(PreferKey.launcherIcon, "ic_launcher")
|
||||
|
||||
var showDiscovery by prefDelegate(PreferKey.showDiscovery, true)
|
||||
@@ -68,4 +72,4 @@ object ThemeConfig {
|
||||
fun hasImageBg(isDark: Boolean): Boolean =
|
||||
!(if (isDark) bgImageDark else bgImageLight).isNullOrBlank()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,12 +213,12 @@ fun ThemeConfigScreen(
|
||||
onClick = { showLauncherIconPicker = true }
|
||||
)
|
||||
SwitchSettingItem(
|
||||
title = "预见性返回手势",
|
||||
description = "启用系统预见性返回手势",
|
||||
title = stringResource(R.string.predictive_back),
|
||||
description = stringResource(R.string.predictive_back_summary),
|
||||
checked = ThemeConfig.isPredictiveBackEnabled,
|
||||
onCheckedChange = {
|
||||
ThemeConfig.isPredictiveBackEnabled = it
|
||||
context.toastOnUi("重启以应用")
|
||||
context.toastOnUi(R.string.restart_to_apply)
|
||||
}
|
||||
)
|
||||
SliderSettingItem(
|
||||
@@ -239,14 +239,14 @@ fun ThemeConfigScreen(
|
||||
}
|
||||
|
||||
if (selectedTheme == "12") {
|
||||
SplicedColumnGroup(title = "自定义主题") {
|
||||
SplicedColumnGroup(title = stringResource(R.string.custom_theme)) {
|
||||
ClickableSettingItem(
|
||||
title = stringResource(R.string.seed_color),
|
||||
option = if (primaryColorValue.intValue != 0) "#${
|
||||
Integer.toHexString(
|
||||
primaryColorValue.intValue
|
||||
).uppercase()
|
||||
}" else "点击选择",
|
||||
}" else stringResource(R.string.click_to_select),
|
||||
onClick = { showColorPicker = true },
|
||||
trailingContent = {
|
||||
if (primaryColorValue.intValue != 0) {
|
||||
@@ -271,6 +271,13 @@ fun ThemeConfigScreen(
|
||||
entryValues = stringArrayResource(R.array.paletteStyle_value),
|
||||
onValueChange = { ThemeConfig.paletteStyle = it }
|
||||
)
|
||||
DropdownListSettingItem(
|
||||
title = stringResource(R.string.preferred_contrast),
|
||||
selectedValue = ThemeConfig.customContrast,
|
||||
displayEntries = stringArrayResource(R.array.customContrast),
|
||||
entryValues = stringArrayResource(R.array.customContrast_value),
|
||||
onValueChange = { ThemeConfig.customContrast = it }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -325,9 +332,9 @@ fun ThemeConfigScreen(
|
||||
)
|
||||
}
|
||||
|
||||
SplicedColumnGroup(title = "Compose 相关") {
|
||||
SplicedColumnGroup(title = stringResource(R.string.compose_related)) {
|
||||
SwitchSettingItem(
|
||||
title = "使用折叠应用栏",
|
||||
title = stringResource(R.string.use_flexible_top_bar),
|
||||
checked = ThemeConfig.useFlexibleTopAppBar,
|
||||
onCheckedChange = { ThemeConfig.useFlexibleTopAppBar = it }
|
||||
)
|
||||
@@ -469,6 +476,7 @@ fun ThemeConfigScreen(
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
||||
|
||||
@@ -1,30 +1,16 @@
|
||||
package io.legado.app.ui.theme
|
||||
|
||||
import android.app.UiModeManager
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import androidx.compose.material3.ColorScheme
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.core.content.getSystemService
|
||||
import com.materialkolor.Contrast
|
||||
import com.materialkolor.PaletteStyle
|
||||
import com.materialkolor.dynamicColorScheme
|
||||
|
||||
class CustomColorScheme(
|
||||
context: Context,
|
||||
seed: Int,
|
||||
style: PaletteStyle,
|
||||
) : BaseColorScheme() {
|
||||
|
||||
private val contrastLevel: Double =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
context.getSystemService<UiModeManager>()
|
||||
?.contrast
|
||||
?.toDouble()
|
||||
?: Contrast.Default.value
|
||||
} else {
|
||||
Contrast.Default.value
|
||||
}
|
||||
private val contrastLevel: Double = ThemeResolver.resolveContrastLevel()
|
||||
|
||||
override val lightScheme: ColorScheme = dynamicColorScheme(
|
||||
seedColor = Color(seed),
|
||||
|
||||
@@ -65,7 +65,7 @@ object ThemeManager {
|
||||
}
|
||||
|
||||
AppThemeMode.CUSTOM -> {
|
||||
CustomColorScheme(context, context.primaryColor, style)
|
||||
CustomColorScheme(context.primaryColor, style)
|
||||
.getColorScheme(darkTheme)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package io.legado.app.ui.theme
|
||||
|
||||
import com.materialkolor.Contrast
|
||||
import com.materialkolor.PaletteStyle
|
||||
import io.legado.app.ui.config.themeConfig.ThemeConfig
|
||||
|
||||
object ThemeResolver {
|
||||
|
||||
@@ -37,4 +39,12 @@ object ThemeResolver {
|
||||
}
|
||||
}
|
||||
|
||||
fun resolveContrastLevel(): Double {
|
||||
return try {
|
||||
Contrast.valueOf(ThemeConfig.customContrast).value
|
||||
} catch (e: Exception) {
|
||||
Contrast.Default.value
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -214,5 +214,11 @@
|
||||
<item>仅封面</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="customContrast">
|
||||
<item>默认</item>
|
||||
<item>较强</item>
|
||||
<item>最强</item>
|
||||
</string-array>
|
||||
|
||||
<string name="all_version">所有版本</string>
|
||||
</resources>
|
||||
@@ -25,6 +25,24 @@
|
||||
<string name="tip_cannot_jump_setting_page">无法跳转至设置界面</string>
|
||||
|
||||
<string name="manual_input">手动输入</string>
|
||||
<string name="preferred_contrast">偏好对比度</string>
|
||||
<string name="contrast_source_system_summary">来源:系统对比度</string>
|
||||
<string name="contrast_source_manual_summary">来源:手动输入</string>
|
||||
<string name="current_effective_contrast">当前生效值:%1$s</string>
|
||||
<string name="system_contrast_value">系统对比度:%1$s</string>
|
||||
<string name="system_contrast">系统对比度</string>
|
||||
<string name="manual_contrast_value_label">手动值 [-1, 1]</string>
|
||||
<string name="manual_contrast_invalid">请输入 -1 到 1 之间的有效数字</string>
|
||||
<string name="predictive_back">预见性返回手势</string>
|
||||
<string name="predictive_back_summary">启用系统预见性返回手势</string>
|
||||
<string name="restart_to_apply">重启以应用</string>
|
||||
<string name="custom_theme">自定义主题</string>
|
||||
<string name="click_to_select">点击选择</string>
|
||||
<string name="compose_related">Compose 相关</string>
|
||||
<string name="use_flexible_top_bar">使用折叠应用栏</string>
|
||||
<string name="slider">滑块</string>
|
||||
<string name="input">输入</string>
|
||||
<string name="manual_contrast_value_template">手动值:%1$s</string>
|
||||
<string name="enter_directory_path">请输入目录路径</string>
|
||||
<string name="invalid_directory">目录路径无效</string>
|
||||
<string name="empty_directory_input">目录路径不能为空</string>
|
||||
@@ -1390,4 +1408,4 @@
|
||||
<string name="enable_select_vibrator">选择文本时震动</string>
|
||||
<string name="re_sync_webdav">重新同步远程书籍</string>
|
||||
<string name="underline_padding">离字间距</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -131,4 +131,10 @@
|
||||
<item>3</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="customContrast_value">
|
||||
<item>Default</item>
|
||||
<item>Medium</item>
|
||||
<item>High</item>
|
||||
</string-array>
|
||||
|
||||
</resources>
|
||||
@@ -299,5 +299,11 @@
|
||||
<item>Unlabeled</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="customContrast">
|
||||
<item>Default</item>
|
||||
<item>High</item>
|
||||
<item>Maximum</item>
|
||||
</string-array>
|
||||
|
||||
<string name="all_version">所有版本</string>
|
||||
</resources>
|
||||
|
||||
@@ -26,6 +26,24 @@
|
||||
<string name="tip_cannot_jump_setting_page">Cannot jump to Settings.</string>
|
||||
|
||||
<string name="manual_input">Manual Input</string>
|
||||
<string name="preferred_contrast">Preferred contrast</string>
|
||||
<string name="contrast_source_system_summary">Source: System contrast</string>
|
||||
<string name="contrast_source_manual_summary">Source: Manual input</string>
|
||||
<string name="current_effective_contrast">Current effective value: %1$s</string>
|
||||
<string name="system_contrast_value">System contrast: %1$s</string>
|
||||
<string name="system_contrast">System contrast</string>
|
||||
<string name="manual_contrast_value_label">Manual value [-1, 1]</string>
|
||||
<string name="manual_contrast_invalid">Enter a valid number between -1 and 1</string>
|
||||
<string name="predictive_back">Predictive Back Gestures</string>
|
||||
<string name="predictive_back_summary">Enable system predictive back gestures</string>
|
||||
<string name="restart_to_apply">Restart to apply</string>
|
||||
<string name="custom_theme">Custom Theme</string>
|
||||
<string name="click_to_select">Click to select</string>
|
||||
<string name="compose_related">Compose Related</string>
|
||||
<string name="use_flexible_top_bar">Use flexible top app bar</string>
|
||||
<string name="slider">Slider</string>
|
||||
<string name="input">Input</string>
|
||||
<string name="manual_contrast_value_template">Manual value: %1$s</string>
|
||||
<string name="enter_directory_path">Enter directory path</string>
|
||||
<string name="invalid_directory">Invalid directory path</string>
|
||||
<string name="empty_directory_input">Directory path cannot be empty</string>
|
||||
|
||||
Reference in New Issue
Block a user