From c57bc25e3c9b31b4355e7520c0bab1203552c3eb Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Wed, 28 Feb 2024 09:57:51 +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/ChapterProvider.kt | 2 +- .../read/page/provider/TextChapterLayout.kt | 25 +++++++++++-------- .../ui/book/read/page/provider/ZhLayout.kt | 3 ++- 3 files changed, 17 insertions(+), 13 deletions(-) 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 ced5adc3d..2e656a72b 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 @@ -432,7 +432,7 @@ object ChapterProvider { ): Pair { var absStartX = x val layout = if (ReadBookConfig.useZhLayout) { - ZhLayout(text, textPaint, visibleWidth) + ZhLayout(text, textPaint, visibleWidth, emptyList(), emptyList()) } else { StaticLayout(text, textPaint, visibleWidth, Layout.Alignment.ALIGN_NORMAL, 0f, 0f, true) } 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 23ea83de3..99c6b5b72 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 @@ -399,8 +399,11 @@ class TextChapterLayout( srcList: LinkedList? = null ): Pair { var absStartX = x + val widthsArray = FloatArray(text.length) + textPaint.getTextWidths(text, widthsArray) val layout = if (ReadBookConfig.useZhLayout) { - ZhLayout(text, textPaint, visibleWidth) + val (words, widths) = measureTextSplit(text, widthsArray) + ZhLayout(text, textPaint, visibleWidth, words, widths) } else { StaticLayout(text, textPaint, visibleWidth, Layout.Alignment.ALIGN_NORMAL, 0f, 0f, true) } @@ -431,7 +434,6 @@ class TextChapterLayout( else -> y } - val (strList, widthList) = measureTextSplit(text, textPaint) for (lineIndex in 0 until layout.lineCount) { val textLine = TextLine(isTitle = isTitle) if (durY + textHeight > visibleHeight) { @@ -462,8 +464,7 @@ class TextChapterLayout( val lineStart = layout.getLineStart(lineIndex) val lineEnd = layout.getLineEnd(lineIndex) val lineText = text.substring(lineStart, lineEnd) - val words = strList.subList(lineStart, lineEnd) - val widths = widthList.subList(lineStart, lineEnd) + val (words, widths) = measureTextSplit(lineText, widthsArray, lineStart) val desiredWidth = widths.fastSum() textLine.text = lineText when { @@ -763,22 +764,24 @@ class TextChapterLayout( private fun measureTextSplit( text: String, - paint: TextPaint + widthsArray: FloatArray, + start: Int = 0 ): Pair, ArrayList> { val length = text.length - val widthsArray = FloatArray(length) - paint.getTextWidths(text, widthsArray) - val clusterCount = widthsArray.count { it > 0f } + var clusterCount = 0 + for (i in start.. 0) clusterCount++ + } val widths = ArrayList(clusterCount) val stringList = ArrayList(clusterCount) - var i = 0 - while (i < length) { + var i = start + while (i < start + length) { val clusterBaseIndex = i++ widths.add(widthsArray[clusterBaseIndex]) while (i < length && widthsArray[i] == 0f) { i++ } - stringList.add(text.substring(clusterBaseIndex, i)) + stringList.add(text.substring(clusterBaseIndex - start, i - start)) } return stringList to widths } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ZhLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ZhLayout.kt index 894c61fc3..5749dd1ef 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ZhLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ZhLayout.kt @@ -16,6 +16,8 @@ class ZhLayout( text: CharSequence, textPaint: TextPaint, width: Int, + words: List, + widths: List ) : Layout(text, textPaint, width, Alignment.ALIGN_NORMAL, 0f, 0f) { companion object { private val postPanc = hashSetOf( @@ -49,7 +51,6 @@ class ZhLayout( init { var line = 0 - val (words, widths) = ChapterProvider.measureTextSplit(text as String, textPaint) var lineW = 0f var cwPre = 0f var length = 0