新增一个电子书主题

This commit is contained in:
HapeLee
2025-10-27 23:07:20 +08:00
parent afbe56d853
commit 878f5c4a4b
10 changed files with 191 additions and 36 deletions
+1 -1
View File
@@ -72,7 +72,7 @@ class App : Application() {
override fun onCreate() {
if (getPrefString("app_theme", "0") == "11") {
if (getPrefString("app_theme", "0") == "12") {
if (AppConfig.customMode == "accent")
setTheme(R.style.ThemeOverlay_WhiteBackground)
@@ -163,14 +163,15 @@ abstract class BaseActivity<VB : ViewBinding>(
"1" -> setTheme(R.style.Theme_Base_GR)
"2" -> setTheme(R.style.Theme_Base_Lemon)
"3" -> setTheme(R.style.Theme_Base_WH)
"4" -> setTheme(R.style.Theme_Base_Sora)
"5" -> setTheme(R.style.Theme_Base_August)
"6" -> setTheme(R.style.Theme_Base_Carlotta)
"7" -> setTheme(R.style.Theme_Base_Koharu)
"8" -> setTheme(R.style.Theme_Base_Yuuka)
"9" -> setTheme(R.style.Theme_Base_Phoebe)
"10" -> setTheme(R.style.Theme_Base_Mujika)
"11" -> {
"4" -> setTheme(R.style.Theme_Base_Elink)
"5" -> setTheme(R.style.Theme_Base_Sora)
"6" -> setTheme(R.style.Theme_Base_August)
"7" -> setTheme(R.style.Theme_Base_Carlotta)
"8" -> setTheme(R.style.Theme_Base_Koharu)
"9" -> setTheme(R.style.Theme_Base_Yuuka)
"10" -> setTheme(R.style.Theme_Base_Phoebe)
"11" -> setTheme(R.style.Theme_Base_Mujika)
"12" -> {
if (AppConfig.customMode == "accent")
setTheme(R.style.ThemeOverlay_WhiteBackground)
@@ -203,7 +204,7 @@ abstract class BaseActivity<VB : ViewBinding>(
}
}
"12" -> setTheme(R.style.AppTheme_Transparent)
"13" -> setTheme(R.style.AppTheme_Transparent)
}
if (AppConfig.pureBlack)
@@ -124,15 +124,16 @@ class ThemeCardPreference(context: Context, attrs: AttributeSet) : Preference(co
"1" to R.style.Theme_Base_GR,
"2" to R.style.Theme_Base_Lemon,
"3" to R.style.Theme_Base_WH,
"4" to R.style.Theme_Base_Sora,
"5" to R.style.Theme_Base_August,
"6" to R.style.Theme_Base_Carlotta,
"7" to R.style.Theme_Base_Koharu,
"8" to R.style.Theme_Base_Yuuka,
"9" to R.style.Theme_Base_Phoebe,
"10" to R.style.Theme_Base_Mujika,
"11" to R.style.ThemeOverlay_WhiteBackground,
"12" to R.style.AppTheme_Transparent)
"4" to R.style.Theme_Base_Elink,
"5" to R.style.Theme_Base_Sora,
"6" to R.style.Theme_Base_August,
"7" to R.style.Theme_Base_Carlotta,
"8" to R.style.Theme_Base_Koharu,
"9" to R.style.Theme_Base_Yuuka,
"10" to R.style.Theme_Base_Phoebe,
"11" to R.style.Theme_Base_Mujika,
"12" to R.style.ThemeOverlay_WhiteBackground,
"13" to R.style.AppTheme_Transparent)
private fun getThemeColors(value: String): List<Int> {
val themeResId = themeResIdMap[value] ?: return listOf(Color.GRAY, Color.GRAY, Color.GRAY, Color.GRAY)
@@ -2,6 +2,7 @@ package io.legato.kazusa.ui.book.read
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.content.res.Configuration
import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet
@@ -14,6 +15,7 @@ import android.widget.FrameLayout
import android.widget.SeekBar
import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.ColorUtils
import androidx.core.view.doOnAttach
import androidx.core.view.isGone
import androidx.core.view.isVisible
import com.google.android.material.button.MaterialButton
@@ -47,6 +49,7 @@ import io.legato.kazusa.utils.putPrefBoolean
import io.legato.kazusa.utils.startActivity
import io.legato.kazusa.utils.themeColor
import io.legato.kazusa.utils.visible
import org.checkerframework.checker.units.qual.cd
import splitties.views.onClick
/**
@@ -167,19 +170,16 @@ class ReadMenu @JvmOverloads constructor(
}
init {
initView()
upBrightnessState()
bindEvent()
doOnAttach {
initView()
upBrightnessState()
bindEvent()
}
}
private fun initView() = binding.run {
initAnimation()
updateSliderVisibility()
binding.bottomView.post {
val allButtons = getUserButtons()
renderButtons(binding.bottomView, allButtons)
}
val brightnessBackground = GradientDrawable()
brightnessBackground.cornerRadius = 5F.dpToPx()
llBrightness.background = brightnessBackground
@@ -198,10 +198,16 @@ class ReadMenu @JvmOverloads constructor(
} else {
titleBarAddition.gone()
}
binding.bottomView.post {
val allButtons = getUserButtons()
renderButtons(binding.bottomView, allButtons)
}
val alpha = (AppConfig.menuAlpha / 100f * 255).toInt()
val color = context.themeColor(com.google.android.material.R.attr.colorSurfaceContainer)
titleBar.setBackgroundColor(ColorUtils.setAlphaComponent(color, alpha))
llSlider.alpha = AppConfig.menuAlpha / 100f
cdSlider.setCardBackgroundColor(ColorUtils.setAlphaComponent(color, alpha))
tvPre.alpha = AppConfig.menuAlpha / 100f * 255
tvNext.alpha = AppConfig.menuAlpha / 100f * 255
upBrightnessVwPos()
/**
* 确保视图不被导航栏遮挡
@@ -503,12 +509,7 @@ class ReadMenu @JvmOverloads constructor(
buttonMap.clear()
buttons.forEach { btn ->
val style =
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE)
com.google.android.material.R.attr.materialIconButtonFilledTonalStyle
else
com.google.android.material.R.attr.materialIconButtonOutlinedStyle
val style = com.google.android.material.R.attr.materialIconButtonOutlinedStyle
val button = MaterialButton(group.context, null, style).apply {
id = btn.id.hashCode()
setIconResource(btn.iconRes)
@@ -517,6 +518,7 @@ class ReadMenu @JvmOverloads constructor(
strokeWidth = 0
iconGravity = MaterialButton.ICON_GRAVITY_TEXT_START
maxLines = 1
iconTint = ColorStateList.valueOf(context.themeColor(androidx.appcompat.R.attr.colorPrimary))
setOnClickListener { btn.onClick() }
btn.onLongClick?.let { longAction ->
setOnLongClickListener {
@@ -561,7 +563,7 @@ class ReadMenu @JvmOverloads constructor(
iconRes = R.drawable.ic_read_aloud,
description = context.getString(R.string.read_aloud),
onClick = { runMenuOut { callBack.onClickReadAloud() } },
onLongClick = { callBack.showReadAloudDialog() }
onLongClick = { runMenuOut { callBack.onClickReadAloud() } }
),
ToolButton(
id = "setting",
@@ -653,7 +655,9 @@ class ReadMenu @JvmOverloads constructor(
fun upBookView() {
val bookName = ReadBook.book?.name ?: ""
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
val isTablet = (resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
if (isTablet || resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
binding.titleBar.title = bookName
binding.tvBookName.gone()
} else {
+48
View File
@@ -529,6 +529,54 @@
<color name="transparent_theme_surfaceContainerHigh">#4DFFFFFF</color>
<color name="transparent_theme_surfaceContainerHighest">#66FFFFFF</color>
<color name="elink_theme_primary">#FFFFFF</color>
<color name="elink_theme_onPrimary">#000000</color>
<color name="elink_theme_primaryContainer">#FFFFFF</color>
<color name="elink_theme_onPrimaryContainer">#000000</color>
<color name="elink_theme_secondary">#FFFFFF</color>
<color name="elink_theme_onSecondary">#000000</color>
<color name="elink_theme_secondaryContainer">#808080</color>
<color name="elink_theme_onSecondaryContainer">#FFFFFF</color>
<color name="elink_theme_tertiary">#FFFFFF</color>
<color name="elink_theme_onTertiary">#000000</color>
<color name="elink_theme_tertiaryContainer">#FFFFFF</color>
<color name="elink_theme_onTertiaryContainer">#000000</color>
<color name="elink_theme_error">#FFB4AB</color>
<color name="elink_theme_onError">#690005</color>
<color name="elink_theme_errorContainer">#93000A</color>
<color name="elink_theme_onErrorContainer">#FFDAD6</color>
<color name="elink_theme_background">#000000</color>
<color name="elink_theme_onBackground">#FFFFFF</color>
<color name="elink_theme_surface">#000000</color>
<color name="elink_theme_onSurface">#FFFFFF</color>
<color name="elink_theme_surfaceVariant">#444846</color>
<color name="elink_theme_onSurfaceVariant">#C4C7C5</color>
<color name="elink_theme_outline">#8E918F</color>
<color name="elink_theme_outlineVariant">#444846</color>
<color name="elink_theme_scrim">#000000</color>
<color name="elink_theme_inverseSurface">#E5E2E1</color>
<color name="elink_theme_inverseOnSurface">#313030</color>
<color name="elink_theme_inversePrimary">#5D5F5F</color>
<color name="elink_theme_primaryFixed">#E2E2E2</color>
<color name="elink_theme_onPrimaryFixed">#1A1C1C</color>
<color name="elink_theme_primaryFixedDim">#C6C6C7</color>
<color name="elink_theme_onPrimaryFixedVariant">#454747</color>
<color name="elink_theme_secondaryFixed">#E2E2E2</color>
<color name="elink_theme_onSecondaryFixed">#1B1B1B</color>
<color name="elink_theme_secondaryFixedDim">#C6C6C6</color>
<color name="elink_theme_onSecondaryFixedVariant">#474747</color>
<color name="elink_theme_tertiaryFixed">#E2E2E2</color>
<color name="elink_theme_onTertiaryFixed">#1B1B1B</color>
<color name="elink_theme_tertiaryFixedDim">#C6C6C6</color>
<color name="elink_theme_onTertiaryFixedVariant">#474747</color>
<color name="elink_theme_surfaceDim">#141313</color>
<color name="elink_theme_surfaceBright">#3A3939</color>
<color name="elink_theme_surfaceContainerLowest">#0E0E0E</color>
<color name="elink_theme_surfaceContainerLow">#1C1B1B</color>
<color name="elink_theme_surfaceContainer">#201F1F</color>
<color name="elink_theme_surfaceContainerHigh">#2A2A2A</color>
<color name="elink_theme_surfaceContainerHighest">#353434</color>
<color name="disabled">@color/md_dark_disabled</color>
+1
View File
@@ -130,6 +130,7 @@
<item>草野</item>
<item>柠檬</item>
<item>黑白</item>
<item>电子书</item>
<item>晴空</item>
<item>八月</item>
<item>新浪潮</item>
+1
View File
@@ -41,6 +41,7 @@
<item>10</item>
<item>11</item>
<item>12</item>
<item>13</item>
</string-array>
<string-array name="screen_direction_value">
+1
View File
@@ -59,6 +59,7 @@
<item>Grassland</item>
<item>Lemon</item>
<item>Black &amp; White</item>
<item>Elink</item>
<item>Clear Sky</item>
<item>August</item>
<item>New Wave</item>
+49
View File
@@ -537,6 +537,55 @@
<color name="transparent_theme_surfaceContainerHigh">#4DFFFFFF</color>
<color name="transparent_theme_surfaceContainerHighest">#66FFFFFF</color>
<color name="elink_theme_primary">#000000</color>
<color name="elink_theme_onPrimary">#FFFFFF</color>
<color name="elink_theme_primaryContainer">#000000</color>
<color name="elink_theme_onPrimaryContainer">#FFFFFF</color>
<color name="elink_theme_secondary">#000000</color>
<color name="elink_theme_onSecondary">#FFFFFF</color>
<color name="elink_theme_secondaryContainer">#808080</color>
<color name="elink_theme_onSecondaryContainer">#FFFFFF</color>
<color name="elink_theme_tertiary">#000000</color>
<color name="elink_theme_onTertiary">#FFFFFF</color>
<color name="elink_theme_tertiaryContainer">#000000</color>
<color name="elink_theme_onTertiaryContainer">#FFFFFF</color>
<color name="elink_theme_error">#BA1A1A</color>
<color name="elink_theme_onError">#FFFFFF</color>
<color name="elink_theme_errorContainer">#FFDAD6</color>
<color name="elink_theme_onErrorContainer">#93000A</color>
<color name="elink_theme_background">#FFFFFF</color>
<color name="elink_theme_onBackground">#000000</color>
<color name="elink_theme_surface">#FFFFFF</color>
<color name="elink_theme_onSurface">#000000</color>
<color name="elink_theme_surfaceVariant">#FFFFFF</color>
<color name="elink_theme_onSurfaceVariant">#000000</color>
<color name="elink_theme_outline">#000000</color>
<color name="elink_theme_outlineVariant">#000000</color>
<color name="elink_theme_scrim">#000000</color>
<color name="elink_theme_inverseSurface">#313030</color>
<color name="elink_theme_inverseOnSurface">#F4F0EF</color>
<color name="elink_theme_inversePrimary">#C6C6C7</color>
<color name="elink_theme_primaryFixed">#E2E2E2</color>
<color name="elink_theme_onPrimaryFixed">#1A1C1C</color>
<color name="elink_theme_primaryFixedDim">#C6C6C7</color>
<color name="elink_theme_onPrimaryFixedVariant">#454747</color>
<color name="elink_theme_secondaryFixed">#E2E2E2</color>
<color name="elink_theme_onSecondaryFixed">#1B1B1B</color>
<color name="elink_theme_secondaryFixedDim">#C6C6C6</color>
<color name="elink_theme_onSecondaryFixedVariant">#474747</color>
<color name="elink_theme_tertiaryFixed">#E2E2E2</color>
<color name="elink_theme_onTertiaryFixed">#1B1B1B</color>
<color name="elink_theme_tertiaryFixedDim">#C6C6C6</color>
<color name="elink_theme_onTertiaryFixedVariant">#474747</color>
<color name="elink_theme_surfaceDim">#DDD9D9</color>
<color name="elink_theme_surfaceBright">#FCF8F8</color>
<color name="elink_theme_surfaceContainerLowest">#FFFFFF</color>
<color name="elink_theme_surfaceContainerLow">#F6F3F2</color>
<color name="elink_theme_surfaceContainer">#F1EDEC</color>
<color name="elink_theme_surfaceContainerHigh">#EBE7E7</color>
<color name="elink_theme_surfaceContainerHighest">#E5E2E1</color>
<color name="disabled">@color/md_light_disabled</color>
<color name="divider">#66666666</color>
+49
View File
@@ -610,4 +610,53 @@
<item name="colorSurfaceContainer">@color/transparent_theme_surfaceContainer</item>
</style>
<style name="Theme.Base.Elink" parent="Base.AppTheme">
<item name="colorPrimary">@color/elink_theme_primary</item>
<item name="colorOnPrimary">@color/elink_theme_onPrimary</item>
<item name="colorPrimaryContainer">@color/elink_theme_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/elink_theme_onPrimaryContainer</item>
<item name="colorSecondary">@color/elink_theme_secondary</item>
<item name="colorOnSecondary">@color/elink_theme_onSecondary</item>
<item name="colorSecondaryContainer">@color/elink_theme_secondaryContainer</item>
<item name="colorOnSecondaryContainer">@color/elink_theme_onSecondaryContainer</item>
<item name="colorTertiary">@color/elink_theme_tertiary</item>
<item name="colorOnTertiary">@color/elink_theme_onTertiary</item>
<item name="colorTertiaryContainer">@color/elink_theme_tertiaryContainer</item>
<item name="colorOnTertiaryContainer">@color/elink_theme_onTertiaryContainer</item>
<item name="colorError">@color/elink_theme_error</item>
<item name="colorOnError">@color/elink_theme_onError</item>
<item name="colorErrorContainer">@color/elink_theme_errorContainer</item>
<item name="colorOnErrorContainer">@color/elink_theme_onErrorContainer</item>
<item name="android:colorBackground">@color/elink_theme_background</item>
<item name="colorOnBackground">@color/elink_theme_onBackground</item>
<item name="colorSurface">@color/elink_theme_surface</item>
<item name="colorOnSurface">@color/elink_theme_onSurface</item>
<item name="colorSurfaceVariant">@color/elink_theme_surfaceVariant</item>
<item name="colorOnSurfaceVariant">@color/elink_theme_onSurfaceVariant</item>
<item name="colorOutline">@color/elink_theme_outline</item>
<item name="colorOutlineVariant">@color/elink_theme_outlineVariant</item>
<item name="colorSurfaceInverse">@color/elink_theme_inverseSurface</item>
<item name="colorOnSurfaceInverse">@color/elink_theme_inverseOnSurface</item>
<item name="colorPrimaryInverse">@color/elink_theme_inversePrimary</item>
<item name="colorPrimaryFixed">@color/elink_theme_primaryFixed</item>
<item name="colorOnPrimaryFixed">@color/elink_theme_onPrimaryFixed</item>
<item name="colorPrimaryFixedDim">@color/elink_theme_primaryFixedDim</item>
<item name="colorOnPrimaryFixedVariant">@color/elink_theme_onPrimaryFixedVariant</item>
<item name="colorSecondaryFixed">@color/elink_theme_secondaryFixed</item>
<item name="colorOnSecondaryFixed">@color/elink_theme_onSecondaryFixed</item>
<item name="colorSecondaryFixedDim">@color/elink_theme_secondaryFixedDim</item>
<item name="colorOnSecondaryFixedVariant">@color/elink_theme_onSecondaryFixedVariant</item>
<item name="colorTertiaryFixed">@color/elink_theme_tertiaryFixed</item>
<item name="colorOnTertiaryFixed">@color/elink_theme_onTertiaryFixed</item>
<item name="colorTertiaryFixedDim">@color/elink_theme_tertiaryFixedDim</item>
<item name="colorOnTertiaryFixedVariant">@color/elink_theme_onTertiaryFixedVariant</item>
<item name="colorSurfaceDim">@color/elink_theme_surfaceDim</item>
<item name="colorSurfaceBright">@color/elink_theme_surfaceBright</item>
<item name="colorSurfaceContainerLowest">@color/elink_theme_surfaceContainerLowest</item>
<item name="colorSurfaceContainerLow">@color/elink_theme_surfaceContainerLow</item>
<item name="colorSurfaceContainer">@color/elink_theme_surfaceContainer</item>
<item name="colorSurfaceContainerHigh">@color/elink_theme_surfaceContainerHigh</item>
<item name="colorSurfaceContainerHighest">@color/elink_theme_surfaceContainerHighest</item>
</style>
</resources>