修复漫画阅读点击翻页的一些问题

新增设置某漫画阅读模式为默认值的功能
新增长按保存图片的开关
This commit is contained in:
HapeLee
2025-10-20 23:18:17 +08:00
parent e56ca0a11a
commit 3615c84619
10 changed files with 76 additions and 29 deletions
@@ -191,7 +191,7 @@ object PreferKey {
const val mangaClickActionBL = "mangaClickActionBottomLeft"
const val mangaClickActionBC = "mangaClickActionBottomCenter"
const val mangaClickActionBR = "mangaClickActionBottomRight"
const val mangaLongClick = "mangaLongClick"
const val permissionChecked = "permissionChecked"
const val notificationsPost = "notificationsPost"
const val ignoreBatteryPermission = "ignoreBatteryPermission"
@@ -205,6 +205,5 @@ object PreferKey {
const val pureBlack = "pure_black"
const val labelVisibilityMode = "labelVisibilityMode"
const val menuAlpha = "menuAlpha"
const val colorImage = "colorImage"
}
@@ -749,11 +749,17 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
//漫画滚动方式
var mangaScrollMode: Int
get() = appCtx.getPrefInt(PreferKey.mangaScrollMode, MangaScrollMode.PAGE_RIGHT_TO_LEFT)
get() = appCtx.getPrefInt(PreferKey.mangaScrollMode, MangaScrollMode.WEBTOON)
set(value) {
appCtx.putPrefInt(PreferKey.mangaScrollMode, value)
}
var mangaLongClick
get() = appCtx.getPrefBoolean(PreferKey.mangaLongClick, true)
set(value) {
appCtx.putPrefBoolean(PreferKey.mangaLongClick, value)
}
//漫画滤镜
var mangaColorFilter
get() = appCtx.getPrefString(PreferKey.mangaColorFilter, "")
@@ -24,6 +24,7 @@ import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
import com.bumptech.glide.util.FixedPreloadSizeProvider
import com.google.android.material.transition.platform.MaterialContainerTransform
import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback
import io.legato.kazusa.BuildConfig
import io.legato.kazusa.R
import io.legato.kazusa.base.VMBaseActivity
@@ -163,6 +164,8 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
override fun onCreate(savedInstanceState: Bundle?) {
setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback())
val transform = MaterialContainerTransform().apply {
addTarget(binding.rootView)
scrimColor = Color.TRANSPARENT
@@ -195,9 +198,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
?: MangaFooterConfig()
onBackPressedDispatcher.addCallback(this) {
finish()
}
}
override fun observeLiveBus() {
@@ -228,7 +228,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
itemAnimator = null
layoutManager = mLayoutManager
setHasFixedSize(true)
setDisableClickScroll(AppConfig.disableClickScroll)
setDisableMangaScale(AppConfig.disableMangaScale)
setRecyclerViewPreloader(AppConfig.mangaPreDownloadNum)
setPreScrollListener { _, _, _, position ->
@@ -622,7 +621,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
//点击滑动
override fun onClickScrollDisabledChanged(disabled: Boolean) {
AppConfig.disableClickScroll = disabled
setDisableClickScroll(disabled)
}
//双击缩放
@@ -671,6 +669,10 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
// }
}
override fun onMangaLongClickChanged(checked: Boolean) {
AppConfig.mangaLongClick = checked
}
override fun onVolumeKeyPageChanged(enable: Boolean) {
AppConfig.MangaVolumeKeyPage = enable
}
@@ -715,7 +717,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
override fun upSystemUiVisibility(menuIsVisible: Boolean) {
toggleSystemBar(menuIsVisible)
if (enableAutoScroll) {
@@ -726,7 +727,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
/**
* 调整漫画类型
* @param mode 漫画类型
@@ -820,10 +820,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
}
private fun setDisableClickScroll(disable: Boolean) {
binding.webtoonFrame.disabledClickScroll = disable
}
private fun upLayoutInDisplayCutoutMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes = window.attributes.apply {
@@ -834,11 +830,18 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
private fun scrollToNext() {
scrollPageTo(1)
if (!AppConfig.disableClickScroll)
scrollPageTo(1)
}
private fun scrollToPrev() {
scrollPageTo(-1)
if (!AppConfig.disableClickScroll)
scrollPageTo(-1)
}
private fun isHorizontalScroll(): Boolean {
return scrollMode == MangaScrollMode.PAGE_LEFT_TO_RIGHT ||
scrollMode == MangaScrollMode.PAGE_RIGHT_TO_LEFT
}
private fun scrollPageTo(direction: Int) {
@@ -847,7 +850,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
var dx = 0
var dy = 0
if (AppConfig.enableMangaHorizontalScroll) {
if (isHorizontalScroll()) {
dx = binding.recyclerView.run {
width - paddingStart - paddingEnd
}
@@ -17,6 +17,7 @@ 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.toastOnUi
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
class MangaFooterSettingDialog :
@@ -26,7 +27,7 @@ class MangaFooterSettingDialog :
?: MangaFooterConfig()
var initialWebtoonSidePadding: Int = 0
var initialScrollMode: Int = MangaScrollMode.PAGE_RIGHT_TO_LEFT
var initialScrollMode: Int = MangaScrollMode.WEBTOON
var callback: Callback? = null
@@ -53,13 +54,17 @@ class MangaFooterSettingDialog :
binding.llWebtoon.isVisible = mode == MangaScrollMode.WEBTOON ||
mode == MangaScrollMode.WEBTOON_WITH_GAP
}
setOnLongClickListener {
AppConfig.mangaScrollMode = mode
toastOnUi("已设置为全局默认模式")
true
}
})
}
binding.llWebtoon.isVisible = initialScrollMode == MangaScrollMode.WEBTOON ||
initialScrollMode == MangaScrollMode.WEBTOON_WITH_GAP
binding.scvPadding.apply {
valueFormat = { "$it %" }
progress = initialWebtoonSidePadding
@@ -96,6 +101,13 @@ class MangaFooterSettingDialog :
}
}
binding.checkboxMangaLongClick.apply {
isChecked = AppConfig.mangaLongClick
setOnCheckedChangeListener { _, isChecked ->
callback?.onMangaLongClickChanged(isChecked)
}
}
binding.cbChapterLabel.run {
isChecked = !config.hideChapterLabel
setOnCheckedChangeListener { _, isChecked ->
@@ -256,6 +268,7 @@ class MangaFooterSettingDialog :
fun onMangaScaleDisabledChanged(disabled: Boolean)
fun onHideMangaTitleChanged(hide: Boolean)
fun onVolumeKeyPageChanged(enable: Boolean)
fun onMangaLongClickChanged(checked: Boolean)
}
}
@@ -41,16 +41,18 @@ class WebtoonFrame : FrameLayout {
private val recycler: WebtoonRecyclerView?
get() = getChildAt(0) as? WebtoonRecyclerView
var disabledClickScroll = false
var actionHandler: ClickActionHandler? = null
private val gestureDetector =
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
recycler?.let {
val centerPos = it.findCenterViewPosition()
if (centerPos != RecyclerView.NO_POSITION) {
longPressListener?.invoke(centerPos)
if (AppConfig.mangaLongClick)
{
recycler?.let {
val centerPos = it.findCenterViewPosition()
if (centerPos != RecyclerView.NO_POSITION) {
longPressListener?.invoke(centerPos)
}
}
}
}