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" /> + +