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 fd109f3ef..530113179 100644
--- a/app/src/main/java/io/legado/app/constant/PreferKey.kt
+++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt
@@ -144,6 +144,7 @@ object PreferKey {
const val volumeKeyPageOnPlay = "volumeKeyPageOnPlay"
const val mouseWheelPage = "mouseWheelPage"
const val recordHeapDump = "recordHeapDump"
+ const val optimizeRender = "optimizeRender"
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 b719f1d45..2773f69c7 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
@@ -37,6 +37,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
var clickActionBR = appCtx.getPrefInt(PreferKey.clickActionBR, 1)
var themeMode = appCtx.getPrefString(PreferKey.themeMode, "0")
var useDefaultCover = appCtx.getPrefBoolean(PreferKey.useDefaultCover, false)
+ var optimizeRender = appCtx.getPrefBoolean(PreferKey.optimizeRender, false)
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
when (key) {
@@ -85,6 +86,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
PreferKey.useDefaultCover -> useDefaultCover =
appCtx.getPrefBoolean(PreferKey.useDefaultCover, false)
+ PreferKey.optimizeRender -> optimizeRender =
+ appCtx.getPrefBoolean(PreferKey.optimizeRender, false)
+
}
}
diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt
index e78035694..f6c8e609d 100644
--- a/app/src/main/java/io/legado/app/model/ReadBook.kt
+++ b/app/src/main/java/io/legado/app/model/ReadBook.kt
@@ -717,7 +717,7 @@ object ReadBook : CoroutineScope by MainScope() {
fun contentLoadFinish()
- fun upPageAnim()
+ fun upPageAnim(upRecorder: Boolean = false)
fun notifyBookChanged()
}
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 a3cce6a4a..14a9bdc3d 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
@@ -942,9 +942,9 @@ class ReadBookActivity : BaseReadBookActivity(),
}
}
- override fun upPageAnim() {
+ override fun upPageAnim(upRecorder: Boolean) {
lifecycleScope.launch {
- binding.readView.upPageAnim()
+ binding.readView.upPageAnim(upRecorder)
}
}
diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt
index 22192b58f..d11413698 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt
@@ -4,7 +4,12 @@ import android.annotation.SuppressLint
import android.content.DialogInterface
import android.content.SharedPreferences
import android.os.Bundle
-import android.view.*
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewConfiguration
+import android.view.ViewGroup
+import android.view.WindowManager
import android.widget.LinearLayout
import androidx.fragment.app.DialogFragment
import androidx.preference.Preference
@@ -152,6 +157,13 @@ class MoreConfigDialog : DialogFragment() {
PreferKey.noAnimScrollPage -> {
ReadBook.callBack?.upPageAnim()
}
+
+ PreferKey.optimizeRender -> {
+ ReadBook.callBack?.run {
+ upPageAnim(true)
+ upContent(resetPageOffset = false)
+ }
+ }
}
}
diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt
index 2361aecbe..51081d989 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt
@@ -18,6 +18,7 @@ import io.legado.app.model.ReadBook
import io.legado.app.ui.book.read.ContentEditDialog
import io.legado.app.ui.book.read.page.api.DataSource
import io.legado.app.ui.book.read.page.delegate.CoverPageDelegate
+import io.legado.app.ui.book.read.page.delegate.HorizontalPageDelegate
import io.legado.app.ui.book.read.page.delegate.NoAnimPageDelegate
import io.legado.app.ui.book.read.page.delegate.PageDelegate
import io.legado.app.ui.book.read.page.delegate.ScrollPageDelegate
@@ -486,7 +487,7 @@ class ReadView(context: Context, attrs: AttributeSet) :
/**
* 更新翻页动画
*/
- fun upPageAnim() {
+ fun upPageAnim(upRecorder: Boolean = false) {
isScroll = ReadBook.pageAnim() == 3
ChapterProvider.upLayout()
when (ReadBook.pageAnim()) {
@@ -511,6 +512,9 @@ class ReadView(context: Context, attrs: AttributeSet) :
}
}
(pageDelegate as? ScrollPageDelegate)?.noAnim = AppConfig.noAnimScrollPage
+ if (upRecorder) {
+ (pageDelegate as? HorizontalPageDelegate)?.upRecorder()
+ }
pageDelegate?.setViewSize(width, height)
if (isScroll) {
curPage.setAutoPager(autoPager)
@@ -665,6 +669,9 @@ class ReadView(context: Context, attrs: AttributeSet) :
}
fun submitRenderTask() {
+ if (!AppConfig.optimizeRender) {
+ return
+ }
curPage.submitRenderTask()
}
diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt
index f0f91b3ca..f6a4e3c3f 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt
@@ -8,9 +8,9 @@ import io.legado.app.utils.screenshot
abstract class HorizontalPageDelegate(readView: ReadView) : PageDelegate(readView) {
- protected val curRecorder = CanvasRecorderFactory.create()
- protected val prevRecorder = CanvasRecorderFactory.create()
- protected val nextRecorder = CanvasRecorderFactory.create()
+ protected var curRecorder = CanvasRecorderFactory.create()
+ protected var prevRecorder = CanvasRecorderFactory.create()
+ protected var nextRecorder = CanvasRecorderFactory.create()
private val slopSquare get() = readView.pageSlopSquare2
override fun setDirection(direction: PageDirection) {
@@ -34,6 +34,15 @@ abstract class HorizontalPageDelegate(readView: ReadView) : PageDelegate(readVie
}
}
+ fun upRecorder() {
+ curRecorder.recycle()
+ prevRecorder.recycle()
+ nextRecorder.recycle()
+ curRecorder = CanvasRecorderFactory.create()
+ prevRecorder = CanvasRecorderFactory.create()
+ nextRecorder = CanvasRecorderFactory.create()
+ }
+
override fun onTouch(event: MotionEvent) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt
index dcf1c9c9f..cb6180bd4 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt
@@ -8,6 +8,7 @@ import androidx.annotation.Keep
import androidx.core.graphics.withTranslation
import io.legado.app.help.PaintPool
import io.legado.app.help.book.isImage
+import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.lib.theme.ThemeStore
import io.legado.app.model.ReadBook
@@ -143,8 +144,12 @@ data class TextLine(
}
fun draw(view: ContentTextView, canvas: Canvas) {
- canvasRecorder.recordIfNeededThenDraw(canvas, view.width, height.toInt()) {
- drawTextLine(view, this)
+ if (AppConfig.optimizeRender) {
+ canvasRecorder.recordIfNeededThenDraw(canvas, view.width, height.toInt()) {
+ drawTextLine(view, this)
+ }
+ } else {
+ drawTextLine(view, canvas)
}
}
@@ -215,7 +220,7 @@ data class TextLine(
}
fun checkFastDraw(): Boolean {
- if (exceed || !onlyTextColumn || textPage.isMsgPage) {
+ if (!AppConfig.optimizeRender || exceed || !onlyTextColumn || textPage.isMsgPage) {
return false
}
if (wordSpacing != 0f && (!atLeastApi26 || !wordSpacingWorking)) {
diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt
index 4e14c0cfc..1c1569cc1 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt
@@ -8,6 +8,7 @@ import androidx.annotation.Keep
import androidx.core.graphics.withTranslation
import io.legado.app.R
import io.legado.app.help.PaintPool
+import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.ui.book.read.page.ContentTextView
import io.legado.app.ui.book.read.page.entities.TextChapter.Companion.emptyTextChapter
@@ -286,9 +287,15 @@ data class TextPage(
}
fun draw(view: ContentTextView, canvas: Canvas, relativeOffset: Float) {
- render(view)
- canvas.withTranslation(0f, relativeOffset + paddingTop) {
- canvasRecorder.draw(this)
+ if (AppConfig.optimizeRender) {
+ render(view)
+ canvas.withTranslation(0f, relativeOffset + paddingTop) {
+ canvasRecorder.draw(this)
+ }
+ } else {
+ canvas.withTranslation(0f, relativeOffset + paddingTop) {
+ drawPage(view, this)
+ }
}
}
diff --git a/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt b/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt
index 544abefed..d25ba747f 100644
--- a/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt
+++ b/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt
@@ -13,6 +13,7 @@ import android.text.style.LineHeightSpan
import android.util.AttributeSet
import androidx.annotation.ColorInt
import androidx.appcompat.widget.AppCompatTextView
+import io.legado.app.help.config.AppConfig
import io.legado.app.utils.canvasrecorder.CanvasRecorderFactory
import io.legado.app.utils.canvasrecorder.recordIfNeededThenDraw
import io.legado.app.utils.dpToPx
@@ -80,10 +81,16 @@ class BatteryView @JvmOverloads constructor(
}
override fun onDraw(canvas: Canvas) {
- canvasRecorder.recordIfNeededThenDraw(canvas, width, height) {
- super.onDraw(this)
- if (!isBattery) return@recordIfNeededThenDraw
- drawBattery(this)
+ if (AppConfig.optimizeRender) {
+ canvasRecorder.recordIfNeededThenDraw(canvas, width, height) {
+ super.onDraw(this)
+ if (!isBattery) return@recordIfNeededThenDraw
+ drawBattery(this)
+ }
+ } else {
+ super.onDraw(canvas)
+ if (!isBattery) return
+ drawBattery(canvas)
}
}
diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderFactory.kt b/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderFactory.kt
index 038331557..c784dd3cc 100644
--- a/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderFactory.kt
+++ b/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderFactory.kt
@@ -1,6 +1,7 @@
package io.legado.app.utils.canvasrecorder
import android.os.Build
+import io.legado.app.help.config.AppConfig
object CanvasRecorderFactory {
@@ -9,6 +10,7 @@ object CanvasRecorderFactory {
fun create(locked: Boolean = false): CanvasRecorder {
val impl = when {
+ !AppConfig.optimizeRender -> CanvasRecorderImpl()
atLeastApi29 -> CanvasRecorderApi29Impl()
atLeastApi23 -> CanvasRecorderApi23Impl()
else -> CanvasRecorderImpl()
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index 9f9994a3c..d2c63102c 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -1146,4 +1146,5 @@
记录堆转储
中/粗/细
继续滑动以加载下一章…
+ 启用绘制优化
diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml
index 05763c578..28bebda8b 100644
--- a/app/src/main/res/values-ja-rJP/strings.xml
+++ b/app/src/main/res/values-ja-rJP/strings.xml
@@ -1149,4 +1149,5 @@
记录堆转储
中/粗/细
继续滑动以加载下一章…
+ 启用绘制优化
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 6fad058f6..031b31456 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -1149,4 +1149,5 @@
记录堆转储
中/粗/细
继续滑动以加载下一章…
+ 启用绘制优化
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index bd5f49899..fd4d35476 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -1145,4 +1145,5 @@ Còn
记录堆转储
中/粗/细
继续滑动以加载下一章…
+ 启用绘制优化
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index ab444cc99..8ab918b32 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -1146,4 +1146,5 @@
记录堆转储
中/粗/细
继续滑动以加载下一章…
+ 启用绘制优化
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e05a9ee55..16f6373e9 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -1148,4 +1148,5 @@
记录堆转储
中/粗/细
继续滑动以加载下一章…
+ 启用绘制优化
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 413b01f7e..c571e020a 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -1148,4 +1148,5 @@
记录堆转储
中/粗/细
继续滑动以加载下一章…
+ 启用绘制优化
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 26b91ac4f..d9351d72c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1149,4 +1149,5 @@
Capture heap dump
N/B/L
Keep swiping to load the next chapter…
+ 启用绘制优化
diff --git a/app/src/main/res/xml/pref_config_read.xml b/app/src/main/res/xml/pref_config_read.xml
index b6fa78c39..06d5af517 100644
--- a/app/src/main/res/xml/pref_config_read.xml
+++ b/app/src/main/res/xml/pref_config_read.xml
@@ -150,6 +150,13 @@
app:iconSpaceReserved="false"
app:isBottomBackground="true" />
+
+