From 169d3606011a99d3cadf2d4f8ddcbc151219234c Mon Sep 17 00:00:00 2001 From: lhjgege <1079947827@qq.com> Date: Wed, 19 Feb 2025 13:17:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=82=B9=E5=87=BB=E5=B1=8F?= =?UTF-8?q?=E5=B9=95=E4=B8=8B=E9=83=A8=E5=88=86=E5=8F=B3=E8=BE=B9=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E9=A1=B5=EF=BC=8C=E5=B7=A6=E9=83=A8=E5=88=86=E4=B8=8A?= =?UTF-8?q?=E4=B8=80=E9=A1=B5=20(#4716)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加点击屏幕下部分右边下一页,左部分上一页 * 优化 --- .../java/io/legado/app/constant/PreferKey.kt | 1 + .../io/legado/app/help/config/AppConfig.kt | 7 ++ .../app/ui/book/manga/ReadMangaActivity.kt | 76 ++++++++++++++++++- .../ui/book/manga/rv/WebtoonRecyclerView.kt | 5 +- app/src/main/res/menu/book_manga.xml | 7 ++ app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 101 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index fdd7cc341..7ba82fb53 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -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" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index f4bb260b9..5f45e3e9e 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -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) + } } diff --git a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt index a0c71bb12..62f9f0599 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt @@ -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() 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( this@ReadMangaActivity.resources.displayMetrics.widthPixels, SIZE_ORIGINAL @@ -83,7 +98,16 @@ class ReadMangaActivity : VMBaseActivity() } 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? = null @@ -138,6 +162,7 @@ class ReadMangaActivity : VMBaseActivity() 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() binding.mangaMenu.runMenuIn() } } + onNextPage { + scrollToNext() + } + onPrevPage { + scrollToPrev() + } } binding.tvRetry.setOnClickListener { binding.llLoading.isVisible = true @@ -405,6 +436,12 @@ class ReadMangaActivity : VMBaseActivity() 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() 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() } } + 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() } } } + + 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) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt index eaa8428cf..93455d9b4 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt @@ -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() } diff --git a/app/src/main/res/menu/book_manga.xml b/app/src/main/res/menu/book_manga.xml index 031344c52..012befb07 100644 --- a/app/src/main/res/menu/book_manga.xml +++ b/app/src/main/res/menu/book_manga.xml @@ -37,4 +37,11 @@ android:checked="false" android:title="@string/disable_manga_scaling" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index e09eebcf6..4dd8a8669 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1184,6 +1184,7 @@ 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% Descargar el siguiente capítulo Descargar todos los capítulos diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index ec60936af..cd07b0dc3 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1187,6 +1187,7 @@ 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% 下载之后章节 下载全部章节 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 50bc2b84b..50f99a5a0 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1187,6 +1187,7 @@ 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% Faça o download do próximo capítulo Download de todos os capítulos diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index c78691e0f..54f9d56ad 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1183,6 +1183,7 @@ Còn 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% Tải xuống chương tiếp theo Tải xuống tất cả các chương diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 31a49b75b..3e4f9b566 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1184,6 +1184,7 @@ 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% 下載之後章節 下載全部章節 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9aacbe221..a07846657 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1186,6 +1186,7 @@ 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% 下載之後章節 下載全部章節 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index d7202a8af..ce790d57f 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1186,6 +1186,7 @@ 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% 下载之后章节 下载全部章节 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 986edda6a..7964f7473 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1187,6 +1187,7 @@ 主题配置 漫画浏览 禁用漫画缩放 + 禁用点击翻页 页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%% Download the chapter after Download all chapter