From 0403a34c6fac1ae57565dfd7320b48770ae31d60 Mon Sep 17 00:00:00 2001 From: lhjgege <1079947827@qq.com> Date: Thu, 13 Mar 2025 11:42:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=AE=E5=BA=A6=E5=92=8C?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=BB=A4=E9=95=9C=20(#4813)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加亮度和图片滤镜 * ... * ... * ... --- .../java/io/legado/app/constant/PreferKey.kt | 1 + .../io/legado/app/help/config/AppConfig.kt | 6 + .../java/io/legado/app/model/ReadManga.kt | 2 + .../app/ui/book/manga/ReadMangaActivity.kt | 31 ++++- .../manga/config/MangaColorFilterConfig.kt | 14 ++ .../manga/config/MangaColorFilterDialog.kt | 127 ++++++++++++++++++ .../book/manga/recyclerview/MangaAdapter.kt | 24 ++++ .../res/layout/dialog_manga_color_filter.xml | 116 ++++++++++++++++ app/src/main/res/layout/view_manga_menu.xml | 3 +- app/src/main/res/menu/book_manga.xml | 6 + app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 18 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/config/MangaColorFilterConfig.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/config/MangaColorFilterDialog.kt create mode 100644 app/src/main/res/layout/dialog_manga_color_filter.xml 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 888151880..4af17ea13 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -100,6 +100,7 @@ object PreferKey { const val mangaFooterConfig = "mangaFooterConfig" const val disableClickScroll = "disableClickScroll" const val enableMangaHorizontalScroll = "enableMangaHorizontalScroll" + const val mangaColorFilter = "mangaColorFilter" const val autoRefresh = "auto_refresh" const val defaultToRead = "defaultToRead" const val exportCharset = "exportCharset" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index b362313fe..b56781e72 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -650,5 +650,11 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { set(value) { appCtx.putPrefBoolean(PreferKey.enableMangaHorizontalScroll, value) } + + var mangaColorFilter + get() = appCtx.getPrefString(PreferKey.mangaColorFilter, "") + set(value) { + appCtx.putPrefString(PreferKey.mangaColorFilter, value) + } } diff --git a/app/src/main/java/io/legado/app/model/ReadManga.kt b/app/src/main/java/io/legado/app/model/ReadManga.kt index 3c24e5e0b..50b3c5486 100644 --- a/app/src/main/java/io/legado/app/model/ReadManga.kt +++ b/app/src/main/java/io/legado/app/model/ReadManga.kt @@ -21,6 +21,7 @@ import io.legado.app.help.config.AppConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.globalExecutor import io.legado.app.model.webBook.WebBook +import io.legado.app.ui.book.manga.config.MangaColorFilterConfig import io.legado.app.ui.book.manga.entities.MangaChapter import io.legado.app.ui.book.manga.entities.MangaContent import io.legado.app.ui.book.manga.entities.MangaContentData @@ -597,5 +598,6 @@ object ReadManga : CoroutineScope by MainScope() { fun loadFail(msg: String) fun sureNewProgress(progress: BookProgress) fun showLoading() + fun colorFilter(config: MangaColorFilterConfig) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt index 51749c69f..753625439 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt @@ -42,6 +42,8 @@ import io.legado.app.model.ReadManga import io.legado.app.receiver.NetworkChangedListener import io.legado.app.ui.book.changesource.ChangeBookSourceDialog import io.legado.app.ui.book.info.BookInfoActivity +import io.legado.app.ui.book.manga.config.MangaColorFilterConfig +import io.legado.app.ui.book.manga.config.MangaColorFilterDialog import io.legado.app.ui.book.manga.config.MangaFooterConfig import io.legado.app.ui.book.manga.config.MangaFooterSettingDialog import io.legado.app.ui.book.manga.entities.MangaContent @@ -97,6 +99,11 @@ class ReadMangaActivity : VMBaseActivity(AppConfig.mangaColorFilter).getOrNull() + ?: MangaColorFilterConfig() + } + private var mMangaAutoPageSpeed = mInitMangaAutoPageSpeed private lateinit var mMangaFooterConfig: MangaFooterConfig private val mLabelBuilder by lazy { StringBuilder() } @@ -190,7 +197,10 @@ class ReadMangaActivity : VMBaseActivity { + MangaColorFilterDialog().show(supportFragmentManager, "MangaColorFilterDialog") + } } return super.onCompatOptionsItemSelected(item) } @@ -717,4 +737,13 @@ class ReadMangaActivity : VMBaseActivity(AppConfig.mangaColorFilter).getOrNull() + ?: MangaColorFilterConfig() + + override fun onStart() { + super.onStart() + setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + binding.seekA.progress = mConfig.a + binding.seekBrightness.progress = mConfig.l + binding.seekB.progress = mConfig.b + binding.seekG.progress = mConfig.g + binding.seekR.progress = mConfig.r + binding.seekBrightness.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged( + seekBar: SeekBar?, + progress: Int, + fromUser: Boolean + ) { + mConfig.l = progress + ReadManga.mCallback?.colorFilter(mConfig) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + } + + }) + binding.seekR.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged( + seekBar: SeekBar?, + progress: Int, + fromUser: Boolean + ) { + mConfig.r = progress + ReadManga.mCallback?.colorFilter(mConfig) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + } + + }) + binding.seekG.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged( + seekBar: SeekBar?, + progress: Int, + fromUser: Boolean + ) { + mConfig.g = progress + ReadManga.mCallback?.colorFilter(mConfig) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + } + + }) + binding.seekB.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged( + seekBar: SeekBar?, + progress: Int, + fromUser: Boolean + ) { + mConfig.b = progress + ReadManga.mCallback?.colorFilter(mConfig) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + } + + }) + binding.seekA.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged( + seekBar: SeekBar?, + progress: Int, + fromUser: Boolean + ) { + mConfig.a = progress + ReadManga.mCallback?.colorFilter(mConfig) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + } + + }) + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + AppConfig.mangaColorFilter = GSON.toJson(mConfig) + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/MangaAdapter.kt b/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/MangaAdapter.kt index 167648a60..59f4946bc 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/MangaAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/MangaAdapter.kt @@ -1,6 +1,8 @@ package io.legado.app.ui.book.manga.recyclerview import android.content.Context +import android.graphics.ColorMatrix +import android.graphics.ColorMatrixColorFilter import android.util.SparseArray import android.view.LayoutInflater import android.view.ViewGroup @@ -22,6 +24,7 @@ import io.legado.app.databinding.BookComicRvBinding import io.legado.app.help.glide.progress.ProgressManager import io.legado.app.model.BookCover import io.legado.app.model.ReadManga +import io.legado.app.ui.book.manga.config.MangaColorFilterConfig import io.legado.app.ui.book.manga.entities.MangaContent import io.legado.app.ui.book.manga.entities.ReaderLoading import io.legado.app.utils.getCompatDrawable @@ -32,6 +35,7 @@ class MangaAdapter(private val context: Context) : RecyclerView.Adapter(), PreloadModelProvider { private val inflater: LayoutInflater = LayoutInflater.from(context) + private lateinit var mConfig: MangaColorFilterConfig companion object { private const val LOADING_VIEW = 0 @@ -95,8 +99,24 @@ class MangaAdapter(private val context: Context) : } fun onBind(item: MangaContent) { + setImageColorFilter() loadImageWithRetry(item.mImageUrl, isHorizontal, item.imageCount == 1) } + + fun setImageColorFilter() { + binding.image.run { + require(mConfig.r in 0..255 && mConfig.g in 0..255 && mConfig.b in 0..255 && mConfig.a in 0..255) { + "ARGB values must be between 0-255" + } + val matrix = floatArrayOf( + (255 - mConfig.r) / 255f, 0f, 0f, 0f, 0f, + 0f, (255 - mConfig.g) / 255f, 0f, 0f, 0f, + 0f, 0f, (255 - mConfig.b) / 255f, 0f, 0f, + 0f, 0f, 0f, (255 - mConfig.a) / 255f, 0f + ) + colorFilter = ColorMatrixColorFilter(ColorMatrix(matrix)) + } + } } inner class PageMoreViewHolder(val binding: BookComicLoadingRvBinding) : @@ -209,4 +229,8 @@ class MangaAdapter(private val context: Context) : } return null } + + fun setMangaImageColorFilter(config: MangaColorFilterConfig) { + mConfig = config + } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_manga_color_filter.xml b/app/src/main/res/layout/dialog_manga_color_filter.xml new file mode 100644 index 000000000..29f80d326 --- /dev/null +++ b/app/src/main/res/layout/dialog_manga_color_filter.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/view_manga_menu.xml b/app/src/main/res/layout/view_manga_menu.xml index de306c293..441a8727c 100644 --- a/app/src/main/res/layout/view_manga_menu.xml +++ b/app/src/main/res/layout/view_manga_menu.xml @@ -19,7 +19,8 @@ android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:theme="?attr/actionBarStyle"> + android:theme="?attr/actionBarStyle" + app:layout_constraintTop_toTopOf="parent"> + + + diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 8b2139939..50238b446 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1205,4 +1205,5 @@ 靠左 居中 水平滚动 + 滤镜 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 720e6b7ed..98b11d4a5 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1208,4 +1208,5 @@ 靠左 居中 水平滚动 + 滤镜 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6921c05ce..69bd2ea57 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1208,4 +1208,5 @@ 靠左 居中 水平滚动 + 滤镜 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 3434bd12f..7c231234f 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1204,4 +1204,5 @@ Còn 靠左 居中 水平滚动 + 滤镜 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 4e09ca8be..0ff7171c5 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1205,4 +1205,5 @@ 靠左 居中 水平滚动 + 滤镜 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 22e85ba9f..c400b1010 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1207,4 +1207,5 @@ 靠左 居中 水平滚动 + 滤镜 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4e58ba49d..ebb819ad0 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1207,4 +1207,5 @@ 靠左 居中 水平滚动 + 滤镜 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index af5c7ef1b..47794290b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1208,4 +1208,5 @@ 靠左 居中 水平滚动 + 滤镜