From ea47a2473776ba6df5b484aafd2fc2c753fa3821 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Thu, 22 Feb 2024 12:35:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/ReadBook.kt | 48 ++++++++++++++++--- .../app/ui/book/read/ReadBookActivity.kt | 37 +++++++++++++- .../legado/app/ui/book/read/page/ReadView.kt | 27 +---------- .../ui/book/read/page/entities/TextChapter.kt | 6 ++- .../page/provider/LayoutProgressListener.kt | 6 +-- .../read/page/provider/TextChapterLayout.kt | 10 ++-- 6 files changed, 92 insertions(+), 42 deletions(-) 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 01c222b75..296dca9fe 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -19,7 +19,9 @@ import io.legado.app.model.localBook.TextFile import io.legado.app.model.webBook.WebBook import io.legado.app.service.BaseReadAloudService import io.legado.app.ui.book.read.page.entities.TextChapter +import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.provider.ChapterProvider +import io.legado.app.ui.book.read.page.provider.LayoutProgressListener import io.legado.app.utils.stackTraceStr import io.legado.app.utils.toastOnUi import kotlinx.coroutines.CoroutineScope @@ -214,6 +216,7 @@ object ReadBook : CoroutineScope by MainScope() { durChapterPos = 0 durChapterIndex++ prevTextChapter?.cancelLayout() + curTextChapter?.setProgressListener(null) prevTextChapter = curTextChapter curTextChapter = nextTextChapter nextTextChapter = null @@ -230,7 +233,7 @@ object ReadBook : CoroutineScope by MainScope() { callBack?.upMenuView() AppLog.putDebug("moveToNextChapter-curPageChanged()") curPageChanged() - curTextChapter?.let { callBack?.onCurrentTextChapterChanged(it) } + curTextChapter?.let { callBack?.onCurrentTextChapterChanged(it, upContent) } return true } else { AppLog.putDebug("跳转下一章失败,没有下一章") @@ -247,6 +250,7 @@ object ReadBook : CoroutineScope by MainScope() { durChapterPos = if (toLast) prevTextChapter?.lastReadLength ?: Int.MAX_VALUE else 0 durChapterIndex-- nextTextChapter?.cancelLayout() + curTextChapter?.setProgressListener(null) nextTextChapter = curTextChapter curTextChapter = prevTextChapter prevTextChapter = null @@ -260,7 +264,7 @@ object ReadBook : CoroutineScope by MainScope() { saveRead() callBack?.upMenuView() curPageChanged() - curTextChapter?.let { callBack?.onCurrentTextChapterChanged(it) } + curTextChapter?.let { callBack?.onCurrentTextChapterChanged(it, upContent) } return true } else { return false @@ -495,24 +499,52 @@ object ReadBook : CoroutineScope by MainScope() { when (val offset = chapter.index - durChapterIndex) { 0 -> { curTextChapter?.cancelLayout() + curTextChapter?.setProgressListener(null) curTextChapter = textChapter - if (upContent) callBack?.upContent(offset, resetPageOffset) + if (textChapter.isCompleted) { + if (upContent) callBack?.upContent(offset, resetPageOffset) + } else if (resetPageOffset) { + callBack?.resetPageOffset() + } callBack?.upMenuView() curPageChanged() callBack?.contentLoadFinish() - callBack?.onCurrentTextChapterChanged(textChapter) + callBack?.onCurrentTextChapterChanged(textChapter, upContent) } -1 -> { prevTextChapter?.cancelLayout() prevTextChapter = textChapter - if (upContent) callBack?.upContent(offset, resetPageOffset) + if (upContent) { + if (textChapter.isCompleted) { + callBack?.upContent(offset, resetPageOffset) + } else { + textChapter.setProgressListener(object : LayoutProgressListener { + override fun onLayoutCompleted() { + callBack?.upContent(offset, resetPageOffset) + } + }) + } + } } 1 -> { nextTextChapter?.cancelLayout() nextTextChapter = textChapter - if (upContent) callBack?.upContent(offset, resetPageOffset) + if (upContent) { + if (textChapter.isCompleted) { + callBack?.upContent(offset, resetPageOffset) + } else { + textChapter.setProgressListener(object : LayoutProgressListener { + override fun onLayoutPageCompleted(index: Int, page: TextPage) { + if (index > 1) { + return + } + callBack?.upContent(offset, resetPageOffset) + } + }) + } + } } } Unit @@ -650,7 +682,9 @@ object ReadBook : CoroutineScope by MainScope() { fun notifyBookChanged() - fun onCurrentTextChapterChanged(textChapter: TextChapter) + fun onCurrentTextChapterChanged(textChapter: TextChapter, upContent: Boolean = true) + + fun resetPageOffset() } } 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 a0bcf2649..33bad1ffa 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 @@ -126,6 +126,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import kotlin.math.max /** * 阅读界面 @@ -233,6 +234,7 @@ class ReadBookActivity : BaseReadBookActivity(), binding.readMenu.upSeekBar() } } + private var upContent = true //恢复跳转前进度对话框的交互结果 private var confirmRestoreProcess: Boolean? = null @@ -936,7 +938,9 @@ class ReadBookActivity : BaseReadBookActivity(), ) { lifecycleScope.launch { binding.readView.upContent(relativePosition, resetPageOffset) - upSeekBarProgress() + if (relativePosition == 0) { + upSeekBarProgress() + } loadStates = false success?.invoke() } @@ -1369,16 +1373,41 @@ class ReadBookActivity : BaseReadBookActivity(), binding.readView.autoPager.resume() } - override fun onCurrentTextChapterChanged(textChapter: TextChapter) { + override fun onCurrentTextChapterChanged(textChapter: TextChapter, upContent: Boolean) { + this.upContent = upContent textChapter.setProgressListener(this) } override fun onLayoutPageCompleted(index: Int, page: TextPage) { upSeekBarThrottle.invoke() + if (upContent) { + val line = page.lines.first() + val durChapterPos = ReadBook.durChapterPos + val startPos = line.chapterPosition + val endPos = startPos + line.charSize + if (durChapterPos in startPos.. y } for (lineIndex in 0 until layout.lineCount) { - coroutineContext.ensureActive() val textLine = TextLine(isTitle = isTitle) if (durY + textHeight > visibleHeight) { val textPage = textPages.last() @@ -438,6 +441,7 @@ class TextChapterLayout( textPage.leftLineSize = textPage.lineSize } textPage.text = stringBuilder.toString() + coroutineContext.ensureActive() onPageCompleted() //新建页面 textPages.add(TextPage())