From e146bfcd97527093ba9d84d7188a121542dd4dea Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Thu, 11 Dec 2025 00:47:30 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BF=AE=E5=A4=8D]=20=E4=B9=A6=E7=B1=8D?= =?UTF-8?q?=E5=B0=81=E9=9D=A2=E4=BD=9C=E8=80=85=E6=98=BE=E7=A4=BA=E4=B8=8D?= =?UTF-8?q?=E8=B6=B3=20[=E6=96=B0=E5=A2=9E]=20=E4=B9=A6=E7=B1=8D=E5=B0=81?= =?UTF-8?q?=E9=9D=A2=E5=AD=97=E4=BD=93=E9=A2=9C=E8=89=B2=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E3=80=81=E6=8F=8F=E8=BE=B9=E9=80=89=E6=8B=A9=E5=BC=80?= =?UTF-8?q?=E5=85=B3=E3=80=81=E9=98=B4=E5=BD=B1=E9=A2=9C=E8=89=B2=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E4=B8=8E=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../java/io/legado/app/constant/PreferKey.kt | 7 ++ .../java/io/legado/app/model/BookCover.kt | 37 ++++++++- .../app/ui/config/CoverConfigFragment.kt | 7 ++ .../app/ui/widget/image/CoverImageView.kt | 83 +++++++++++++------ app/src/main/res/values-zh/strings.xml | 3 + app/src/main/res/values/colors.xml | 1 - app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/pref_config_cover.xml | 51 ++++++++++++ 9 files changed, 163 insertions(+), 31 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6ab639629..0b28f1a3e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,7 +124,7 @@ android { } manifestPlaceholders.put("app_name", "@string/app_name") - //applicationIdSuffix '.debug' + applicationIdSuffix '.debug' versionNameSuffix "_debug+${getGitCommitHash()}" minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro', 'cronet-proguard-rules.pro' diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index fc0928144..3296e499b 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -13,6 +13,13 @@ object PreferKey { const val loadCoverOnlyWifi = "loadCoverOnlyWifi" const val coverShowName = "coverShowName" const val coverShowAuthor = "coverShowAuthor" + const val coverShowShadow = "coverShowShadow" + const val coverShowStroke = "coverShowStroke" + const val coverTextColor = "coverTextColor" + const val coverTextColorN = "coverTextColorN" + const val coverShadowColor = "coverShadowColor" + const val coverShadowColorN = "coverShadowColorN" + const val coverDefaultColor = "coverDefaultColor" const val coverShowNameN = "coverShowNameN" const val coverShowAuthorN = "coverShowAuthorN" const val remoteServerId = "remoteServerId" diff --git a/app/src/main/java/io/legado/app/model/BookCover.kt b/app/src/main/java/io/legado/app/model/BookCover.kt index 51d255508..71f9e7114 100644 --- a/app/src/main/java/io/legado/app/model/BookCover.kt +++ b/app/src/main/java/io/legado/app/model/BookCover.kt @@ -3,6 +3,7 @@ package io.legado.app.model import android.annotation.SuppressLint import android.content.Context import android.graphics.Bitmap +import android.graphics.Color import android.graphics.drawable.Drawable import androidx.annotation.Keep import androidx.core.graphics.drawable.toDrawable @@ -35,10 +36,11 @@ import io.legado.app.utils.BitmapUtils import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import io.legado.app.utils.getPrefBoolean +import io.legado.app.utils.getPrefInt import io.legado.app.utils.getPrefString +import kotlinx.coroutines.currentCoroutineContext import splitties.init.appCtx import java.io.File -import kotlin.coroutines.coroutineContext @Keep object BookCover { @@ -48,6 +50,20 @@ object BookCover { private set var drawBookAuthor = true private set + var drawBookShadow = true + private set + var drawBookStroke = true + private set + var coverTextColor: Int = Color.WHITE + private set + var coverShadowColor: Int = Color.WHITE + private set + var coverTextColorN: Int = Color.WHITE + private set + var coverShadowColorN: Int = Color.WHITE + private set + var coverDefaultColor = true + private set lateinit var defaultDrawable: Drawable private set @@ -69,6 +85,21 @@ object BookCover { } else { appCtx.getPrefBoolean(PreferKey.coverShowAuthor, true) } + drawBookShadow = + appCtx.getPrefBoolean(PreferKey.coverShowShadow, false) + drawBookStroke = + appCtx.getPrefBoolean(PreferKey.coverShowStroke, true) + coverDefaultColor = + appCtx.getPrefBoolean(PreferKey.coverDefaultColor, true) + coverTextColor = + appCtx.getPrefInt(PreferKey.coverTextColor, Color.WHITE) + coverTextColorN = + appCtx.getPrefInt(PreferKey.coverTextColorN, Color.BLACK) + coverShadowColor = + appCtx.getPrefInt(PreferKey.coverShadowColor, Color.WHITE) + coverShadowColorN = + appCtx.getPrefInt(PreferKey.coverShadowColorN, Color.BLACK) + val key = if (isNightTheme) PreferKey.defaultCoverDark else PreferKey.defaultCover val path = appCtx.getPrefString(key) if (path.isNullOrBlank()) { @@ -222,12 +253,12 @@ object BookCover { config.searchUrl, book.name, source = config, - coroutineContext = coroutineContext, + coroutineContext = currentCoroutineContext(), hasLoginHeader = false ) val res = analyzeUrl.getStrResponseAwait() val analyzeRule = AnalyzeRule(book) - analyzeRule.setCoroutineContext(coroutineContext) + analyzeRule.setCoroutineContext(currentCoroutineContext()) analyzeRule.setContent(res.body) analyzeRule.setRedirectUrl(res.url) return analyzeRule.getString(config.coverRule, isUrl = true) diff --git a/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt index 04c7b8e46..97f2eec62 100644 --- a/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt @@ -74,6 +74,13 @@ class CoverConfigFragment : PreferenceFragment(), ?.isEnabled = getPrefBoolean(key) BookCover.upDefaultCover() } + PreferKey.coverTextColor, + PreferKey.coverTextColorN, + PreferKey.coverShadowColor, + PreferKey.coverShadowColorN, + PreferKey.coverDefaultColor, + PreferKey.coverShowShadow, + PreferKey.coverShowStroke, PreferKey.coverShowAuthor, PreferKey.coverShowAuthorN -> { BookCover.upDefaultCover() diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 06897489a..bf43c5e6d 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -22,7 +22,6 @@ import io.legado.app.constant.AppPattern import io.legado.app.help.config.AppConfig import io.legado.app.help.glide.ImageLoader import io.legado.app.help.glide.OkHttpModelLoader -//import io.legado.app.lib.theme.accentColor import io.legado.app.model.BookCover import io.legado.app.utils.spToPx import io.legado.app.utils.textHeight @@ -47,6 +46,9 @@ class CoverImageView @JvmOverloads constructor( private var author: String? = null private var nameHeight = 0f private var authorHeight = 0f + private val isNightTheme = AppConfig.isNightTheme + val colorKey = if (isNightTheme) BookCover.coverTextColorN else BookCover.coverTextColor + val shadowKey = if (isNightTheme) BookCover.coverShadowColorN else BookCover.coverShadowColor private val namePaint by lazy { val textPaint = TextPaint() textPaint.typeface = Typeface.DEFAULT_BOLD @@ -119,21 +121,35 @@ class CoverImageView @JvmOverloads constructor( } private fun drawNameAuthor(canvas: Canvas) { + var startX = width * 0.2f + var startY = viewHeight * 0.2f if (BookCover.drawBookName) { - var startX = width * 0.2f - var startY = viewHeight * 0.2f - name?.toStringArray()?.let { nameChars -> val textSize = viewWidth / 8 namePaint.textSize = textSize namePaint.strokeWidth = textSize / 8 - nameChars.forEach { char -> - namePaint.color = Color.WHITE - namePaint.style = Paint.Style.STROKE - canvas.drawText(char, startX, startY, namePaint) + if (BookCover.drawBookShadow) { + namePaint.setShadowLayer( + 4f, + 0f, + 0f, + shadowKey + ) + } else { + namePaint.clearShadowLayer() + } - namePaint.color = context.themeColor(androidx.appcompat.R.attr.colorPrimary) + nameChars.forEach { char -> + if (BookCover.drawBookStroke) { + namePaint.color = Color.WHITE + namePaint.style = Paint.Style.STROKE + canvas.drawText(char, startX, startY, namePaint) + } + if (BookCover.coverDefaultColor) + namePaint.color = context.themeColor(com.google.android.material.R.attr.colorSecondary) + else + namePaint.color = colorKey namePaint.style = Paint.Style.FILL canvas.drawText(char, startX, startY, namePaint) @@ -144,33 +160,48 @@ class CoverImageView @JvmOverloads constructor( startY = viewHeight * 0.2f } } + namePaint.clearShadowLayer() } } if (BookCover.drawBookAuthor) { - author?.toStringArray()?.let { authorChars -> - val textSize = viewWidth / 10 - authorPaint.textSize = textSize - authorPaint.strokeWidth = textSize / 5 + author?.toStringArray()?.let { author -> + authorPaint.textSize = viewWidth / 10 + authorPaint.strokeWidth = authorPaint.textSize / 5 + startX = width * 0.8f + startY = viewHeight * 0.95f - author.size * authorPaint.textHeight + startY = maxOf(startY, viewHeight * 0.2f) + if (BookCover.drawBookShadow) { + authorPaint.setShadowLayer( + 4f, + 0f, + 0f, + shadowKey + ) + } else { + authorPaint.clearShadowLayer() + } - var startX = width * 0.8f - var startY = viewHeight * 0.8f - - authorChars.forEach { char -> - - authorPaint.color = Color.WHITE - authorPaint.style = Paint.Style.STROKE - canvas.drawText(char, startX, startY, authorPaint) - - authorPaint.color = - context.themeColor(com.google.android.material.R.attr.colorSecondary) + author.forEach { + if (BookCover.drawBookStroke) { + authorPaint.color = Color.WHITE + authorPaint.style = Paint.Style.STROKE + canvas.drawText(it, startX, startY, authorPaint) + } + if (BookCover.coverDefaultColor) + authorPaint.color = context.themeColor(com.google.android.material.R.attr.colorSecondary) + else + authorPaint.color = colorKey authorPaint.style = Paint.Style.FILL - canvas.drawText(char, startX, startY, authorPaint) + canvas.drawText(it, startX, startY, authorPaint) startY += authorPaint.textHeight - if (startY > viewHeight * 0.95f) return@let + if (startY > viewHeight * 0.95) { + return@let + } } + authorPaint.clearShadowLayer() } } } diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index dcc7bd2d3..2b22a2309 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1356,4 +1356,7 @@ 已读 漫画 小说 + 显示字体阴影 + 显示字体描边 + 使用默认字体颜色 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0b337d455..1a604ad0e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -589,7 +589,6 @@ @color/md_light_disabled #66666666 - #FF578FCC #eb4333 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe4893b02..db6cab588 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1359,4 +1359,7 @@ 已读 漫画 小说 + 显示字体阴影 + 显示字体描边 + 使用默认字体颜色 diff --git a/app/src/main/res/xml/pref_config_cover.xml b/app/src/main/res/xml/pref_config_cover.xml index 1d8db29ed..be769d9c9 100644 --- a/app/src/main/res/xml/pref_config_cover.xml +++ b/app/src/main/res/xml/pref_config_cover.xml @@ -25,6 +25,29 @@ app:allowDividerBelow="false" app:iconSpaceReserved="false" /> + + + + + + + + + + + + + +