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

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

* 优化
This commit is contained in:
lhjgege
2025-02-19 13:17:28 +08:00
committed by GitHub
parent 0653486f2c
commit dbfe7a6d86
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()
}