更新界面

This commit is contained in:
HapeLee
2025-07-14 02:23:23 +08:00
parent 06dd2ac2c1
commit c35177715c
21 changed files with 745 additions and 469 deletions
@@ -76,7 +76,7 @@ object BookCover {
return
}
defaultDrawable = kotlin.runCatching {
BitmapUtils.decodeBitmap(path, 600, 900).toDrawable(appCtx.resources)
BitmapUtils.decodeBitmap(path, 600, 900)!!.toDrawable(appCtx.resources)
}.getOrDefault(appCtx.resources.getDrawable(R.drawable.image_cover_default, null))
}
@@ -158,6 +158,7 @@ object BookCover {
}
it
}
.transition(DrawableTransitionOptions.withCrossFade())
}
fun preloadManga(
@@ -43,7 +43,6 @@ import io.legato.kazusa.ui.book.changesource.ChangeBookSourceDialog
import io.legato.kazusa.ui.book.info.BookInfoActivity
import io.legato.kazusa.ui.book.manga.config.MangaColorFilterConfig
import io.legato.kazusa.ui.book.manga.config.MangaColorFilterDialog
import io.legato.kazusa.ui.book.manga.config.MangaEpaperDialog
import io.legato.kazusa.ui.book.manga.config.MangaFooterConfig
import io.legato.kazusa.ui.book.manga.config.MangaFooterSettingDialog
import io.legato.kazusa.ui.book.manga.entities.BaseMangaPage
@@ -78,7 +77,7 @@ import kotlin.math.ceil
class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewModel>(),
ReadManga.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack,
MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaEpaperDialog.Callback {
MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaFooterSettingDialog.Callback {
private val mLayoutManager by lazy {
MangaLayoutManager(this)
@@ -253,7 +252,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun upContent() {
lifecycleScope.launch {
setTitle(ReadManga.book?.name)
binding.mangaMenu.upBookView()
val data = withContext(IO) { ReadManga.mangaContents }
val pos = data.pos
val list = data.items
@@ -450,7 +449,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun updateColorFilter(config: MangaColorFilterConfig) {
mAdapter.setMangaImageColorFilter(config)
updateWindowBrightness(config.l)
if (config.autoBrightness) {
resetWindowToSystemBrightness()
} else {
updateWindowBrightness(config.l)
}
}
@SuppressLint("StringFormatMatches")
@@ -473,12 +476,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
R.id.menu_catalog -> {
ReadManga.book?.let {
tocActivity.launch(it.bookUrl)
}
}
R.id.menu_refresh -> {
binding.flLoading.isVisible = true
ReadManga.book?.let {
@@ -510,35 +507,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
setDisableClickScroll(item.isChecked)
}
R.id.menu_enable_auto_page -> {
item.isChecked = !item.isChecked
val menuMangaAutoPageSpeed = mMenu?.findItem(R.id.menu_manga_auto_page_speed)
mScrollTimer.isEnabledPage = item.isChecked
menuMangaAutoPageSpeed?.isVisible = item.isChecked
enableAutoScrollPage = item.isChecked
enableAutoScroll = false
mScrollTimer.isEnabled = false
mMenu?.findItem(R.id.menu_enable_auto_scroll)?.isChecked = false
}
R.id.menu_manga_auto_page_speed -> {
showNumberPickerDialog(
1, getString(R.string.setting_manga_auto_page_speed),
AppConfig.mangaAutoPageSpeed
) {
AppConfig.mangaAutoPageSpeed = it
item.title = getString(R.string.manga_auto_page_speed, it)
mScrollTimer.setSpeed(it)
if (enableAutoScrollPage) {
mScrollTimer.isEnabledPage = true
}
}
}
R.id.menu_manga_footer_config -> {
showDialogFragment(MangaFooterSettingDialog())
}
R.id.menu_enable_horizontal_scroll -> {
item.isChecked = !item.isChecked
AppConfig.enableMangaHorizontalScroll = item.isChecked
@@ -555,11 +523,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
R.id.menu_enable_auto_scroll -> {
item.isChecked = !item.isChecked
mScrollTimer.isEnabled = item.isChecked
mMenu?.findItem(R.id.menu_enable_auto_page)?.isChecked = false
enableAutoScroll = item.isChecked
enableAutoScrollPage = false
mScrollTimer.isEnabledPage = false
mMenu?.findItem(R.id.menu_manga_auto_page_speed)?.isVisible = item.isChecked
if (enableAutoScroll) {
mPagerSnapHelper.attachToRecyclerView(null)
} else if (AppConfig.enableMangaHorizontalScroll) {
@@ -573,18 +541,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
ReadManga.loadContent()
}
R.id.menu_epaper_manga -> {
item.isChecked = !item.isChecked
AppConfig.enableMangaEInk = item.isChecked
mMenu?.findItem(R.id.menu_gray_manga)?.isChecked = false
AppConfig.enableMangaGray = false
mMenu?.findItem(R.id.menu_epaper_manga_setting)?.isVisible = item.isChecked
mAdapter.enableMangaEInk(item.isChecked, AppConfig.mangaEInkThreshold)
}
R.id.menu_epaper_manga_setting -> {
showDialogFragment(MangaEpaperDialog())
}
R.id.menu_disable_horizontal_animation -> {
item.isChecked = !item.isChecked
@@ -596,18 +553,44 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
R.id.menu_gray_manga -> {
item.isChecked = !item.isChecked
AppConfig.enableMangaGray = item.isChecked
mMenu?.findItem(R.id.menu_epaper_manga)?.isChecked = false
AppConfig.enableMangaEInk = false
mMenu?.findItem(R.id.menu_epaper_manga_setting)?.isVisible = false
mAdapter.enableGray(item.isChecked)
}
}
return super.onCompatOptionsItemSelected(item)
}
override fun openCatalog() {
ReadManga.book?.let {
tocActivity.launch(it.bookUrl)
}
}
override fun showFooterConfig() {
showDialogFragment(MangaFooterSettingDialog().apply {
initialAutoPageEnabled = enableAutoScrollPage
initialAutoPageSpeed = AppConfig.mangaAutoPageSpeed
callback = this@ReadMangaActivity
})
}
override fun showColorFilterConfig() {
binding.mangaMenu.runMenuOut()
showDialogFragment(MangaColorFilterDialog())
}
override fun updateEpaperMode(enabled: Boolean, threshold: Int) {
AppConfig.enableMangaEInk = enabled
AppConfig.enableMangaGray = false
AppConfig.mangaEInkThreshold = threshold
mAdapter.enableMangaEInk(enabled, threshold)
}
override fun updateGrayMode(enabled: Boolean) {
AppConfig.enableMangaGray = enabled
AppConfig.enableMangaEInk = false
mAdapter.enableGray(enabled)
}
override fun openBookInfoActivity() {
ReadManga.book?.let {
bookInfoActivity.launch {
@@ -617,6 +600,26 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
override fun onAutoPageToggle(enabled: Boolean) {
mScrollTimer.isEnabledPage = enabled
mScrollTimer.isEnabled = false
enableAutoScrollPage = enabled
enableAutoScroll = false
mMenu?.findItem(R.id.menu_enable_auto_scroll)?.isChecked = false
}
override fun onAutoPageSpeedChanged(speed: Int) {
AppConfig.mangaAutoPageSpeed = speed
mScrollTimer.setSpeed(speed)
if (enableAutoScrollPage) {
mScrollTimer.isEnabledPage = true
}
}
override fun upSystemUiVisibility(menuIsVisible: Boolean) {
toggleSystemBar(menuIsVisible)
if (enableAutoScroll) {
@@ -680,19 +683,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum)
menu.findItem(R.id.menu_disable_manga_scale).isChecked = AppConfig.disableMangaScale
menu.findItem(R.id.menu_disable_click_scroll).isChecked = AppConfig.disableClickScroll
menu.findItem(R.id.menu_manga_auto_page_speed).title =
getString(R.string.manga_auto_page_speed, AppConfig.mangaAutoPageSpeed)
menu.findItem(R.id.menu_enable_horizontal_scroll).isChecked =
AppConfig.enableMangaHorizontalScroll
menu.findItem(R.id.menu_hide_manga_title).isChecked = AppConfig.hideMangaTitle
menu.findItem(R.id.menu_epaper_manga).isChecked = AppConfig.enableMangaEInk
menu.findItem(R.id.menu_epaper_manga_setting).isVisible = AppConfig.enableMangaEInk
menu.findItem(R.id.menu_disable_horizontal_animation).run {
isVisible =
AppConfig.enableMangaHorizontalScroll
isChecked = AppConfig.disableHorizontalAnimator
}
menu.findItem(R.id.menu_gray_manga).isChecked = AppConfig.enableMangaGray
}
private fun setDisableMangaScale(disable: Boolean) {
@@ -782,6 +782,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
}
fun resetWindowToSystemBrightness() {
val layoutParams = window.attributes
layoutParams.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
window.attributes = layoutParams
}
fun updateWindowBrightness(brightness: Int) {
val layoutParams = window.attributes
@@ -832,7 +837,5 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
return super.onKeyDown(keyCode, event)
}
override fun updateEepaper(value: Int) {
mAdapter.updateThreshold(value)
}
}
@@ -7,7 +7,8 @@ data class MangaColorFilterConfig(
var g: Int = 0,
var b: Int = 0,
var a: Int = 0,
var l: Int = 0
var l: Int = 0,
var autoBrightness: Boolean = true
) {
fun toJson(): String {
if (r == 0 && g == 0 && b == 0 && a == 0 && l == 0) {
@@ -3,28 +3,32 @@ package io.legato.kazusa.ui.book.manga.config
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.core.view.isVisible
import io.legato.kazusa.R
import io.legato.kazusa.base.BaseDialogFragment
import io.legato.kazusa.base.BaseBottomSheetDialogFragment
import io.legato.kazusa.databinding.DialogMangaColorFilterBinding
import io.legato.kazusa.help.config.AppConfig
import io.legato.kazusa.utils.GSON
import io.legato.kazusa.utils.fromJsonObject
import io.legato.kazusa.utils.setLayout
import io.legato.kazusa.utils.invisible
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
import io.legato.kazusa.utils.visible
class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_filter) {
class MangaColorFilterDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_color_filter) {
private val binding by viewBinding(DialogMangaColorFilterBinding::bind)
private val mConfig =
GSON.fromJsonObject<MangaColorFilterConfig>(AppConfig.mangaColorFilter).getOrNull()
?: MangaColorFilterConfig()
private val callback get() = activity as? Callback
private val callback: Callback? get() = activity as? Callback
private var mMangaEInkThreshold = AppConfig.mangaEInkThreshold
override fun onStart() {
super.onStart()
dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
// setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
@@ -34,6 +38,17 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
private fun initData() {
binding.run {
chipAutoBrightness.isChecked = mConfig.autoBrightness
if (AppConfig.enableMangaEInk) dsbEpaper.visible()
else dsbEpaper.invisible()
dsbEpaper.progress = mMangaEInkThreshold
cpEpaper.isChecked = AppConfig.enableMangaEInk
cpEnableGray.isChecked = AppConfig.enableMangaGray
dsbBrightness.isEnabled = !mConfig.autoBrightness
dsbBrightness.progress = mConfig.l
dsbR.progress = mConfig.r
dsbG.progress = mConfig.g
@@ -44,6 +59,37 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
private fun initView() {
binding.run {
chipAutoBrightness.setOnCheckedChangeListener { _, isChecked ->
mConfig.autoBrightness = isChecked
dsbBrightness.isEnabled = !isChecked
callback?.updateColorFilter(mConfig)
}
cpEpaper.setOnCheckedChangeListener { _, isChecked ->
binding.dsbEpaper.isVisible = isChecked
if (isChecked) {
cpEnableGray.isChecked = false
callback?.updateGrayMode(false)
dsbEpaper.visible()
} else dsbEpaper.invisible()
callback?.updateEpaperMode(isChecked, mMangaEInkThreshold)
}
cpEnableGray.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
binding.dsbEpaper.isVisible = false
cpEpaper.isChecked = false
callback?.updateEpaperMode(false, mMangaEInkThreshold)
}
dsbEpaper.invisible()
callback?.updateGrayMode(isChecked)
}
dsbEpaper.onChanged = {
mMangaEInkThreshold = it
callback?.updateEpaperMode(true, it)
}
dsbBrightness.onChanged = {
mConfig.l = it
callback?.updateColorFilter(mConfig)
@@ -70,10 +116,13 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
AppConfig.mangaColorFilter = mConfig.toJson()
AppConfig.mangaEInkThreshold = mMangaEInkThreshold
}
interface Callback {
fun updateColorFilter(config: MangaColorFilterConfig)
fun updateEpaperMode(enabled: Boolean, threshold: Int)
fun updateGrayMode(enabled: Boolean)
}
}
@@ -1,49 +0,0 @@
package io.legato.kazusa.ui.book.manga.config
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import io.legato.kazusa.R
import io.legato.kazusa.base.BaseBottomSheetDialogFragment
import io.legato.kazusa.databinding.DialogMangaEpaperBinding
import io.legato.kazusa.help.config.AppConfig
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
class MangaEpaperDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_epaper) {
private val binding by viewBinding(DialogMangaEpaperBinding::bind)
private val callback get() = activity as? Callback
private var mMangaEInkThreshold = 150
// override fun onStart() {
// super.onStart()
// dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
// setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
// }
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
initData()
initView()
}
private fun initData() {
binding.dsbEpaper.progress = AppConfig.mangaEInkThreshold
}
private fun initView() {
binding.dsbEpaper.onChanged = {
mMangaEInkThreshold = it
callback?.updateEepaper(it)
}
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
AppConfig.mangaEInkThreshold = mMangaEInkThreshold
}
interface Callback {
fun updateEepaper(value: Int)
}
}
@@ -3,9 +3,9 @@ package io.legato.kazusa.ui.book.manga.config
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.transition.TransitionManager
import io.legato.kazusa.R
import io.legato.kazusa.base.BaseDialogFragment
import io.legato.kazusa.base.BaseBottomSheetDialogFragment
import io.legato.kazusa.constant.EventBus
import io.legato.kazusa.databinding.DialogMangaFooterSettingBinding
import io.legato.kazusa.help.config.AppConfig
@@ -13,100 +13,187 @@ import io.legato.kazusa.ui.widget.ReaderInfoBarView
import io.legato.kazusa.utils.GSON
import io.legato.kazusa.utils.fromJsonObject
import io.legato.kazusa.utils.postEvent
import io.legato.kazusa.utils.setLayout
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
class MangaFooterSettingDialog : BaseDialogFragment(R.layout.dialog_manga_footer_setting) {
class MangaFooterSettingDialog :
BaseBottomSheetDialogFragment(R.layout.dialog_manga_footer_setting) {
val config = GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
?: MangaFooterConfig()
var callback: Callback? = null
var initialAutoPageEnabled: Boolean = false
var initialAutoPageSpeed: Int = 3
private val binding by viewBinding(DialogMangaFooterSettingBinding::bind)
override fun onStart() {
super.onStart()
setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.cbChapterLabel.run {
isChecked = config.hideChapterLabel
isChecked = !config.hideChapterLabel
setOnCheckedChangeListener { _, isChecked ->
config.hideChapterLabel = isChecked
config.hideChapterLabel = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (isChecked) binding.cbChapter.isChecked = true
}
}
binding.cbChapter.run {
isChecked = config.hideChapter
isChecked = !config.hideChapter
setOnCheckedChangeListener { _, isChecked ->
config.hideChapter = isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
}
}
binding.cbPageNumberLabel.run {
isChecked = config.hidePageNumberLabel
setOnCheckedChangeListener { _, isChecked ->
config.hidePageNumberLabel = isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
}
}
binding.cbPageNumber.run {
isChecked = config.hidePageNumber
setOnCheckedChangeListener { _, isChecked ->
config.hidePageNumber = isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
}
}
binding.cbProgressRatioLabel.run {
isChecked = config.hideProgressRatioLabel
setOnCheckedChangeListener { _, isChecked ->
config.hideProgressRatioLabel = isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
}
}
binding.cbProgressRatio.run {
isChecked = config.hideProgressRatio
setOnCheckedChangeListener { _, isChecked ->
config.hideProgressRatio = isChecked
config.hideChapter = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (!isChecked) binding.cbChapterLabel.isChecked = false
}
}
binding.cbChapterName.run {
isChecked = config.hideChapterName
isChecked = !config.hideChapterName
setOnCheckedChangeListener { _, isChecked ->
config.hideChapterName = isChecked
config.hideChapterName = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
}
}
binding.rgFooterOrientation.check(if (config.footerOrientation == ReaderInfoBarView.ALIGN_CENTER) R.id.rb_center else R.id.rb_left)
binding.rgFooterOrientation.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
binding.cbPageNumberLabel.run {
isChecked = !config.hidePageNumberLabel
setOnCheckedChangeListener { _, isChecked ->
config.hidePageNumberLabel = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (isChecked) binding.cbPageNumber.isChecked = true
}
}
binding.cbPageNumber.run {
isChecked = !config.hidePageNumber
setOnCheckedChangeListener { _, isChecked ->
config.hidePageNumber = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (!isChecked) binding.cbPageNumberLabel.isChecked = false
}
}
binding.cbProgressRatioLabel.run {
isChecked = !config.hideProgressRatioLabel
setOnCheckedChangeListener { _, isChecked ->
config.hideProgressRatioLabel = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (isChecked) binding.cbProgressRatio.isChecked = true
}
}
binding.cbProgressRatio.run {
isChecked = !config.hideProgressRatio
setOnCheckedChangeListener { _, isChecked ->
config.hideProgressRatio = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (!isChecked) binding.cbProgressRatioLabel.isChecked = false
}
}
binding.rgFooterOrientation.check(
when {
config.hideFooter -> R.id.rb_hide
config.footerOrientation == ReaderInfoBarView.ALIGN_CENTER -> R.id.rb_center
else -> R.id.rb_left
}
)
binding.rgFooterOrientation.setOnCheckedStateChangeListener { _, checkedIds ->
when (checkedIds.firstOrNull()) {
R.id.rb_left -> {
config.hideFooter = false
config.footerOrientation = ReaderInfoBarView.ALIGN_LEFT
}
R.id.rb_center -> {
config.hideFooter = false
config.footerOrientation = ReaderInfoBarView.ALIGN_CENTER
}
}
postEvent(EventBus.UP_MANGA_CONFIG, config)
}
binding.rgFooter.check(if (config.hideFooter) R.id.rb_hide else R.id.rb_show)
binding.rgFooter.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
R.id.rb_show -> {
config.hideFooter = false
}
R.id.rb_hide -> {
config.hideFooter = true
}
}
postEvent(EventBus.UP_MANGA_CONFIG, config)
}
binding.chipAutoPage.run {
isChecked = initialAutoPageEnabled
setOnCheckedChangeListener { _, isChecked ->
callback?.onAutoPageToggle(isChecked)
initAutoPageSpeed(isChecked)
}
}
binding.btnColorFilter.setOnClickListener {
callback?.showColorFilterConfig()
dismiss()
}
initAutoPageSpeed(initialAutoPageEnabled)
updateChapterText()
}
private fun initAutoPageSpeed(boolean: Boolean) {
TransitionManager.beginDelayedTransition(binding.rootView)
binding.scvAutoPageSpeed.run {
isEnabled = boolean
valueFormat = { "$it" }
progress = initialAutoPageSpeed
onChanged = { newValue ->
callback?.onAutoPageSpeedChanged(newValue)
}
}
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
AppConfig.mangaFooterConfig = GSON.toJson(config)
}
private fun updateChapterText() {
val label = if (!config.hideChapterLabel) "章节" else ""
val chapter = if (!config.hideChapter) "1/45 " else ""
val name = if (!config.hideChapterName) "第三话 " else ""
val progressLabel = if (!config.hideProgressRatioLabel) "总进度" else ""
val progress = if (!config.hideProgressRatio) "2.1%" else ""
val pageLabel = if (!config.hidePageNumberLabel) "页数" else ""
val page = if (!config.hidePageNumber) "4/30 " else ""
val parts = listOf(
name,
pageLabel,
page,
label,
chapter,
progressLabel,
progress
).filter { it.isNotEmpty() }
TransitionManager.beginDelayedTransition(binding.rootView)
binding.tvChapter.text = parts.joinToString(" ")
}
interface Callback {
fun onAutoPageToggle(enable: Boolean)
fun onAutoPageSpeedChanged(speed: Int)
fun showColorFilterConfig()
}
}
@@ -22,9 +22,8 @@ class EpaperTransformation(
@IntRange(0, 255) private val threshold: Int = 128,
) : BitmapTransformation() {
private val ID =
"io.legado.app.model.EpaperTransformation.${threshold}"
private val ID_BYTES = ID.toByteArray(CHARSET)
private val ID get() = "io.legado.app.model.EpaperTransformation.$threshold"
private val ID_BYTES get() = ID.toByteArray(CHARSET)
override fun transform(
pool: BitmapPool,
@@ -253,21 +253,13 @@ class MangaAdapter(private val context: Context) :
fun enableMangaEInk(enable: Boolean, value: Int) {
if (enable) {
currentMangaEInkThreshold = value
mTransformation = EpaperTransformation(currentMangaEInkThreshold)
mTransformation = EpaperTransformation(value)
} else {
mTransformation = null
}
notifyItemRangeChanged(0, itemCount)
}
fun updateThreshold(mangaEInkThreshold: Int) {
if (currentMangaEInkThreshold != mangaEInkThreshold) {
currentMangaEInkThreshold = mangaEInkThreshold
mTransformation = EpaperTransformation(currentMangaEInkThreshold)
notifyItemRangeChanged(0, itemCount)
}
}
//开启灰色图片
fun enableGray(enable: Boolean) {
mTransformation = if (enable) {
@@ -1,8 +1,8 @@
package io.legato.kazusa.ui.book.read
//import io.legado.app.lib.theme.bottomBackground
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.animation.Animation
@@ -15,14 +15,12 @@ import io.legato.kazusa.databinding.ViewMangaMenuBinding
import io.legato.kazusa.help.config.AppConfig
import io.legato.kazusa.help.source.getSourceType
import io.legato.kazusa.lib.dialogs.alert
//import io.legado.app.lib.theme.bottomBackground
import io.legato.kazusa.model.ReadBook
import io.legato.kazusa.model.ReadManga
import io.legato.kazusa.ui.browser.WebViewActivity
import io.legato.kazusa.utils.ConstraintModify
import io.legato.kazusa.utils.activity
import io.legato.kazusa.utils.applyNavigationBarPadding
import io.legato.kazusa.utils.dpToPx
import io.legato.kazusa.utils.gone
import io.legato.kazusa.utils.invisible
import io.legato.kazusa.utils.loadAnimation
@@ -95,15 +93,15 @@ class MangaMenu @JvmOverloads constructor(
private fun initView() = binding.run {
initAnimation()
val brightnessBackground = GradientDrawable()
brightnessBackground.cornerRadius = 5F.dpToPx()
//brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f))
if (AppConfig.isEInkMode) {
titleBar.setBackgroundResource(R.drawable.bg_eink_border_bottom)
bottomMenu.setBackgroundResource(R.drawable.bg_eink_border_top)
} else {
//bottomMenu.setBackgroundColor(bgColor)
}
// val brightnessBackground = GradientDrawable()
// brightnessBackground.cornerRadius = 5F.dpToPx()
// //brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f))
// if (AppConfig.isEInkMode) {
// titleBar.setBackgroundResource(R.drawable.bg_eink_border_bottom)
// bottomMenu.setBackgroundResource(R.drawable.bg_eink_border_top)
// } else {
// //bottomMenu.setBackgroundColor(bgColor)
// }
if (AppConfig.showReadTitleBarAddition) {
titleBarAddition.visible()
} else {
@@ -113,7 +111,7 @@ class MangaMenu @JvmOverloads constructor(
/**
* 确保视图不被导航栏遮挡
*/
bottomMenu.applyNavigationBarPadding()
bottomView.applyNavigationBarPadding()
}
private fun upBrightnessVwPos() {
@@ -163,6 +161,18 @@ class MangaMenu @JvmOverloads constructor(
}
}
fun upBookView() {
binding.titleBar.title = " "
binding.tvBookName.text = ReadManga.book?.name
ReadManga.curMangaChapter?.let {
binding.tvChapterName.text = ReadManga.book?.durChapterTitle
binding.tvPre.isEnabled = ReadManga.durChapterIndex != 0
binding.tvNext.isEnabled =
ReadManga.durChapterIndex != ReadManga.simulatedChapterSize - 1
} ?: let {
binding.tvChapterUrl.gone()
}
}
private fun bindEvent() = binding.run {
vwMenuBg.setOnClickListener { runMenuOut() }
@@ -224,14 +234,26 @@ class MangaMenu @JvmOverloads constructor(
}
})
ivCatalog.setOnClickListener {
callBack.openCatalog()
}
ivSetting.setOnClickListener {
callBack.showFooterConfig()
}
btnAutoPage.setOnClickListener {
callBack.showFooterConfig()
}
}
fun upSeekBar(value: Int, count: Int) {
binding.seekReadPage.apply {
valueFrom = 1f
valueTo = (count).toFloat()
this.value = value.toFloat().coerceIn(1f,valueFrom)
valueTo = count.toFloat()
stepSize = 1f
this.value = value.toFloat().coerceIn(valueFrom, valueTo)
}
}
@@ -239,6 +261,8 @@ class MangaMenu @JvmOverloads constructor(
fun openBookInfoActivity()
fun upSystemUiVisibility(menuIsVisible: Boolean)
fun skipToPage(index: Int)
fun openCatalog()
fun showFooterConfig()
}
}
@@ -143,8 +143,6 @@ class SimpleCounterView @JvmOverloads constructor(
}
}
private fun updateValue() {
binding.tvSeekValue.text = valueFormat?.invoke(_progress) ?: _progress.toString()
}
@@ -185,4 +183,12 @@ class SimpleCounterView @JvmOverloads constructor(
super.onDetachedFromWindow()
}
override fun setEnabled(enabled: Boolean) {
super.setEnabled(enabled)
binding.tvSeekTitle.isEnabled = enabled
binding.ivSeekPlus.isEnabled = enabled
binding.ivSeekReduce.isEnabled = enabled
binding.tvSeekValue.isEnabled = enabled
}
}