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 54221b68c..c213788db 100644
--- a/app/src/main/java/io/legado/app/constant/PreferKey.kt
+++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt
@@ -140,9 +140,10 @@ object PreferKey {
const val showBookshelfFastScroller = "showBookshelfFastScroller"
const val importKeepEnable = "importKeepEnable"
const val previewImageByClick = "previewImageByClick"
- const val volumeKeyPageOnLongPress = "volumeKeyPageOnLongPress"
+ const val keyPageOnLongPress = "keyPageOnLongPress"
const val volumeKeyPage = "volumeKeyPage"
const val volumeKeyPageOnPlay = "volumeKeyPageOnPlay"
+ const val mouseWheelPage = "mouseWheelPage"
const val cPrimary = "colorPrimary"
const val cAccent = "colorAccent"
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 b59cc3250..e776ef866 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
@@ -467,8 +467,8 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
val progressBarBehavior: String?
get() = appCtx.getPrefString(PreferKey.progressBarBehavior, "page")
- val volumeKeyPageOnLongPress
- get() = appCtx.getPrefBoolean(PreferKey.volumeKeyPageOnLongPress, false)
+ val keyPageOnLongPress
+ get() = appCtx.getPrefBoolean(PreferKey.keyPageOnLongPress, false)
val volumeKeyPage
get() = appCtx.getPrefBoolean(PreferKey.volumeKeyPage, true)
@@ -476,6 +476,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
val volumeKeyPageOnPlay
get() = appCtx.getPrefBoolean(PreferKey.volumeKeyPageOnPlay, true)
+ val mouseWheelPage
+ get() = appCtx.getPrefBoolean(PreferKey.mouseWheelPage, true)
+
var searchScope: String
get() = appCtx.getPrefString("searchScope") ?: ""
set(value) {
diff --git a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt
index 1d9291185..a7735129b 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt
@@ -5,6 +5,7 @@ import android.content.pm.ActivityInfo
import android.os.Build
import android.os.Bundle
import android.view.Gravity
+import android.view.KeyEvent
import android.view.View
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.WindowInsets
@@ -34,8 +35,19 @@ import io.legado.app.ui.book.read.config.ClickActionConfigDialog
import io.legado.app.ui.book.read.config.PaddingConfigDialog
import io.legado.app.ui.book.read.config.PageKeyDialog
import io.legado.app.ui.file.HandleFileContract
-import io.legado.app.utils.*
+import io.legado.app.utils.ColorUtils
+import io.legado.app.utils.FileDoc
+import io.legado.app.utils.find
+import io.legado.app.utils.getPrefString
+import io.legado.app.utils.gone
+import io.legado.app.utils.isTv
+import io.legado.app.utils.navigationBarGravity
+import io.legado.app.utils.navigationBarHeight
+import io.legado.app.utils.setLightStatusBar
+import io.legado.app.utils.setNavigationBarColorAuto
+import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding
+import io.legado.app.utils.visible
/**
* 阅读界面
@@ -303,11 +315,17 @@ abstract class BaseReadBookActivity :
}
fun isPrevKey(keyCode: Int): Boolean {
+ if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
+ return false
+ }
val prevKeysStr = getPrefString(PreferKey.prevKeys)
return prevKeysStr?.split(",")?.contains(keyCode.toString()) ?: false
}
fun isNextKey(keyCode: Int): Boolean {
+ if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
+ return false
+ }
val nextKeysStr = getPrefString(PreferKey.nextKeys)
return nextKeysStr?.split(",")?.contains(keyCode.toString()) ?: false
}
diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
index d5262249e..5b4d3a073 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
@@ -6,6 +6,7 @@ import android.content.Intent
import android.content.res.Configuration
import android.net.Uri
import android.os.Bundle
+import android.os.SystemClock
import android.view.Gravity
import android.view.InputDevice
import android.view.KeyEvent
@@ -96,6 +97,7 @@ import io.legado.app.utils.LogUtils
import io.legado.app.utils.StartActivityContract
import io.legado.app.utils.SyncedRenderer
import io.legado.app.utils.applyOpenTint
+import io.legado.app.utils.buildMainHandler
import io.legado.app.utils.getPrefBoolean
import io.legado.app.utils.getPrefString
import io.legado.app.utils.hexString
@@ -215,13 +217,15 @@ class ReadBookActivity : BaseReadBookActivity(),
override val pageFactory: TextPageFactory get() = binding.readView.pageFactory
override val headerHeight: Int get() = binding.readView.curPage.headerHeight
private val menuLayoutIsVisible get() = bottomDialog > 0 || binding.readMenu.isVisible
- private val nextPageRunnable by lazy { Runnable { mouseWheelPage(PageDirection.NEXT) } }
- private val prevPageRunnable by lazy { Runnable { mouseWheelPage(PageDirection.PREV) } }
+ private val nextPageRunnable by lazy { Runnable { keyPage(PageDirection.NEXT) } }
+ private val prevPageRunnable by lazy { Runnable { keyPage(PageDirection.PREV) } }
private var bookChanged = false
private var pageChanged = false
private var reloadContent = false
private val autoPageRenderer by lazy { SyncedRenderer { doAutoPage(it) } }
private var autoPageScrollOffset = 0.0
+ private val handler by lazy { buildMainHandler() }
+ private var lastKeyPageTime = 0L
//恢复跳转前进度对话框的交互结果
private var confirmRestoreProcess: Boolean? = null
@@ -601,13 +605,11 @@ class ReadBookActivity : BaseReadBookActivity(),
if (event.action == MotionEvent.ACTION_SCROLL) {
val axisValue = event.getAxisValue(MotionEvent.AXIS_VSCROLL)
LogUtils.d("onGenericMotionEvent", "axisValue = $axisValue")
- binding.root.removeCallbacks(nextPageRunnable)
- binding.root.removeCallbacks(prevPageRunnable)
// 获得垂直坐标上的滚动方向
if (axisValue < 0.0f) { // 滚轮向下滚
- binding.root.postDelayed(nextPageRunnable, 200)
+ mouseWheelPage(PageDirection.NEXT)
} else { // 滚轮向上滚
- binding.root.postDelayed(prevPageRunnable, 200)
+ mouseWheelPage(PageDirection.PREV)
}
return true
}
@@ -624,52 +626,40 @@ class ReadBookActivity : BaseReadBookActivity(),
}
when {
isPrevKey(keyCode) -> {
- if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
- binding.readView.cancelSelect()
- binding.readView.pageDelegate?.keyTurnPage(PageDirection.PREV)
- return true
- }
+ handleKeyPage(PageDirection.PREV)
+ return true
}
isNextKey(keyCode) -> {
- if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
- binding.readView.cancelSelect()
- binding.readView.pageDelegate?.keyTurnPage(PageDirection.NEXT)
- return true
- }
- }
-
- keyCode == KeyEvent.KEYCODE_VOLUME_UP -> {
- if (volumeKeyPage(PageDirection.PREV, event.repeatCount > 0)) {
- return true
- }
- }
-
- keyCode == KeyEvent.KEYCODE_VOLUME_DOWN -> {
- if (volumeKeyPage(PageDirection.NEXT, event.repeatCount > 0)) {
- return true
- }
- }
-
- keyCode == KeyEvent.KEYCODE_PAGE_UP -> {
- binding.readView.cancelSelect()
- binding.readView.pageDelegate?.keyTurnPage(PageDirection.PREV)
+ handleKeyPage(PageDirection.NEXT)
return true
}
-
- keyCode == KeyEvent.KEYCODE_PAGE_DOWN -> {
- binding.readView.cancelSelect()
- binding.readView.pageDelegate?.keyTurnPage(PageDirection.NEXT)
- return true
- }
-
- keyCode == KeyEvent.KEYCODE_SPACE -> {
- binding.readView.cancelSelect()
- binding.readView.pageDelegate?.keyTurnPage(PageDirection.NEXT)
- return true
- }
-
}
+ when (keyCode) {
+ KeyEvent.KEYCODE_VOLUME_UP -> if (volumeKeyPage(PageDirection.PREV)) {
+ return true
+ }
+
+ KeyEvent.KEYCODE_VOLUME_DOWN -> if (volumeKeyPage(PageDirection.NEXT)) {
+ return true
+ }
+
+ KeyEvent.KEYCODE_PAGE_UP -> {
+ handleKeyPage(PageDirection.PREV)
+ return true
+ }
+
+ KeyEvent.KEYCODE_PAGE_DOWN -> {
+ handleKeyPage(PageDirection.NEXT)
+ return true
+ }
+
+ KeyEvent.KEYCODE_SPACE -> {
+ handleKeyPage(PageDirection.NEXT)
+ return true
+ }
+ }
+
return super.onKeyDown(keyCode, event)
}
@@ -679,7 +669,7 @@ class ReadBookActivity : BaseReadBookActivity(),
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN -> {
- if (volumeKeyPage(PageDirection.NONE, event.repeatCount > 0)) {
+ if (volumeKeyPage(PageDirection.NONE)) {
return true
}
}
@@ -858,37 +848,61 @@ class ReadBookActivity : BaseReadBookActivity(),
/**
* 鼠标滚轮翻页
*/
- private fun mouseWheelPage(direction: PageDirection): Boolean {
- if (!binding.readMenu.isVisible) {
- if (getPrefBoolean("mouseWheelPage", true)) {
- binding.readView.pageDelegate?.isCancel = false
- binding.readView.pageDelegate?.keyTurnPage(direction)
- return true
- }
+ private fun mouseWheelPage(direction: PageDirection) {
+ if (menuLayoutIsVisible || !AppConfig.mouseWheelPage) {
+ return
}
- return false
+ keyPageDebounce(direction, 200L, true)
}
/**
* 音量键翻页
*/
- private fun volumeKeyPage(direction: PageDirection, longPress: Boolean): Boolean {
- if (menuLayoutIsVisible) {
- return false
- }
+ private fun volumeKeyPage(direction: PageDirection): Boolean {
if (!AppConfig.volumeKeyPage) {
return false
}
if (!AppConfig.volumeKeyPageOnPlay && BaseReadAloudService.isPlay()) {
return false
}
- if (!AppConfig.volumeKeyPageOnLongPress && longPress) {
- return true
+ handleKeyPage(direction)
+ return true
+ }
+
+ private fun handleKeyPage(direction: PageDirection) {
+ if (AppConfig.keyPageOnLongPress || direction == PageDirection.NONE) {
+ keyPage(direction)
+ } else {
+ keyPageDebounce(direction)
}
+ }
+
+ private fun keyPageDebounce(
+ direction: PageDirection,
+ delay: Long = 100L,
+ mouseWheel: Boolean = false
+ ) {
+ handler.removeCallbacks(nextPageRunnable)
+ handler.removeCallbacks(prevPageRunnable)
+ if (!mouseWheel) {
+ val keyPageTime = SystemClock.uptimeMillis()
+ val elapsed = keyPageTime - lastKeyPageTime
+ lastKeyPageTime = keyPageTime
+ if (elapsed < 100) {
+ return
+ }
+ }
+ when (direction) {
+ PageDirection.NEXT -> handler.postDelayed(nextPageRunnable, delay)
+ PageDirection.PREV -> handler.postDelayed(prevPageRunnable, delay)
+ else -> {}
+ }
+ }
+
+ private fun keyPage(direction: PageDirection) {
binding.readView.cancelSelect()
binding.readView.pageDelegate?.isCancel = false
binding.readView.pageDelegate?.keyTurnPage(direction)
- return true
}
override fun upMenuView() {
diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt
index 45f80709f..632e52f5d 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt
@@ -324,18 +324,8 @@ class PageView(context: Context) : FrameLayout(context) {
text = readProgress
}
}
- tvTotalProgress1?.apply {
- val progress = "${chapterIndex.plus(1)}/${chapterSize}"
- if (text != progress) {
- text = progress
- }
- }
- tvPageAndTotal?.apply {
- val pageAndTotal = "${index.plus(1)}/$pageSize $readProgress"
- if (text != pageAndTotal) {
- text = pageAndTotal
- }
- }
+ tvTotalProgress1?.text = "${chapterIndex.plus(1)}/${chapterSize}"
+ tvPageAndTotal?.text = "${index.plus(1)}/$pageSize $readProgress"
}
/**
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index 2cf7dbe3e..a535adb05 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -1139,5 +1139,5 @@
调整本章页数
调整章节位置
清除成功,3秒后自动重启应用
- 长按音量键翻页
+ 按键长按翻页
diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml
index 44c500503..2139cb703 100644
--- a/app/src/main/res/values-ja-rJP/strings.xml
+++ b/app/src/main/res/values-ja-rJP/strings.xml
@@ -1142,5 +1142,5 @@
调整本章页数
调整章节位置
清除成功,3秒后自动重启应用
- 长按音量键翻页
+ 按键长按翻页
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 445339b01..cafde6dcf 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -1142,5 +1142,5 @@
调整本章页数
调整章节位置
清除成功,3秒后自动重启应用
- 长按音量键翻页
+ 按键长按翻页
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 31f68870f..fb633eac9 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -1138,5 +1138,5 @@ Còn
调整本章页数
调整章节位置
清除成功,3秒后自动重启应用
- 长按音量键翻页
+ 按键长按翻页
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 76277a8e2..701b26050 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -1139,5 +1139,5 @@
调整本章页数
调整章节位置
清除成功,3秒后自动重启应用
- 长按音量键翻页
+ 按键长按翻页
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e92441421..b906e44cf 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -1141,5 +1141,5 @@
调整本章页数
调整章节位置
清除成功,3秒后自动重启应用
- 长按音量键翻页
+ 按键长按翻页
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 828396447..2d1547e04 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -1141,5 +1141,5 @@
调整本章页数
调整章节位置
清除成功,3秒后自动重启应用
- 长按音量键翻页
+ 按键长按翻页
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cb693bdf5..f43c806bb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1142,5 +1142,5 @@
Adjust of chapter page
Adjust of chapter index
Cleared successfully, automatically restarts the application after 3 seconds
- Press and hold the volume key to turn the page
+ Press and hold the key to turn the page
diff --git a/app/src/main/res/xml/pref_config_read.xml b/app/src/main/res/xml/pref_config_read.xml
index 150dad276..045303a6d 100644
--- a/app/src/main/res/xml/pref_config_read.xml
+++ b/app/src/main/res/xml/pref_config_read.xml
@@ -103,8 +103,8 @@