增加亮度和图片滤镜 (#4813)

* 增加亮度和图片滤镜

* ...

* ...

* ...
This commit is contained in:
lhjgege
2025-03-13 11:42:06 +08:00
committed by GitHub
parent 7024aff6e5
commit 2852c1f182
18 changed files with 336 additions and 2 deletions
@@ -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"
@@ -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)
}
}
@@ -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)
}
}
@@ -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<ActivityMangaBinding, ReadMangaViewMode
AppConfig.mangaAutoPageSpeed
}
private val mMangaColorFilter: MangaColorFilterConfig by lazy {
GSON.fromJsonObject<MangaColorFilterConfig>(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<ActivityMangaBinding, ReadMangaViewMode
}
private fun initRecyclerView() {
mAdapter.isHorizontal = AppConfig.enableMangaHorizontalScroll
mAdapter.run {
isHorizontal = AppConfig.enableMangaHorizontalScroll
setMangaImageColorFilter(mMangaColorFilter)
}
binding.mRecyclerManga.run {
adapter = mAdapter
itemAnimator = null
@@ -418,6 +428,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
override fun colorFilter(config: MangaColorFilterConfig) {
mAdapter.setMangaImageColorFilter(config)
mAdapter.notifyItemChanged(ReadManga.durChapterPos)
updateWindowBrightness(config.l)
}
override val oldBook: Book?
get() = ReadManga.book
@@ -527,6 +543,10 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
mAdapter.getCurrentList().size
)
}
R.id.menu_manga_color_filter -> {
MangaColorFilterDialog().show(supportFragmentManager, "MangaColorFilterDialog")
}
}
return super.onCompatOptionsItemSelected(item)
}
@@ -717,4 +737,13 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
return (mLayoutManager.findLastCompletelyVisibleItemPosition() == adapter.itemCount - 1) &&
!canScrollVertically(1)
}
fun updateWindowBrightness(brightness: Int) {
val layoutParams = window.attributes
val normalizedBrightness = brightness.toFloat() / 255.0f
layoutParams.screenBrightness = normalizedBrightness.coerceIn(0f, 1f)
window.attributes = layoutParams
// 强制刷新屏幕
window.decorView.postInvalidate()
}
}
@@ -0,0 +1,14 @@
package io.legado.app.ui.book.manga.config
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class MangaColorFilterConfig(
var r: Int = 0,
var g: Int = 0,
var b: Int = 0,
var a: Int = 0,
var l: Int = 0
) :
Parcelable
@@ -0,0 +1,127 @@
package io.legado.app.ui.book.manga.config
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.SeekBar
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogMangaColorFilterBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.model.ReadManga
import io.legado.app.utils.GSON
import io.legado.app.utils.fromJsonObject
import io.legado.app.utils.setLayout
import io.legado.app.utils.viewbindingdelegate.viewBinding
class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_filter) {
private val binding by viewBinding(DialogMangaColorFilterBinding::bind)
private val mConfig =
GSON.fromJsonObject<MangaColorFilterConfig>(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)
}
}
@@ -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<RecyclerView.ViewHolder>(), PreloadModelProvider<Any> {
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
}
}