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 6f44623c8..afdb82d2c 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -263,7 +263,12 @@ object ReadBook : CoroutineScope by MainScope() { private fun curPageChanged() { callBack?.pageChanged() if (BaseReadAloudService.isRun) { - readAloud(!BaseReadAloudService.pause) + val scrollPageAnim = pageAnim() == 3 + if (scrollPageAnim) { + ReadAloud.pause(appCtx) + } else { + readAloud(!BaseReadAloudService.pause) + } } upReadTime() preDownload() @@ -272,9 +277,9 @@ object ReadBook : CoroutineScope by MainScope() { /** * 朗读 */ - fun readAloud(play: Boolean = true) { + fun readAloud(play: Boolean = true, startPos: Int = 0) { book?.let { - ReadAloud.play(appCtx, play) + ReadAloud.play(appCtx, play, startPos = startPos) } } diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 37f3757f2..8ae1ba6ff 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -186,16 +186,20 @@ abstract class BaseReadAloudService : BaseService(), } } nowSpeak = textChapter.getParagraphNum(readAloudNumber + 1, readAloudByPage) - 1 - if (!readAloudByPage && pos == 0) { + if (!readAloudByPage && startPos == 0 && !toLast) { pos = page.lines.first().chapterPosition - textChapter.paragraphs[nowSpeak].chapterPosition } - paragraphStartPos = pos if (toLast) { toLast = false readAloudNumber = textChapter.getLastParagraphPosition() nowSpeak = contentList.lastIndex + if (page.paragraphs.size == 1) { + pos = page.lines.first().chapterPosition - + textChapter.paragraphs[nowSpeak].chapterPosition + } } + paragraphStartPos = pos launch(Main) { if (play) play() else pageChanged = true } 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 aff92825b..5ad24d29e 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 @@ -1135,10 +1135,24 @@ class ReadBookActivity : BaseReadBookActivity(), when { !BaseReadAloudService.isRun -> { ReadAloud.upReadAloudClass() - ReadBook.readAloud() + val scrollPageAnim = ReadBook.pageAnim() == 3 + if (scrollPageAnim) { + val startPos = binding.readView.getCurPagePosition() + ReadBook.readAloud(startPos = startPos) + } else { + ReadBook.readAloud() + } } - BaseReadAloudService.pause -> ReadAloud.resume(this) + BaseReadAloudService.pause -> { + val scrollPageAnim = ReadBook.pageAnim() == 3 + if (scrollPageAnim) { + val startPos = binding.readView.getCurPagePosition() + ReadAloud.play(this, startPos = startPos) + } else { + ReadAloud.resume(this) + } + } else -> ReadAloud.pause(this) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index 2558c6e0d..b293f5686 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -519,6 +519,29 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at return visiblePage } + fun getCurVisibleFirstLine(): TextLine? { + var relativeOffset: Float + for (relativePos in 0..2) { + relativeOffset = relativeOffset(relativePos) + if (relativePos > 0) { + //滚动翻页 + if (!callBack.isScroll) break + if (relativeOffset >= ChapterProvider.visibleHeight) break + } + val textPage = relativePage(relativePos) + for (textLine in textPage.lines) { + if (textLine.isVisible(relativeOffset)) { + val visibleLine = textLine.copy().apply { + lineTop += relativeOffset + lineBottom += relativeOffset + } + return visibleLine + } + } + } + return null + } + /** * 选择开始文字 */ 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 8c11c414d..d61a55df8 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 @@ -14,6 +14,7 @@ import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadTipConfig import io.legado.app.model.ReadBook import io.legado.app.ui.book.read.ReadBookActivity +import io.legado.app.ui.book.read.page.entities.TextLine import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.entities.TextPos import io.legado.app.ui.book.read.page.provider.ChapterProvider @@ -352,6 +353,10 @@ class PageView(context: Context) : FrameLayout(context) { return binding.contentTextView.getCurVisiblePage() } + fun getCurVisibleFirstLine(): TextLine? { + return binding.contentTextView.getCurVisibleFirstLine() + } + fun markAsMainView() { binding.contentTextView.isMainView = true } 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 b1ea46cb4..cbf6635fc 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 @@ -626,6 +626,10 @@ class ReadView(context: Context, attrs: AttributeSet) : return curPage.getCurVisiblePage() } + fun getCurPagePosition(): Int { + return curPage.getCurVisibleFirstLine()?.pagePosition ?: 0 + } + override val currentChapter: TextChapter? get() { return if (callBack.isInitFinish) ReadBook.textChapter(0) else null