Просмотр исходного кода

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

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

* 优化
lhjgege 1 год назад
Родитель
Сommit
dbfe7a6d86

+ 1 - 0
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"

+ 7 - 0
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)
+        }
 }
 

+ 75 - 1
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<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)
+    }
 }

+ 3 - 2
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()
                 }
 

+ 7 - 0
app/src/main/res/menu/book_manga.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-es-rES/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-ja-rJP/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-pt-rBR/strings.xml

@@ -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 - 0
app/src/main/res/values-vi/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-zh-rHK/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-zh-rTW/strings.xml

@@ -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 - 0
app/src/main/res/values-zh/strings.xml

@@ -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 - 0
app/src/main/res/values/strings.xml

@@ -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>