增加自动滚动 (#4851)

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

* ...

* 增加章节进度条

* 优化

* 增加自动滚动

* 优化卡顿

* ....
This commit is contained in:
lhjgege
2025-03-21 15:12:13 +08:00
committed by GitHub
parent c892bd9a78
commit e91b5ad2e1
12 changed files with 136 additions and 12 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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