增加点击屏幕下部分右边下一页,左部分上一页 (#4716)

* 增加点击屏幕下部分右边下一页,左部分上一页

* 优化
This commit is contained in:
lhjgege
2025-02-19 13:17:28 +08:00
committed by GitHub
parent 82b6710b92
commit 169d360601
13 changed files with 101 additions and 3 deletions
@@ -97,6 +97,7 @@ object PreferKey {
const val preDownloadNum = "preDownloadNum"
const val mangaPreDownloadNum = "mangaPreDownloadNum"
const val singlePageScrolling = "singlePageScrolling"
const val disableClickScroller = "disableClickScroller"
const val autoRefresh = "auto_refresh"
const val defaultToRead = "defaultToRead"
const val exportCharset = "exportCharset"
@@ -629,5 +629,12 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
set(value) {
appCtx.putPrefBoolean(PreferKey.singlePageScrolling, value)
}
//点击翻页
var disableClickScroller
get() = appCtx.getPrefBoolean(PreferKey.disableClickScroller, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.disableClickScroller, value)
}
}
@@ -8,13 +8,16 @@ import android.os.Looper
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
@@ -76,6 +79,18 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
AppConfig.disableMangaScaling
}
private val mDisableClickScroller by lazy {
AppConfig.disableClickScroller
}
private val mSmoothScroller by lazy {
object : LinearSmoothScroller(this@ReadMangaActivity) {
override fun getVerticalSnapPreference(): Int {
return SNAP_TO_START
}
}
}
private val mSizeProvider by lazy {
FixedPreloadSizeProvider<Any>(
this@ReadMangaActivity.resources.displayMetrics.widthPixels, SIZE_ORIGINAL
@@ -83,7 +98,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}
private val mPagerSnapHelper: PagerSnapHelper by lazy {
PagerSnapHelper()
object : PagerSnapHelper() {
override fun calculateDistanceToFinalSnap(
layoutManager: RecyclerView.LayoutManager,
targetView: View
): IntArray {
val out = IntArray(2)
out[1] = targetView.top - binding.mRecyclerMange.paddingTop
return out
}
}
}
private var mRecyclerViewPreloader: RecyclerViewPreloader<Any>? = null
@@ -138,6 +162,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
mLayoutManager.isItemPrefetchEnabled = true
setItemViewCacheSize(AppConfig.preDownloadNum)
singlePagerScroller(mSinglePageScroller)
disabledClickScroller(mDisableClickScroller)
setPreScrollListener { _, _, dy, position ->
if (dy > 0 && position + 2 > mAdapter.getCurrentList().size - 3) {
if (mAdapter.getCurrentList().last() is ReaderLoading) {
@@ -176,6 +201,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
binding.mangaMenu.runMenuIn()
}
}
onNextPage {
scrollToNext()
}
onPrevPage {
scrollToPrev()
}
}
binding.tvRetry.setOnClickListener {
binding.llLoading.isVisible = true
@@ -405,6 +436,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
AppConfig.disableMangaScaling = item.isChecked
disableMangaScaling(item.isChecked)
}
R.id.menu_disable_click_scroller -> {
item.isChecked = !item.isChecked
AppConfig.disableClickScroller = item.isChecked
disabledClickScroller(item.isChecked)
}
}
return super.onCompatOptionsItemSelected(item)
}
@@ -464,6 +501,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
getString(R.string.pre_download_m, mPreDownloadNum)
menu.findItem(R.id.menu_scroller_page).isChecked = mSinglePageScroller
menu.findItem(R.id.menu_disable_manga_scaling).isChecked = mDisableMangaScaling
menu.findItem(R.id.menu_disable_click_scroller).isChecked = mDisableClickScroller
}
private fun disableMangaScaling(disable: Boolean) {
@@ -474,6 +512,10 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}
}
private fun disabledClickScroller(disable: Boolean) {
binding.mRecyclerMange.disabledClickScroller = disable
}
private fun upLayoutInDisplayCutoutMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes = window.attributes.apply {
@@ -482,4 +524,36 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}
}
}
private fun scrollToNext() {
val lastCompletelyVisiblePosition = mLayoutManager.findLastCompletelyVisibleItemPosition()
val nextPosition = if (lastCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
lastCompletelyVisiblePosition + 1
} else {
mLayoutManager.findFirstVisibleItemPosition() + 1
}
if (nextPosition > mAdapter.getCurrentList().lastIndex) {
return
}
smoothScrollToPosition(nextPosition)
}
private fun scrollToPrev() {
val firstCompletelyVisiblePosition = mLayoutManager.findFirstCompletelyVisibleItemPosition()
val prevPosition = if (firstCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
firstCompletelyVisiblePosition - 1
} else {
mLayoutManager.findFirstVisibleItemPosition() - 1
}
if (prevPosition < 0) {
return
}
smoothScrollToPosition(prevPosition)
}
private fun smoothScrollToPosition(position: Int) {
mSmoothScroller.targetPosition = position
mLayoutManager.startSmoothScroll(mSmoothScroller)
}
}
@@ -49,6 +49,7 @@ class WebtoonRecyclerView @JvmOverloads constructor(
var tapListener: ((MotionEvent) -> Unit)? = null
var longTapListener: ((MotionEvent) -> Boolean)? = null
var disableMangaScaling = false
var disabledClickScroller = false
private var mToucheMiddle: (() -> Unit)? = null
fun onToucheMiddle(init: () -> Unit) = apply { this.mToucheMiddle = init }
@@ -256,11 +257,11 @@ class WebtoonRecyclerView @JvmOverloads constructor(
mToucheMiddle?.invoke()
}
blRect.contains(startX, startY) -> {
blRect.contains(startX, startY) && !disabledClickScroller -> {
mPrevPage?.invoke()
}
brRect.contains(startX, startY) -> {
brRect.contains(startX, startY) && !disabledClickScroller-> {
mNextPage?.invoke()
}
+7
View File
@@ -37,4 +37,11 @@
android:checked="false"
android:title="@string/disable_manga_scaling"
app:showAsAction="never" />
<item
android:id="@+id/menu_disable_click_scroller"
android:checkable="true"
android:checked="false"
android:title="@string/disable_manga_click_scroller"
app:showAsAction="never" />
</menu>
@@ -1184,6 +1184,7 @@
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</string>
<string name="book_reader_info_bar">页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%%</string>
<string name="menu_download_after">Descargar el siguiente capítulo</string>
<string name="menu_download_all">Descargar todos los capítulos</string>
@@ -1187,6 +1187,7 @@
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</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_all">下载全部章节</string>
@@ -1187,6 +1187,7 @@
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</string>
<string name="book_reader_info_bar">页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%%</string>
<string name="menu_download_after">Faça o download do próximo capítulo</string>
<string name="menu_download_all">Download de todos os capítulos</string>
+1
View File
@@ -1183,6 +1183,7 @@ Còn </string>
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</string>
<string name="book_reader_info_bar">页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%%</string>
<string name="menu_download_after">Tải xuống chương tiếp theo</string>
<string name="menu_download_all">Tải xuống tất cả các chương</string>
@@ -1184,6 +1184,7 @@
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</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_all">下載全部章節</string>
@@ -1186,6 +1186,7 @@
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</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_all">下載全部章節</string>
+1
View File
@@ -1186,6 +1186,7 @@
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</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_all">下载全部章节</string>
+1
View File
@@ -1187,6 +1187,7 @@
<string name="theme_config">主题配置</string>
<string name="show_mange_ui">漫画浏览</string>
<string name="disable_manga_scaling">禁用漫画缩放</string>
<string name="disable_manga_click_scroller">禁用点击翻页</string>
<string name="book_reader_info_bar">页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%%</string>
<string name="menu_download_after">Download the chapter after</string>
<string name="menu_download_all">Download all chapter</string>