From 122c476788d76095b9a2d0a50d9c14d1b94933ac Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 21 Feb 2025 12:00:13 +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 --- .../read/page/provider/TextChapterLayout.kt | 32 ++++++++++--------- .../io/legado/app/utils/PaintExtensions.kt | 11 +++++++ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index 31eaf4f4e..b2ed402d5 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -1,7 +1,6 @@ package io.legado.app.ui.book.read.page.provider import android.graphics.Paint -import android.os.Build import android.text.Layout import android.text.StaticLayout import android.text.TextPaint @@ -25,6 +24,7 @@ import io.legado.app.ui.book.read.page.entities.column.ReviewColumn import io.legado.app.ui.book.read.page.entities.column.TextColumn import io.legado.app.utils.dpToPx import io.legado.app.utils.fastSum +import io.legado.app.utils.getTextWidthsCompat import io.legado.app.utils.splitNotBlank import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope @@ -76,18 +76,21 @@ class TextChapterLayout( private var pendingTextPage = TextPage() - private var isCompleted = false - private val job: Coroutine<*> private val bookChapter inline get() = textChapter.chapter private val displayTitle inline get() = textChapter.title private val chaptersSize inline get() = textChapter.chaptersSize + private var durY = 0f + private var absStartX = paddingLeft + private var floatArray = FloatArray(128) + + private var isCompleted = false + private val job: Coroutine<*> + var exception: Throwable? = null var channel = Channel(Int.MAX_VALUE) - var durY = 0f - var absStartX = paddingLeft init { job = Coroutine.async( @@ -401,16 +404,8 @@ class TextChapterLayout( isVolumeTitle: Boolean = false, srcList: LinkedList? = null ) { - val widthsArray = FloatArray(text.length) - textPaint.getTextWidths(text, widthsArray) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { - if (widthsArray.isNotEmpty()) { - val letterSpacing = textPaint.letterSpacing * textPaint.textSize - val letterSpacingHalf = letterSpacing * 0.5f - widthsArray[0] += letterSpacingHalf - widthsArray[widthsArray.lastIndex] += letterSpacingHalf - } - } + val widthsArray = allocateFloatArray(text.length) + textPaint.getTextWidthsCompat(text, widthsArray) val layout = if (ReadBookConfig.useZhLayout) { val (words, widths) = measureTextSplit(text, widthsArray) val indentSize = if (isFirstLine) paragraphIndent.length else 0 @@ -786,6 +781,13 @@ class TextChapterLayout( } } + private fun allocateFloatArray(size: Int): FloatArray { + if (size > floatArray.size) { + floatArray = FloatArray(size) + } + return floatArray + } + private fun measureTextSplit( text: String, widthsArray: FloatArray, diff --git a/app/src/main/java/io/legado/app/utils/PaintExtensions.kt b/app/src/main/java/io/legado/app/utils/PaintExtensions.kt index c48835ef8..e2a0877f8 100644 --- a/app/src/main/java/io/legado/app/utils/PaintExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/PaintExtensions.kt @@ -1,6 +1,17 @@ package io.legado.app.utils +import android.os.Build import android.text.TextPaint val TextPaint.textHeight: Float get() = fontMetrics.run { descent - ascent + leading } + +fun TextPaint.getTextWidthsCompat(text: String, widths: FloatArray) { + getTextWidths(text, widths) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + val letterSpacing = letterSpacing * textSize + val letterSpacingHalf = letterSpacing * 0.5f + widths[0] += letterSpacingHalf + widths[text.lastIndex] += letterSpacingHalf + } +}