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

新增设置某漫画阅读模式为默认值的功能
新增长按保存图片的开关
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 mangaClickActionBL = "mangaClickActionBottomLeft"
const val mangaClickActionBC = "mangaClickActionBottomCenter" const val mangaClickActionBC = "mangaClickActionBottomCenter"
const val mangaClickActionBR = "mangaClickActionBottomRight" const val mangaClickActionBR = "mangaClickActionBottomRight"
const val mangaLongClick = "mangaLongClick"
const val permissionChecked = "permissionChecked" const val permissionChecked = "permissionChecked"
const val notificationsPost = "notificationsPost" const val notificationsPost = "notificationsPost"
const val ignoreBatteryPermission = "ignoreBatteryPermission" const val ignoreBatteryPermission = "ignoreBatteryPermission"
@@ -205,6 +205,5 @@ object PreferKey {
const val pureBlack = "pure_black" const val pureBlack = "pure_black"
const val labelVisibilityMode = "labelVisibilityMode" const val labelVisibilityMode = "labelVisibilityMode"
const val menuAlpha = "menuAlpha" const val menuAlpha = "menuAlpha"
const val colorImage = "colorImage" const val colorImage = "colorImage"
} }
@@ -749,11 +749,17 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
//漫画滚动方式 //漫画滚动方式
var mangaScrollMode: Int var mangaScrollMode: Int
get() = appCtx.getPrefInt(PreferKey.mangaScrollMode, MangaScrollMode.PAGE_RIGHT_TO_LEFT) get() = appCtx.getPrefInt(PreferKey.mangaScrollMode, MangaScrollMode.WEBTOON)
set(value) { set(value) {
appCtx.putPrefInt(PreferKey.mangaScrollMode, value) appCtx.putPrefInt(PreferKey.mangaScrollMode, value)
} }
var mangaLongClick
get() = appCtx.getPrefBoolean(PreferKey.mangaLongClick, true)
set(value) {
appCtx.putPrefBoolean(PreferKey.mangaLongClick, value)
}
//漫画滤镜 //漫画滤镜
var mangaColorFilter var mangaColorFilter
get() = appCtx.getPrefString(PreferKey.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.request.target.Target.SIZE_ORIGINAL
import com.bumptech.glide.util.FixedPreloadSizeProvider import com.bumptech.glide.util.FixedPreloadSizeProvider
import com.google.android.material.transition.platform.MaterialContainerTransform 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.BuildConfig
import io.legato.kazusa.R import io.legato.kazusa.R
import io.legato.kazusa.base.VMBaseActivity import io.legato.kazusa.base.VMBaseActivity
@@ -163,6 +164,8 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback())
val transform = MaterialContainerTransform().apply { val transform = MaterialContainerTransform().apply {
addTarget(binding.rootView) addTarget(binding.rootView)
scrimColor = Color.TRANSPARENT scrimColor = Color.TRANSPARENT
@@ -195,9 +198,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull() GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
?: MangaFooterConfig() ?: MangaFooterConfig()
onBackPressedDispatcher.addCallback(this) {
finish()
}
} }
override fun observeLiveBus() { override fun observeLiveBus() {
@@ -228,7 +228,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
itemAnimator = null itemAnimator = null
layoutManager = mLayoutManager layoutManager = mLayoutManager
setHasFixedSize(true) setHasFixedSize(true)
setDisableClickScroll(AppConfig.disableClickScroll)
setDisableMangaScale(AppConfig.disableMangaScale) setDisableMangaScale(AppConfig.disableMangaScale)
setRecyclerViewPreloader(AppConfig.mangaPreDownloadNum) setRecyclerViewPreloader(AppConfig.mangaPreDownloadNum)
setPreScrollListener { _, _, _, position -> setPreScrollListener { _, _, _, position ->
@@ -622,7 +621,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
//点击滑动 //点击滑动
override fun onClickScrollDisabledChanged(disabled: Boolean) { override fun onClickScrollDisabledChanged(disabled: Boolean) {
AppConfig.disableClickScroll = disabled 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) { override fun onVolumeKeyPageChanged(enable: Boolean) {
AppConfig.MangaVolumeKeyPage = enable AppConfig.MangaVolumeKeyPage = enable
} }
@@ -715,7 +717,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
} }
override fun upSystemUiVisibility(menuIsVisible: Boolean) { override fun upSystemUiVisibility(menuIsVisible: Boolean) {
toggleSystemBar(menuIsVisible) toggleSystemBar(menuIsVisible)
if (enableAutoScroll) { if (enableAutoScroll) {
@@ -726,7 +727,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
} }
/** /**
* 调整漫画类型 * 调整漫画类型
* @param mode 漫画类型 * @param mode 漫画类型
@@ -820,10 +820,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
} }
private fun setDisableClickScroll(disable: Boolean) {
binding.webtoonFrame.disabledClickScroll = disable
}
private fun upLayoutInDisplayCutoutMode() { private fun upLayoutInDisplayCutoutMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes = window.attributes.apply { window.attributes = window.attributes.apply {
@@ -834,11 +830,18 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
private fun scrollToNext() { private fun scrollToNext() {
scrollPageTo(1) if (!AppConfig.disableClickScroll)
scrollPageTo(1)
} }
private fun scrollToPrev() { 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) { private fun scrollPageTo(direction: Int) {
@@ -847,7 +850,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
var dx = 0 var dx = 0
var dy = 0 var dy = 0
if (AppConfig.enableMangaHorizontalScroll) { if (isHorizontalScroll()) {
dx = binding.recyclerView.run { dx = binding.recyclerView.run {
width - paddingStart - paddingEnd 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.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.toastOnUi
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
class MangaFooterSettingDialog : class MangaFooterSettingDialog :
@@ -26,7 +27,7 @@ class MangaFooterSettingDialog :
?: MangaFooterConfig() ?: MangaFooterConfig()
var initialWebtoonSidePadding: Int = 0 var initialWebtoonSidePadding: Int = 0
var initialScrollMode: Int = MangaScrollMode.PAGE_RIGHT_TO_LEFT var initialScrollMode: Int = MangaScrollMode.WEBTOON
var callback: Callback? = null var callback: Callback? = null
@@ -53,13 +54,17 @@ class MangaFooterSettingDialog :
binding.llWebtoon.isVisible = mode == MangaScrollMode.WEBTOON || binding.llWebtoon.isVisible = mode == MangaScrollMode.WEBTOON ||
mode == MangaScrollMode.WEBTOON_WITH_GAP mode == MangaScrollMode.WEBTOON_WITH_GAP
} }
setOnLongClickListener {
AppConfig.mangaScrollMode = mode
toastOnUi("已设置为全局默认模式")
true
}
}) })
} }
binding.llWebtoon.isVisible = initialScrollMode == MangaScrollMode.WEBTOON || binding.llWebtoon.isVisible = initialScrollMode == MangaScrollMode.WEBTOON ||
initialScrollMode == MangaScrollMode.WEBTOON_WITH_GAP initialScrollMode == MangaScrollMode.WEBTOON_WITH_GAP
binding.scvPadding.apply { binding.scvPadding.apply {
valueFormat = { "$it %" } valueFormat = { "$it %" }
progress = initialWebtoonSidePadding progress = initialWebtoonSidePadding
@@ -96,6 +101,13 @@ class MangaFooterSettingDialog :
} }
} }
binding.checkboxMangaLongClick.apply {
isChecked = AppConfig.mangaLongClick
setOnCheckedChangeListener { _, isChecked ->
callback?.onMangaLongClickChanged(isChecked)
}
}
binding.cbChapterLabel.run { binding.cbChapterLabel.run {
isChecked = !config.hideChapterLabel isChecked = !config.hideChapterLabel
setOnCheckedChangeListener { _, isChecked -> setOnCheckedChangeListener { _, isChecked ->
@@ -256,6 +268,7 @@ class MangaFooterSettingDialog :
fun onMangaScaleDisabledChanged(disabled: Boolean) fun onMangaScaleDisabledChanged(disabled: Boolean)
fun onHideMangaTitleChanged(hide: Boolean) fun onHideMangaTitleChanged(hide: Boolean)
fun onVolumeKeyPageChanged(enable: Boolean) fun onVolumeKeyPageChanged(enable: Boolean)
fun onMangaLongClickChanged(checked: Boolean)
} }
} }
@@ -41,16 +41,18 @@ class WebtoonFrame : FrameLayout {
private val recycler: WebtoonRecyclerView? private val recycler: WebtoonRecyclerView?
get() = getChildAt(0) as? WebtoonRecyclerView get() = getChildAt(0) as? WebtoonRecyclerView
var disabledClickScroll = false
var actionHandler: ClickActionHandler? = null var actionHandler: ClickActionHandler? = null
private val gestureDetector = private val gestureDetector =
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() { GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) { override fun onLongPress(e: MotionEvent) {
recycler?.let { if (AppConfig.mangaLongClick)
val centerPos = it.findCenterViewPosition() {
if (centerPos != RecyclerView.NO_POSITION) { recycler?.let {
longPressListener?.invoke(centerPos) val centerPos = it.findCenterViewPosition()
if (centerPos != RecyclerView.NO_POSITION) {
longPressListener?.invoke(centerPos)
}
} }
} }
} }
+2 -2
View File
@@ -71,7 +71,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:visibility="visible"> android:visibility="gone">
<io.legato.kazusa.ui.widget.EmptyMessageView <io.legato.kazusa.ui.widget.EmptyMessageView
android:id="@+id/tv_msg2" android:id="@+id/tv_msg2"
@@ -89,7 +89,7 @@
android:layout_margin="16dp" android:layout_margin="16dp"
app:iconPadding="4dp" app:iconPadding="4dp"
android:text="@string/load_error_retry" android:text="@string/load_error_retry"
tools:visibility="visible" /> />
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -40,10 +41,20 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="16dp" android:paddingHorizontal="16dp"
android:paddingVertical="8dp" android:paddingTop="8dp"
android:text="@string/read_type" android:text="@string/read_type"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingBottom="8dp"
android:textSize="9sp"
android:text="@string/read_type_long"
android:textStyle="bold"
tools:ignore="SmallSp" />
<com.google.android.material.chip.ChipGroup <com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroupScrollMode" android:id="@+id/chipGroupScrollMode"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -250,6 +261,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/volume_key_page" /> android:text="@string/volume_key_page" />
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkboxMangaLongClick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/manga_long_click" />
</LinearLayout> </LinearLayout>
<com.google.android.material.button.MaterialButtonGroup <com.google.android.material.button.MaterialButtonGroup
@@ -3,6 +3,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_marginVertical="8dp" android:layout_marginVertical="8dp"
android:orientation="vertical"> android:orientation="vertical">
@@ -38,10 +39,12 @@
android:id="@+id/tv_seek_value" android:id="@+id/tv_seek_value"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="12dp" android:textStyle="bold"
android:textSize="11sp"
android:paddingHorizontal="8dp"
android:paddingVertical="4dp" android:paddingVertical="4dp"
android:singleLine="true" android:singleLine="true"
android:text="" /> tools:text="123" />
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
</LinearLayout> </LinearLayout>
+2
View File
@@ -1301,4 +1301,6 @@
<string name="restart_later_message">更改将在下次启动应用时生效</string> <string name="restart_later_message">更改将在下次启动应用时生效</string>
<string name="search_select_group">选择书源分组</string> <string name="search_select_group">选择书源分组</string>
<string name="day_night_switch">深浅色模式开关</string> <string name="day_night_switch">深浅色模式开关</string>
<string name="manga_long_click">长按保存图片</string>
<string name="read_type_long">长按设置为全局默认模式</string>
</resources> </resources>
+2
View File
@@ -1302,4 +1302,6 @@
<string name="restart_later_message">稍后重启</string> <string name="restart_later_message">稍后重启</string>
<string name="search_select_group">选择书源分组</string> <string name="search_select_group">选择书源分组</string>
<string name="day_night_switch">深浅色模式开关</string> <string name="day_night_switch">深浅色模式开关</string>
<string name="manga_long_click">长按保存图片</string>
<string name="read_type_long">长按设置为全局默认模式</string>
</resources> </resources>