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 cd6eff0fd..f79ff5f92 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 @@ -6,7 +6,6 @@ import android.graphics.Paint import android.util.AttributeSet import android.view.MotionEvent import android.view.View -import androidx.core.graphics.withTranslation import io.legado.app.R import io.legado.app.data.entities.Bookmark import io.legado.app.help.config.AppConfig @@ -23,6 +22,7 @@ import io.legado.app.ui.book.read.page.entities.column.TextColumn import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.book.read.page.provider.TextPageFactory import io.legado.app.ui.widget.dialog.PhotoDialog +import io.legado.app.utils.PictureMirror import io.legado.app.utils.activity import io.legado.app.utils.getCompatColor import io.legado.app.utils.showDialogFragment @@ -102,25 +102,18 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at */ private fun drawPage(canvas: Canvas) { var relativeOffset = relativeOffset(0) - val view = this - canvas.withTranslation(0f, relativeOffset) { - textPage.draw(view, this) - } + textPage.draw(this, canvas, relativeOffset) if (!callBack.isScroll) return //滚动翻页 if (!pageFactory.hasNext()) return val textPage1 = relativePage(1) relativeOffset = relativeOffset(1) - canvas.withTranslation(0f, relativeOffset) { - textPage1.draw(view, this) - } + textPage1.draw(this, canvas, relativeOffset) if (!pageFactory.hasNextPlus()) return relativeOffset = relativeOffset(2) if (relativeOffset < ChapterProvider.visibleHeight) { val textPage2 = relativePage(2) - canvas.withTranslation(0f, relativeOffset) { - textPage2.draw(view, this) - } + textPage2.draw(this, canvas, relativeOffset) } } @@ -167,7 +160,9 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at } fun submitPreRenderTask() { - renderThread.submit(renderRunnable) + if (PictureMirror.atLeastApi23) { + renderThread.submit(renderRunnable) + } } private fun preRenderPage() { 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 2683ed97a..0f89a6e32 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 @@ -121,7 +121,7 @@ data class TextLine( return visible } - fun draw(view: ContentTextView, canvas: Canvas?) { + fun draw(view: ContentTextView, canvas: Canvas) { pictureMirror.draw(canvas, view.width, height.toInt()) { drawTextLine(view, this) } 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 ab9fc3f71..4926007b6 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 @@ -45,6 +45,7 @@ data class TextPage( var isMsgPage: Boolean = false var pictureMirror: PictureMirror = PictureMirror() var doublePage = false + var paddingTop = 0 val paragraphs by lazy { paragraphsInternal @@ -159,6 +160,7 @@ data class TextPage( addLine(textLine) } height = ChapterProvider.visibleHeight.toFloat() + invalidate() } return this } @@ -180,7 +182,8 @@ data class TextPage( fun upPageAloudSpan(aloudSpanStart: Int) { removePageAloudSpan() var lineStart = 0 - for ((index, textLine) in textLines.withIndex()) { + for (index in textLines.indices) { + val textLine = textLines[index] val lineLength = textLine.text.length + if (textLine.isParagraphEnd) 1 else 0 if (aloudSpanStart > lineStart && aloudSpanStart < lineStart + lineLength) { for (i in index - 1 downTo 0) { @@ -263,16 +266,19 @@ data class TextPage( return null } - fun draw(view: ContentTextView, canvas: Canvas?) { - pictureMirror.drawLocked(canvas, view.width, height.toInt()) { - drawPage(view, this) + fun draw(view: ContentTextView, canvas: Canvas, relativeOffset: Float) { + val height = height.toInt() + canvas.withTranslation(0f, relativeOffset + paddingTop) { + pictureMirror.drawLocked(canvas, view.width, height) { + drawPage(view, this) + } } } private fun drawPage(view: ContentTextView, canvas: Canvas) { for (i in lines.indices) { val line = lines[i] - canvas.withTranslation(0f, line.lineTop) { + canvas.withTranslation(0f, line.lineTop - paddingTop) { line.draw(view, this) } } @@ -280,7 +286,9 @@ data class TextPage( fun preRender(view: ContentTextView): Boolean { if (!pictureMirror.isDirty) return false - draw(view, null) + pictureMirror.drawLocked(null, view.width, height.toInt()) { + drawPage(view, this) + } return true } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt index c38d3dc9c..368528f8d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt @@ -290,6 +290,7 @@ object ChapterProvider { item.chapterSize = chapterSize item.title = displayTitle item.doublePage = doublePage + item.paddingTop = paddingTop item.upLinesPosition() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt index 9ff5f77ee..f69b022b1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt @@ -12,7 +12,7 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource } override fun hasNext(): Boolean = with(dataSource) { - return hasNextChapter() || currentChapter?.isLastIndex(pageIndex) != true + return hasNextChapter() || (currentChapter != null && currentChapter?.isLastIndex(pageIndex) != true) } override fun hasNextPlus(): Boolean = with(dataSource) { @@ -85,14 +85,12 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource return@with TextPage(text = it).format() } currentChapter?.let { + val pageIndex = pageIndex if (pageIndex < it.pageSize - 1) { return@with it.getPage(pageIndex + 1)?.removePageAloudSpan() ?: TextPage(title = it.title).format() } } - if (!hasNextChapter()) { - return@with TextPage(text = "") - } nextChapter?.let { return@with it.getPage(0)?.removePageAloudSpan() ?: TextPage(title = it.title).format() @@ -105,8 +103,9 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource ReadBook.msg?.let { return@with TextPage(text = it).format() } - if (pageIndex > 0) { - currentChapter?.let { + currentChapter?.let { + val pageIndex = pageIndex + if (pageIndex > 0) { return@with it.getPage(pageIndex - 1)?.removePageAloudSpan() ?: TextPage(title = it.title).format() } @@ -121,6 +120,7 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource override val nextPlusPage: TextPage get() = with(dataSource) { currentChapter?.let { + val pageIndex = pageIndex if (pageIndex < it.pageSize - 2) { return@with it.getPage(pageIndex + 2)?.removePageAloudSpan() ?: TextPage(title = it.title).format() @@ -133,7 +133,6 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource return@with nc.getPage(1)?.removePageAloudSpan() ?: TextPage(text = "继续滑动以加载下一章…").format() } - } return TextPage().format() } diff --git a/app/src/main/java/io/legado/app/utils/PictureMirror.kt b/app/src/main/java/io/legado/app/utils/PictureMirror.kt index 44e9c01f2..21aebec25 100644 --- a/app/src/main/java/io/legado/app/utils/PictureMirror.kt +++ b/app/src/main/java/io/legado/app/utils/PictureMirror.kt @@ -23,15 +23,11 @@ class PictureMirror { block: Canvas.() -> Unit ) { if (atLeastApi23) { - if (picture == null) { + if (picture == null || lock == null) { synchronized(this) { if (picture == null) { picture = Picture() } - } - } - if (lock == null) { - synchronized(this) { if (lock == null) { lock = ReentrantLock() }