更新界面

This commit is contained in:
HapeLee committed 2025-07-14 02:23:23 +08:00
1 parent 06dd2ac2c1
commit c35177715c
21 files changed
+745 -469

No files matched your search

@@ -76,7 +76,7 @@ object BookCover {
return return
} }
defaultDrawable = kotlin.runCatching { 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)) }.getOrDefault(appCtx.resources.getDrawable(R.drawable.image_cover_default, null))
} }
@@ -158,6 +158,7 @@ object BookCover {
} }
it it
} }
.transition(DrawableTransitionOptions.withCrossFade())
} }
fun preloadManga( 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.info.BookInfoActivity
import io.legato.kazusa.ui.book.manga.config.MangaColorFilterConfig 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.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.MangaFooterConfig
import io.legato.kazusa.ui.book.manga.config.MangaFooterSettingDialog import io.legato.kazusa.ui.book.manga.config.MangaFooterSettingDialog
import io.legato.kazusa.ui.book.manga.entities.BaseMangaPage import io.legato.kazusa.ui.book.manga.entities.BaseMangaPage
@@ -78,7 +77,7 @@ import kotlin.math.ceil
class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewModel>(), class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewModel>(),
ReadManga.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack, ReadManga.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack,
MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaEpaperDialog.Callback { MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaFooterSettingDialog.Callback {
private val mLayoutManager by lazy { private val mLayoutManager by lazy {
MangaLayoutManager(this) MangaLayoutManager(this)
@@ -253,7 +252,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun upContent() { override fun upContent() {
lifecycleScope.launch { lifecycleScope.launch {
setTitle(ReadManga.book?.name) binding.mangaMenu.upBookView()
val data = withContext(IO) { ReadManga.mangaContents } val data = withContext(IO) { ReadManga.mangaContents }
val pos = data.pos val pos = data.pos
val list = data.items val list = data.items
@@ -450,7 +449,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun updateColorFilter(config: MangaColorFilterConfig) { override fun updateColorFilter(config: MangaColorFilterConfig) {
mAdapter.setMangaImageColorFilter(config) mAdapter.setMangaImageColorFilter(config)
updateWindowBrightness(config.l) if (config.autoBrightness) {
resetWindowToSystemBrightness()
} else {
updateWindowBrightness(config.l)
}
} }
@SuppressLint("StringFormatMatches") @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 -> { R.id.menu_refresh -> {
binding.flLoading.isVisible = true binding.flLoading.isVisible = true
ReadManga.book?.let { ReadManga.book?.let {
@@ -510,35 +507,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
setDisableClickScroll(item.isChecked) 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 -> { R.id.menu_enable_horizontal_scroll -> {
item.isChecked = !item.isChecked item.isChecked = !item.isChecked
AppConfig.enableMangaHorizontalScroll = item.isChecked AppConfig.enableMangaHorizontalScroll = item.isChecked
@@ -555,11 +523,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
R.id.menu_enable_auto_scroll -> { R.id.menu_enable_auto_scroll -> {
item.isChecked = !item.isChecked item.isChecked = !item.isChecked
mScrollTimer.isEnabled = item.isChecked mScrollTimer.isEnabled = item.isChecked
mMenu?.findItem(R.id.menu_enable_auto_page)?.isChecked = false
enableAutoScroll = item.isChecked enableAutoScroll = item.isChecked
enableAutoScrollPage = false enableAutoScrollPage = false
mScrollTimer.isEnabledPage = false mScrollTimer.isEnabledPage = false
mMenu?.findItem(R.id.menu_manga_auto_page_speed)?.isVisible = item.isChecked
if (enableAutoScroll) { if (enableAutoScroll) {
mPagerSnapHelper.attachToRecyclerView(null) mPagerSnapHelper.attachToRecyclerView(null)
} else if (AppConfig.enableMangaHorizontalScroll) { } else if (AppConfig.enableMangaHorizontalScroll) {
@@ -573,18 +541,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
ReadManga.loadContent() 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 -> { R.id.menu_disable_horizontal_animation -> {
item.isChecked = !item.isChecked 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) 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() { override fun openBookInfoActivity() {
ReadManga.book?.let { ReadManga.book?.let {
bookInfoActivity.launch { 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) { override fun upSystemUiVisibility(menuIsVisible: Boolean) {
toggleSystemBar(menuIsVisible) toggleSystemBar(menuIsVisible)
if (enableAutoScroll) { if (enableAutoScroll) {
@@ -680,19 +683,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum) 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_manga_scale).isChecked = AppConfig.disableMangaScale
menu.findItem(R.id.menu_disable_click_scroll).isChecked = AppConfig.disableClickScroll 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 = menu.findItem(R.id.menu_enable_horizontal_scroll).isChecked =
AppConfig.enableMangaHorizontalScroll AppConfig.enableMangaHorizontalScroll
menu.findItem(R.id.menu_hide_manga_title).isChecked = AppConfig.hideMangaTitle 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 { menu.findItem(R.id.menu_disable_horizontal_animation).run {
isVisible = isVisible =
AppConfig.enableMangaHorizontalScroll AppConfig.enableMangaHorizontalScroll
isChecked = AppConfig.disableHorizontalAnimator isChecked = AppConfig.disableHorizontalAnimator
} }
menu.findItem(R.id.menu_gray_manga).isChecked = AppConfig.enableMangaGray
} }
private fun setDisableMangaScale(disable: Boolean) { 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) { fun updateWindowBrightness(brightness: Int) {
val layoutParams = window.attributes val layoutParams = window.attributes
@@ -832,7 +837,5 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
return super.onKeyDown(keyCode, event) 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 g: Int = 0,
var b: Int = 0, var b: Int = 0,
var a: Int = 0, var a: Int = 0,
var l: Int = 0 var l: Int = 0,
var autoBrightness: Boolean = true
) { ) {
fun toJson(): String { fun toJson(): String {
if (r == 0 && g == 0 && b == 0 && a == 0 && l == 0) { 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.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import androidx.core.view.isVisible
import io.legato.kazusa.R 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.databinding.DialogMangaColorFilterBinding
import io.legato.kazusa.help.config.AppConfig import io.legato.kazusa.help.config.AppConfig
import io.legato.kazusa.utils.GSON import io.legato.kazusa.utils.GSON
import io.legato.kazusa.utils.fromJsonObject 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.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 binding by viewBinding(DialogMangaColorFilterBinding::bind)
private val mConfig = private val mConfig =
GSON.fromJsonObject<MangaColorFilterConfig>(AppConfig.mangaColorFilter).getOrNull() GSON.fromJsonObject<MangaColorFilterConfig>(AppConfig.mangaColorFilter).getOrNull()
?: MangaColorFilterConfig() ?: MangaColorFilterConfig()
private val callback get() = activity as? Callback private val callback: Callback? get() = activity as? Callback
private var mMangaEInkThreshold = AppConfig.mangaEInkThreshold
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) 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?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
@@ -34,6 +38,17 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
private fun initData() { private fun initData() {
binding.run { 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 dsbBrightness.progress = mConfig.l
dsbR.progress = mConfig.r dsbR.progress = mConfig.r
dsbG.progress = mConfig.g dsbG.progress = mConfig.g
@@ -44,6 +59,37 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
private fun initView() { private fun initView() {
binding.run { 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 = { dsbBrightness.onChanged = {
mConfig.l = it mConfig.l = it
callback?.updateColorFilter(mConfig) callback?.updateColorFilter(mConfig)
@@ -70,10 +116,13 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
override fun onDismiss(dialog: DialogInterface) { override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog) super.onDismiss(dialog)
AppConfig.mangaColorFilter = mConfig.toJson() AppConfig.mangaColorFilter = mConfig.toJson()
AppConfig.mangaEInkThreshold = mMangaEInkThreshold
} }
interface Callback { interface Callback {
fun updateColorFilter(config: MangaColorFilterConfig) 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.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import androidx.transition.TransitionManager
import io.legato.kazusa.R 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.constant.EventBus
import io.legato.kazusa.databinding.DialogMangaFooterSettingBinding import io.legato.kazusa.databinding.DialogMangaFooterSettingBinding
import io.legato.kazusa.help.config.AppConfig 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.GSON
import io.legato.kazusa.utils.fromJsonObject import io.legato.kazusa.utils.fromJsonObject
import io.legato.kazusa.utils.postEvent import io.legato.kazusa.utils.postEvent
import io.legato.kazusa.utils.setLayout
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding 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() val config = GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
?: MangaFooterConfig() ?: MangaFooterConfig()
var callback: Callback? = null
var initialAutoPageEnabled: Boolean = false
var initialAutoPageSpeed: Int = 3
private val binding by viewBinding(DialogMangaFooterSettingBinding::bind) private val binding by viewBinding(DialogMangaFooterSettingBinding::bind)
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
} }
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.cbChapterLabel.run { binding.cbChapterLabel.run {
isChecked = config.hideChapterLabel isChecked = !config.hideChapterLabel
setOnCheckedChangeListener { _, isChecked -> setOnCheckedChangeListener { _, isChecked ->
config.hideChapterLabel = isChecked config.hideChapterLabel = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config) postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (isChecked) binding.cbChapter.isChecked = true
} }
} }
binding.cbChapter.run { binding.cbChapter.run {
isChecked = config.hideChapter isChecked = !config.hideChapter
setOnCheckedChangeListener { _, isChecked -> setOnCheckedChangeListener { _, isChecked ->
config.hideChapter = 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
postEvent(EventBus.UP_MANGA_CONFIG, config) postEvent(EventBus.UP_MANGA_CONFIG, config)
updateChapterText()
if (!isChecked) binding.cbChapterLabel.isChecked = false
} }
} }
binding.cbChapterName.run { binding.cbChapterName.run {
isChecked = config.hideChapterName isChecked = !config.hideChapterName
setOnCheckedChangeListener { _, isChecked -> setOnCheckedChangeListener { _, isChecked ->
config.hideChapterName = isChecked config.hideChapterName = !isChecked
postEvent(EventBus.UP_MANGA_CONFIG, config) 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 -> binding.cbPageNumberLabel.run {
when (checkedId) { 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 -> { R.id.rb_left -> {
config.hideFooter = false
config.footerOrientation = ReaderInfoBarView.ALIGN_LEFT config.footerOrientation = ReaderInfoBarView.ALIGN_LEFT
} }
R.id.rb_center -> { R.id.rb_center -> {
config.hideFooter = false
config.footerOrientation = ReaderInfoBarView.ALIGN_CENTER 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 -> { R.id.rb_hide -> {
config.hideFooter = true config.hideFooter = true
} }
} }
postEvent(EventBus.UP_MANGA_CONFIG, config) 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) { override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog) super.onDismiss(dialog)
AppConfig.mangaFooterConfig = GSON.toJson(config) 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, @IntRange(0, 255) private val threshold: Int = 128,
) : BitmapTransformation() { ) : BitmapTransformation() {
private val ID = private val ID get() = "io.legado.app.model.EpaperTransformation.$threshold"
"io.legado.app.model.EpaperTransformation.${threshold}" private val ID_BYTES get() = ID.toByteArray(CHARSET)
private val ID_BYTES = ID.toByteArray(CHARSET)
override fun transform( override fun transform(
pool: BitmapPool, pool: BitmapPool,
@@ -253,21 +253,13 @@ class MangaAdapter(private val context: Context) :
fun enableMangaEInk(enable: Boolean, value: Int) { fun enableMangaEInk(enable: Boolean, value: Int) {
if (enable) { if (enable) {
currentMangaEInkThreshold = value currentMangaEInkThreshold = value
mTransformation = EpaperTransformation(currentMangaEInkThreshold) mTransformation = EpaperTransformation(value)
} else { } else {
mTransformation = null mTransformation = null
} }
notifyItemRangeChanged(0, itemCount) notifyItemRangeChanged(0, itemCount)
} }
fun updateThreshold(mangaEInkThreshold: Int) {
if (currentMangaEInkThreshold != mangaEInkThreshold) {
currentMangaEInkThreshold = mangaEInkThreshold
mTransformation = EpaperTransformation(currentMangaEInkThreshold)
notifyItemRangeChanged(0, itemCount)
}
}
//开启灰色图片 //开启灰色图片
fun enableGray(enable: Boolean) { fun enableGray(enable: Boolean) {
mTransformation = if (enable) { mTransformation = if (enable) {
@@ -1,8 +1,8 @@
package io.legato.kazusa.ui.book.read package io.legato.kazusa.ui.book.read
//import io.legado.app.lib.theme.bottomBackground
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.animation.Animation 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.config.AppConfig
import io.legato.kazusa.help.source.getSourceType import io.legato.kazusa.help.source.getSourceType
import io.legato.kazusa.lib.dialogs.alert 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.ReadBook
import io.legato.kazusa.model.ReadManga import io.legato.kazusa.model.ReadManga
import io.legato.kazusa.ui.browser.WebViewActivity import io.legato.kazusa.ui.browser.WebViewActivity
import io.legato.kazusa.utils.ConstraintModify import io.legato.kazusa.utils.ConstraintModify
import io.legato.kazusa.utils.activity import io.legato.kazusa.utils.activity
import io.legato.kazusa.utils.applyNavigationBarPadding import io.legato.kazusa.utils.applyNavigationBarPadding
import io.legato.kazusa.utils.dpToPx
import io.legato.kazusa.utils.gone import io.legato.kazusa.utils.gone
import io.legato.kazusa.utils.invisible import io.legato.kazusa.utils.invisible
import io.legato.kazusa.utils.loadAnimation import io.legato.kazusa.utils.loadAnimation
@@ -95,15 +93,15 @@ class MangaMenu @JvmOverloads constructor(
private fun initView() = binding.run { private fun initView() = binding.run {
initAnimation() initAnimation()
val brightnessBackground = GradientDrawable() // val brightnessBackground = GradientDrawable()
brightnessBackground.cornerRadius = 5F.dpToPx() // brightnessBackground.cornerRadius = 5F.dpToPx()
//brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f)) // //brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f))
if (AppConfig.isEInkMode) { // if (AppConfig.isEInkMode) {
titleBar.setBackgroundResource(R.drawable.bg_eink_border_bottom) // titleBar.setBackgroundResource(R.drawable.bg_eink_border_bottom)
bottomMenu.setBackgroundResource(R.drawable.bg_eink_border_top) // bottomMenu.setBackgroundResource(R.drawable.bg_eink_border_top)
} else { // } else {
//bottomMenu.setBackgroundColor(bgColor) // //bottomMenu.setBackgroundColor(bgColor)
} // }
if (AppConfig.showReadTitleBarAddition) { if (AppConfig.showReadTitleBarAddition) {
titleBarAddition.visible() titleBarAddition.visible()
} else { } else {
@@ -113,7 +111,7 @@ class MangaMenu @JvmOverloads constructor(
/** /**
* 确保视图不被导航栏遮挡 * 确保视图不被导航栏遮挡
*/ */
bottomMenu.applyNavigationBarPadding() bottomView.applyNavigationBarPadding()
} }
private fun upBrightnessVwPos() { 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 { private fun bindEvent() = binding.run {
vwMenuBg.setOnClickListener { runMenuOut() } 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) { fun upSeekBar(value: Int, count: Int) {
binding.seekReadPage.apply { binding.seekReadPage.apply {
valueFrom = 1f valueFrom = 1f
valueTo = (count).toFloat() valueTo = count.toFloat()
this.value = value.toFloat().coerceIn(1f,valueFrom)
stepSize = 1f stepSize = 1f
this.value = value.toFloat().coerceIn(valueFrom, valueTo)
} }
} }
@@ -239,6 +261,8 @@ class MangaMenu @JvmOverloads constructor(
fun openBookInfoActivity() fun openBookInfoActivity()
fun upSystemUiVisibility(menuIsVisible: Boolean) fun upSystemUiVisibility(menuIsVisible: Boolean)
fun skipToPage(index: Int) fun skipToPage(index: Int)
fun openCatalog()
fun showFooterConfig()
} }
} }
@@ -143,8 +143,6 @@ class SimpleCounterView @JvmOverloads constructor(
} }
} }
private fun updateValue() { private fun updateValue() {
binding.tvSeekValue.text = valueFormat?.invoke(_progress) ?: _progress.toString() binding.tvSeekValue.text = valueFormat?.invoke(_progress) ?: _progress.toString()
} }
@@ -185,4 +183,12 @@ class SimpleCounterView @JvmOverloads constructor(
super.onDetachedFromWindow() 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
}
} }
+3 -3
View File
@@ -2,11 +2,11 @@
<set xmlns:android="http://schemas.android.com/apk/res/android" <set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:interpolator/decelerate_cubic"> android:interpolator="@android:interpolator/decelerate_cubic">
<translate <translate
android:fromYDelta="100%" android:duration="240"
android:toYDelta="0%" android:toYDelta="0%"
android:duration="280"/> android:fromYDelta="8%" />
<alpha <alpha
android:fromAlpha="0.0" android:fromAlpha="0.0"
android:toAlpha="1.0" android:toAlpha="1.0"
android:duration="280"/> android:duration="240" />
</set> </set>
+1 -5
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" <set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:interpolator/decelerate_cubic"> android:interpolator="@android:interpolator/decelerate_cubic">
<translate
android:fromYDelta="0%"
android:toYDelta="100%"
android:duration="280"/>
<alpha <alpha
android:fromAlpha="1.0" android:fromAlpha="1.0"
android:toAlpha="0.0" android:toAlpha="0.0"
android:duration="280"/> android:duration="240" />
</set> </set>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="@android:color/white"
android:pathData="M80,520L80,440L880,440L880,520L80,520ZM280,400L280,280L680,280L680,400L280,400ZM280,680L280,560L680,560L680,680L280,680Z" />
</vector>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="@android:color/white"
android:pathData="M80,880L80,80L160,80L160,880L80,880ZM520,680L520,280L640,280L640,680L520,680ZM280,680L280,280L400,280L400,680L280,680Z" />
</vector>
@@ -3,54 +3,147 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:padding="16dp"> android:paddingHorizontal="16dp"
android:paddingVertical="8dp">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<io.legato.kazusa.ui.widget.text.AccentTextView <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/manga_color_filter"
android:textSize="18sp" />
<io.legato.kazusa.ui.widget.DetailSeekBar
android:id="@+id/dsb_brightness"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:max="255" android:gravity="center"
app:title="@string/brightness" /> android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp">
<io.legato.kazusa.ui.widget.DetailSeekBar <View
android:id="@+id/dsb_r" android:layout_width="36dp"
android:layout_height="4dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="16dp"
android:background="@drawable/bg_bottom_sheet_handle" />
<TextView
android:id="@+id/bottom_sheet_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/manga_color_filter"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:max="255" android:gravity="center_vertical">
app:title="R" />
<io.legato.kazusa.ui.widget.DetailSeekBar <io.legato.kazusa.ui.widget.SimpleCounterView
android:id="@+id/dsb_g" android:id="@+id/dsb_brightness"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:max="255"
app:title="@string/brightness" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_autoBrightness"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跟随系统" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:max="255" android:gravity="center_vertical"
app:title="G" /> android:orientation="horizontal">
<io.legato.kazusa.ui.widget.DetailSeekBar
android:id="@+id/dsb_b" <com.google.android.material.chip.Chip
android:id="@+id/cp_epaper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="@string/manga_epaper" />
<com.google.android.material.chip.Chip
android:id="@+id/cp_enableGray"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="灰度" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<io.legato.kazusa.ui.widget.SimpleCounterView
android:id="@+id/dsbEpaper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:max="255"
app:title="阈值" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:max="255" android:gravity="center_vertical">
app:title="B" />
<io.legato.kazusa.ui.widget.DetailSeekBar <io.legato.kazusa.ui.widget.SimpleCounterView
android:id="@+id/dsb_a" android:id="@+id/dsb_r"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:max="255"
app:title="R" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<io.legato.kazusa.ui.widget.SimpleCounterView
android:id="@+id/dsb_g"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:max="255"
app:title="G" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:max="255" android:gravity="center_vertical">
app:title="A" />
<io.legato.kazusa.ui.widget.SimpleCounterView
android:id="@+id/dsb_b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:max="255"
app:title="B" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<io.legato.kazusa.ui.widget.SimpleCounterView
android:id="@+id/dsb_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:max="255"
app:title="A" />
</LinearLayout>
</LinearLayout> </LinearLayout>
@@ -2,168 +2,202 @@
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:padding="16dp"> xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp">
<LinearLayout <LinearLayout
android:id="@+id/root_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<io.legato.kazusa.ui.widget.text.AccentTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/manga_footer_config"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/manga_header_chapter"
android:textSize="14sp" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:gravity="center"
android:layout_marginTop="8dp"> android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp">
<io.legato.kazusa.lib.theme.view.ThemeCheckBox <View
android:id="@+id/cb_chapter_label" android:layout_width="36dp"
android:layout_height="4dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="16dp"
android:background="@drawable/bg_bottom_sheet_handle" />
<TextView
android:id="@+id/bottom_sheet_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:text="漫画设置"
android:text="@string/manga_check_chapter_label" /> android:textSize="18sp"
android:textStyle="bold" />
<io.legato.kazusa.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_chapter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center"
android:text="@string/manga_check_chapter" />
<io.legato.kazusa.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_chapter_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center"
android:text="@string/manga_check_chapter_name" />
</LinearLayout> </LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/manga_header_page"
android:textSize="14sp" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:gravity="center_vertical"
android:layout_marginTop="8dp"> android:orientation="horizontal">
<io.legato.kazusa.lib.theme.view.ThemeCheckBox <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="@string/footer"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/rg_footer_orientation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:selectionRequired="true"
app:singleSelection="true">
<com.google.android.material.chip.Chip
android:id="@+id/rb_left"
style="@style/Widget.Material3.Chip.Suggestion"
android:layout_width="34dp"
android:layout_height="wrap_content"
app:chipIcon="@drawable/ic_align_left"
app:chipIconEnabled="true" />
<com.google.android.material.chip.Chip
android:id="@+id/rb_center"
style="@style/Widget.Material3.Chip.Suggestion"
android:layout_width="34dp"
android:layout_height="wrap_content"
app:chipIcon="@drawable/ic_align_center"
app:chipIconEnabled="true" />
<com.google.android.material.chip.Chip
android:id="@+id/rb_hide"
style="@style/Widget.Material3.Chip.Suggestion"
android:layout_width="34dp"
android:layout_height="wrap_content"
app:chipIcon="@drawable/ic_visibility_off"
app:chipIconEnabled="true" />
</com.google.android.material.chip.ChipGroup>
</LinearLayout>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
app:cardBackgroundColor="?attr/colorSurfaceVariant"
app:cardCornerRadius="8dp"
app:strokeWidth="0dp">
<TextView
android:id="@+id/tv_chapter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp" />
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.chip.ChipGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.chip.Chip
android:id="@+id/cb_chapter_name"
style="@style/Widget.Material3.Chip.Suggestion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第三话" />
<com.google.android.material.chip.Chip
android:id="@+id/cb_page_number_label" android:id="@+id/cb_page_number_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" style="@style/Widget.Material3.Chip.Suggestion"
android:text="@string/manga_check_page_label" /> android:text="@string/manga_check_page_label" />
<io.legato.kazusa.lib.theme.view.ThemeCheckBox <com.google.android.material.chip.Chip
android:id="@+id/cb_page_number" android:id="@+id/cb_page_number"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="10dp" style="@style/Widget.Material3.Chip.Suggestion"
android:gravity="center" android:text="4/30" />
android:text="@string/manga_check_page_number" />
</LinearLayout>
<TextView </com.google.android.material.chip.ChipGroup>
<com.google.android.material.chip.ChipGroup
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:layout_marginTop="16dp"
android:text="@string/manga_header_progress"
android:textSize="14sp" />
<LinearLayout <com.google.android.material.chip.Chip
android:layout_width="wrap_content" android:id="@+id/cb_chapter_label"
android:layout_height="wrap_content" style="@style/Widget.Material3.Chip.Suggestion"
android:layout_marginStart="16dp" android:layout_width="wrap_content"
android:layout_marginTop="8dp"> android:layout_height="wrap_content"
android:text="@string/manga_check_chapter_label" />
<io.legato.kazusa.lib.theme.view.ThemeCheckBox <com.google.android.material.chip.Chip
android:id="@+id/cb_chapter"
style="@style/Widget.Material3.Chip.Suggestion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1 / 45" />
<com.google.android.material.chip.Chip
android:id="@+id/cb_progress_ratio_label" android:id="@+id/cb_progress_ratio_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" style="@style/Widget.Material3.Chip.Suggestion"
android:text="@string/manga_check_progress_label" /> android:text="@string/manga_check_progress_label" />
<io.legato.kazusa.lib.theme.view.ThemeCheckBox <com.google.android.material.chip.Chip
android:id="@+id/cb_progress_ratio" android:id="@+id/cb_progress_ratio"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="10dp" style="@style/Widget.Material3.Chip.Suggestion"
android:gravity="center" android:text="2.1%" />
android:text="@string/manga_check_progress" /> </com.google.android.material.chip.ChipGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.google.android.material.chip.Chip
android:id="@+id/chip_autoPage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/enable_auto_page_scroll" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<io.legato.kazusa.ui.widget.SimpleCounterView
android:id="@+id/scv_autoPageSpeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:max="100"
app:title="翻页速度" />
</LinearLayout> </LinearLayout>
<TextView <com.google.android.material.button.MaterialButton
android:id="@+id/btn_color_filter"
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:text="@string/manga_color_filter" />
android:text="@string/manga_header_footer"
android:textSize="14sp" />
<RadioGroup
android:id="@+id/rg_footer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<io.legato.kazusa.lib.theme.view.ThemeRadioButton
android:id="@+id/rb_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/show" />
<io.legato.kazusa.lib.theme.view.ThemeRadioButton
android:id="@+id/rb_hide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center"
android:text="@string/hide" />
</RadioGroup>
<RadioGroup
android:id="@+id/rg_footer_orientation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<io.legato.kazusa.lib.theme.view.ThemeRadioButton
android:id="@+id/rb_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/manga_radio_left" />
<io.legato.kazusa.lib.theme.view.ThemeRadioButton
android:id="@+id/rb_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center"
android:text="@string/manga_radio_center" />
</RadioGroup>
</LinearLayout> </LinearLayout>
+1 -1
View File
@@ -7,7 +7,7 @@
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center" android:gravity="center"
android:padding="5dp" android:padding="8dp"
android:maxLines="1" android:maxLines="1"
android:scrollbars="none" android:scrollbars="none"
android:textSize="14sp" android:textSize="14sp"
+118 -53
View File
@@ -19,64 +19,60 @@
android:id="@+id/title_bar" android:id="@+id/title_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="?attr/actionBarStyle" android:alpha="0.92"
android:background="?attr/colorSurfaceContainer"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout <LinearLayout
android:id="@+id/title_bar_addition"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="16dp">
<TextView <TextView
android:id="@+id/tv_chapter_name" android:id="@+id/tv_book_name"
android:layout_width="0dp" style="@style/TextAppearance.Material3.TitleLarge"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:singleLine="true"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/tv_source_action"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<TextView
android:id="@+id/tv_chapter_url"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:singleLine="true"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/tv_source_action"
app:layout_constraintTop_toBottomOf="@+id/tv_chapter_name"
tools:visibility="visible" />
<io.legato.kazusa.ui.widget.text.AccentBgTextView
android:id="@+id/tv_source_action"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="wrap_content"
android:layout_margin="1dp" android:singleLine="true" />
android:gravity="center"
android:maxWidth="120dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:text="@string/book_source"
app:layout_constraintBottom_toBottomOf="@+id/tv_chapter_url"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:radius="2dp"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout> <LinearLayout
android:id="@+id/title_bar_addition"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_chapter_name"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true" />
<TextView
android:id="@+id/tv_chapter_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:visibility="gone" />
<TextView
android:id="@+id/tv_source_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingVertical="8dp"
android:text="@string/book_source" />
</LinearLayout>
</LinearLayout>
</io.legato.kazusa.ui.widget.TitleBar> </io.legato.kazusa.ui.widget.TitleBar>
<LinearLayout <LinearLayout
android:id="@+id/bottom_menu" android:id="@+id/bottom_menu"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:alpha="0.92"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"> app:layout_constraintBottom_toBottomOf="parent">
@@ -84,10 +80,8 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="20dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp" android:layout_marginVertical="8dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:orientation="horizontal"> android:orientation="horizontal">
@@ -99,12 +93,20 @@
app:icon="@drawable/ic_previous" app:icon="@drawable/ic_previous"
tools:ignore="TouchTargetSizeCheck" /> tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.slider.Slider <com.google.android.material.card.MaterialCardView
android:id="@+id/seek_read_page"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="25dp" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_weight="1"
android:layout_weight="1" /> app:cardBackgroundColor="?attr/colorSurfaceContainer"
app:cardCornerRadius="32dp"
app:strokeWidth="0dp">
<com.google.android.material.slider.Slider
android:id="@+id/seek_read_page"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/tv_next" android:id="@+id/tv_next"
@@ -114,6 +116,69 @@
app:icon="@drawable/ic_next" app:icon="@drawable/ic_next"
tools:ignore="TouchTargetSizeCheck" /> tools:ignore="TouchTargetSizeCheck" />
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/bottom_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorSurfaceContainer"
android:importantForAccessibility="no"
android:orientation="horizontal"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/iv_catalog"
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@android:color/transparent"
android:contentDescription="@string/chapter_list"
android:maxHeight="24dp"
android:tooltipText="@string/chapter_list"
app:icon="@drawable/ic_toc"
app:iconGravity="textStart"
tools:ignore="NestedWeights" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:importantForAccessibility="no" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_autoPage"
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@android:color/transparent"
android:contentDescription="@string/auto_next_page"
android:tooltipText="@string/auto_next_page"
app:icon="@drawable/ic_auto_page"
app:iconGravity="textStart"
tools:ignore="UnusedAttribute" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:importantForAccessibility="no" />
<com.google.android.material.button.MaterialButton
android:id="@+id/iv_setting"
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@android:color/transparent"
android:contentDescription="@string/setting"
android:maxHeight="24dp"
android:tooltipText="@string/setting"
app:icon="@drawable/ic_settings"
app:iconGravity="textStart"
tools:ignore="NestedWeights" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
@@ -66,9 +66,6 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</io.legato.kazusa.ui.widget.TitleBar> </io.legato.kazusa.ui.widget.TitleBar>
<LinearLayout <LinearLayout
-44
View File
@@ -17,12 +17,6 @@
android:title="@string/refresh" android:title="@string/refresh"
app:showAsAction="always" /> app:showAsAction="always" />
<item
android:id="@+id/menu_catalog"
android:icon="@drawable/ic_toc"
android:title="@string/chapter_list"
app:showAsAction="always" />
</group> </group>
<item <item
@@ -44,13 +38,6 @@
android:title="@string/disable_manga_click_scroll" android:title="@string/disable_manga_click_scroll"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/menu_enable_auto_page"
android:checkable="true"
android:checked="false"
android:title="@string/enable_auto_page_scroll"
app:showAsAction="never" />
<item <item
android:id="@+id/menu_enable_auto_scroll" android:id="@+id/menu_enable_auto_scroll"
android:checkable="true" android:checkable="true"
@@ -58,12 +45,6 @@
android:title="@string/enable_auto_scroll" android:title="@string/enable_auto_scroll"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/menu_manga_auto_page_speed"
android:title="@string/manga_auto_page_speed"
android:visible="false"
app:showAsAction="never" />
<item <item
android:id="@+id/menu_enable_horizontal_scroll" android:id="@+id/menu_enable_horizontal_scroll"
android:checkable="true" android:checkable="true"
@@ -79,11 +60,6 @@
android:visible="false" android:visible="false"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/menu_manga_footer_config"
android:title="@string/manga_footer_config"
app:showAsAction="never" />
<item <item
android:id="@+id/menu_manga_color_filter" android:id="@+id/menu_manga_color_filter"
android:title="@string/manga_color_filter" android:title="@string/manga_color_filter"
@@ -96,24 +72,4 @@
android:title="@string/hide_manga_title" android:title="@string/hide_manga_title"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/menu_epaper_manga"
android:checkable="true"
android:checked="false"
android:title="@string/manga_epaper"
app:showAsAction="never" />
<item
android:id="@+id/menu_epaper_manga_setting"
android:title="@string/manga_epaper_stting"
android:visible="false"
app:showAsAction="never" />
<item
android:id="@+id/menu_gray_manga"
android:checkable="true"
android:checked="false"
android:title="@string/enable_manga_gray"
app:showAsAction="never" />
</menu> </menu>
+4 -4
View File
@@ -1200,15 +1200,15 @@
<string name="book_reader_info_bar">页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%%</string> <string name="book_reader_info_bar">页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%%</string>
<string name="menu_download_after">下载之后章节</string> <string name="menu_download_after">下载之后章节</string>
<string name="menu_download_all">下载全部章节</string> <string name="menu_download_all">下载全部章节</string>
<string name="manga_header_chapter">《章节和文案》隐藏</string> <string name="manga_header_chapter">章节显示设置</string>
<string name="manga_check_chapter_label">《章节.》文案</string> <string name="manga_check_chapter_label">章节</string>
<string name="manga_check_chapter">章节</string> <string name="manga_check_chapter">章节</string>
<string name="manga_check_chapter_name">章节名称</string> <string name="manga_check_chapter_name">章节名称</string>
<string name="manga_header_page">《页数和文案》隐藏</string> <string name="manga_header_page">《页数和文案》隐藏</string>
<string name="manga_check_page_label">《页数.》文案</string> <string name="manga_check_page_label">页数</string>
<string name="manga_check_page_number">页数</string> <string name="manga_check_page_number">页数</string>
<string name="manga_header_progress">《总进度和文案》隐藏</string> <string name="manga_header_progress">《总进度和文案》隐藏</string>
<string name="manga_check_progress_label">《总进度.》文案</string> <string name="manga_check_progress_label">总进度</string>
<string name="manga_check_progress">总进度</string> <string name="manga_check_progress">总进度</string>
<string name="manga_header_footer">页脚</string> <string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string> <string name="manga_radio_left">靠左</string>