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

增加自动滚动 (#4851)

* 修复当前屏幕可见图未设置滤镜

* ...

* 增加章节进度条

* 优化

* 增加自动滚动

* 优化卡顿

* ....
lhjgege 1 год назад
Родитель
Сommit
0b55a902a6

+ 1 - 0
app/src/main/java/io/legado/app/model/ReadManga.kt

@@ -602,5 +602,6 @@ object ReadManga : CoroutineScope by MainScope() {
         fun sureNewProgress(progress: BookProgress)
         fun showLoading()
         fun startLoad()
+        fun scrollBy(delta: Int)
     }
 }

+ 66 - 4
app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt

@@ -48,6 +48,7 @@ import io.legado.app.ui.book.manga.config.MangaFooterSettingDialog
 import io.legado.app.ui.book.manga.entities.BaseMangaPage
 import io.legado.app.ui.book.manga.entities.MangaPage
 import io.legado.app.ui.book.manga.recyclerview.MangaAdapter
+import io.legado.app.ui.book.manga.recyclerview.ScrollTimer
 import io.legado.app.ui.book.read.MangaMenu
 import io.legado.app.ui.book.read.ReadBookActivity.Companion.RESULT_DELETED
 import io.legado.app.ui.book.toc.TocActivityResult
@@ -93,6 +94,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
     }
 
     private var isAutoScrollPage = false
+    private var isAutoScroll = false
 
     private val mMangaColorFilter: MangaColorFilterConfig by lazy {
         GSON.fromJsonObject<MangaColorFilterConfig>(AppConfig.mangaColorFilter).getOrNull()
@@ -120,6 +122,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
 
     private var justInitData: Boolean = false
     private var syncDialog: AlertDialog? = null
+    private lateinit var mScrollTimer: ScrollTimer
+    private var enableAutoPageScroll = false
+    private var enableAutoScroll = false
 
     private val loadMoreView by lazy {
         LoadMoreView(this).apply {
@@ -176,6 +181,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
         mMangaFooterConfig =
             GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
                 ?: MangaFooterConfig()
+        mScrollTimer = ScrollTimer(this).apply {
+            setSpeed(AppConfig.mangaAutoPageSpeed)
+        }
     }
 
     override fun observeLiveBus() {
@@ -348,6 +356,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
             }
         }
         startAutoPage()
+        if (isAutoScroll) {
+            mScrollTimer.isEnabled = true
+        }
     }
 
     override fun onPause() {
@@ -366,6 +377,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
         ReadManga.cancelPreDownloadTask()
         networkChangedListener.unRegister()
         stopAutoPage()
+        mScrollTimer.isEnabled = false
     }
 
     override fun loadFail(msg: String) {
@@ -413,6 +425,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
         }
     }
 
+    override fun scrollBy(delta: Int) {
+        if (binding.mRecyclerManga.isAtBottom()) {
+            return
+        }
+        binding.mRecyclerManga.smoothScrollBy(
+            if (mAdapter.isHorizontal) delta else 0,
+            if (mAdapter.isHorizontal) 0 else delta, null, 16
+        )
+    }
+
     override val oldBook: Book?
         get() = ReadManga.book
 
@@ -498,15 +520,29 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
                     stopAutoPage()
                     menuMangaAutoPageSpeed?.isVisible = false
                 }
+                enableAutoPageScroll = item.isChecked
+                enableAutoScroll = false
+                mScrollTimer.isEnabled = false
+                isAutoScroll = false
+                mMenu?.findItem(R.id.menu_enable_auto_scroll)?.isChecked = false
             }
 
             R.id.menu_manga_auto_page_speed -> {
-                showNumberPickerDialog(1, getString(R.string.setting_manga_auto_page_speed), 3) {
+                val mangaAutoPage = mMenu?.findItem(R.id.menu_enable_auto_page)
+                val mangaAutoScroll = mMenu?.findItem(R.id.menu_enable_auto_scroll)
+                showNumberPickerDialog(
+                    1, getString(R.string.setting_manga_auto_page_speed),
+                    AppConfig.mangaAutoPageSpeed
+                ) {
                     AppConfig.mangaAutoPageSpeed = it
                     mMangaAutoPageSpeed = it
                     item.title = getString(R.string.manga_auto_page_speed, it)
-                    stopAutoPage()
-                    startAutoPage()
+                    if (mangaAutoScroll?.isChecked == true) {
+                        mScrollTimer.setSpeed(it)
+                    }
+                    if (mangaAutoPage?.isChecked == true) {
+                        startAutoPage()
+                    }
                 }
             }
 
@@ -525,6 +561,19 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
                 binding.mangaMenu.runMenuOut()
                 showDialogFragment(MangaColorFilterDialog())
             }
+
+            R.id.menu_enable_auto_scroll -> {
+                item.isChecked = !item.isChecked
+                mScrollTimer.isEnabled = item.isChecked
+                mMenu?.findItem(R.id.menu_enable_auto_page)?.isChecked = false
+                enableAutoScroll = item.isChecked
+                enableAutoPageScroll = false
+                isAutoScrollPage = false
+                isAutoScroll = item.isChecked
+                stopAutoPage()
+                mMenu?.findItem(R.id.menu_manga_auto_page_speed)?.isVisible = item.isChecked
+                mPagerSnapHelper.attachToRecyclerView(null)
+            }
         }
         return super.onCompatOptionsItemSelected(item)
     }
@@ -540,6 +589,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
 
     override fun upSystemUiVisibility(menuIsVisible: Boolean) {
         toggleSystemBar(menuIsVisible)
+        if (enableAutoScroll) {
+            mScrollTimer.isEnabled = !menuIsVisible
+        }
+        if (enableAutoPageScroll) {
+            if (menuIsVisible) {
+                stopAutoPage()
+            } else {
+                startAutoPage()
+            }
+        }
     }
 
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
@@ -573,7 +632,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
     private fun setHorizontalScroll(enable: Boolean) {
         mAdapter.isHorizontal = enable
         if (enable) {
-            mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerManga)
+            if (!enableAutoScroll) {
+                mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerManga)
+            }
             mLayoutManager.orientation = LinearLayoutManager.HORIZONTAL
         } else {
             mPagerSnapHelper.attachToRecyclerView(null)
@@ -660,6 +721,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
     }
 
     private fun startAutoPage() {
+        stopAutoPage()
         if (isAutoScrollPage) {
             autoScrollHandler.postDelayed(autoScrollRunnable, mMangaAutoPageSpeed.times(1000L))
         }

+ 46 - 0
app/src/main/java/io/legado/app/ui/book/manga/recyclerview/ScrollTimer.kt

@@ -0,0 +1,46 @@
+package io.legado.app.ui.book.manga.recyclerview
+
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import io.legado.app.model.ReadManga
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.launch
+
+class ScrollTimer(
+    lifecycleOwner: LifecycleOwner,
+) {
+    private val coroutineScope = lifecycleOwner.lifecycleScope
+    private var job: Job? = null
+    private var delayMs: Long = 16L
+    private var distance = 1
+
+    var isEnabled: Boolean = false
+        set(value) {
+            if (field != value) {
+                field = value
+                restartJob()
+            }
+        }
+
+    fun setSpeed(distance: Int) {
+        this.distance = distance
+        restartJob()
+    }
+
+    private fun restartJob() {
+        job?.cancel()
+        if (!isEnabled || delayMs == 0L) {
+            job = null
+            return
+        }
+        job = coroutineScope.launch {
+            while (isActive) {
+                delay(delayMs)
+                ReadManga.mCallback?.scrollBy(distance)
+            }
+        }
+    }
+
+}

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

@@ -51,6 +51,13 @@
         android:title="@string/enable_auto_page_scroll"
         app:showAsAction="never" />
 
+    <item
+        android:id="@+id/menu_enable_auto_scroll"
+        android:checkable="true"
+        android:checked="false"
+        android:title="@string/enable_auto_scroll"
+        app:showAsAction="never" />
+
     <item
         android:id="@+id/menu_manga_auto_page_speed"
         android:title="@string/manga_auto_page_speed"

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

@@ -1185,7 +1185,8 @@
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>

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

@@ -1188,7 +1188,8 @@
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>

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

@@ -1188,7 +1188,8 @@
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>

+ 2 - 1
app/src/main/res/values-vi/strings.xml

@@ -1184,7 +1184,8 @@ Còn </string>
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>

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

@@ -1185,7 +1185,8 @@
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>

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

@@ -1187,7 +1187,8 @@
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>

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

@@ -1187,7 +1187,8 @@
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>

+ 2 - 1
app/src/main/res/values/strings.xml

@@ -1188,7 +1188,8 @@
     <string name="disable_manga_scale">禁用漫画缩放</string>
     <string name="disable_manga_click_scroll">禁用点击翻页</string>
     <string name="enable_auto_page_scroll">开启自动翻页</string>
-    <string name="manga_auto_page_speed">翻页速度 %s 秒</string>
+    <string name="manga_auto_page_speed">翻页速度 %s</string>
+    <string name="enable_auto_scroll">开启滚动</string>
     <string name="manga_footer_config">页脚配置</string>
     <string name="setting_manga_auto_page_speed">设置自动翻页速度</string>
     <string name="book_reader_info_bar">页数. %1$d/%2$d  章节. %3$d/%4$d -> %5$s%%</string>