From 0a90151ddd5ae0c2e45c8d0126e5411630b114c4 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Mon, 19 Feb 2024 11:13:57 +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 | 36 ++++++++++++------- .../ui/book/read/page/provider/ZhLayout.kt | 3 +- 2 files changed, 25 insertions(+), 14 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 2e62fb07c..af63741a2 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 @@ -137,9 +137,6 @@ object ChapterProvider { @JvmStatic var visibleRect = RectF() - private val titleMeasureHelper = TextMeasure(titlePaint) - private val contentMeasureHelper = TextMeasure(contentPaint) - init { upStyle() } @@ -169,7 +166,6 @@ object ChapterProvider { textPages, stringBuilder, titlePaint, - titleMeasureHelper, titlePaintTextHeight, titlePaintFontMetrics, isTitle = true, @@ -207,7 +203,6 @@ object ChapterProvider { textPages, stringBuilder, contentPaint, - contentMeasureHelper, contentPaintTextHeight, contentPaintFontMetrics, srcList = srcList @@ -229,7 +224,6 @@ object ChapterProvider { textPages, stringBuilder, contentPaint, - contentMeasureHelper, contentPaintTextHeight, contentPaintFontMetrics ).let { @@ -261,7 +255,6 @@ object ChapterProvider { textPages, stringBuilder, contentPaint, - contentMeasureHelper, contentPaintTextHeight, contentPaintFontMetrics ).let { @@ -403,7 +396,6 @@ object ChapterProvider { textPages: ArrayList, stringBuilder: StringBuilder, textPaint: TextPaint, - measureHelper: TextMeasure, textHeight: Float, fontMetrics: FontMetrics, isTitle: Boolean = false, @@ -413,7 +405,7 @@ object ChapterProvider { ): Pair { var absStartX = x val layout = if (ReadBookConfig.useZhLayout) { - ZhLayout(text, textPaint, visibleWidth, measureHelper) + ZhLayout(text, textPaint, visibleWidth) } else { StaticLayout(text, textPaint, visibleWidth, Layout.Alignment.ALIGN_NORMAL, 0f, 0f, true) } @@ -471,7 +463,7 @@ object ChapterProvider { val lineStart = layout.getLineStart(lineIndex) val lineEnd = layout.getLineEnd(lineIndex) val lineText = text.substring(lineStart, lineEnd) - val (words, widths) = measureHelper.measureTextSplit(lineText) + val (words, widths) = measureTextSplit(lineText, textPaint) val desiredWidth = widths.fastSum() when { lineIndex == 0 && layout.lineCount > 1 && !isTitle -> { @@ -751,6 +743,28 @@ object ChapterProvider { } } + fun measureTextSplit( + text: String, + paint: TextPaint + ): Pair, ArrayList> { + val length = text.length + val widthsArray = FloatArray(length) + paint.getTextWidths(text, widthsArray) + val clusterCount = widthsArray.count { it > 0f } + val widths = ArrayList(clusterCount) + val stringList = ArrayList(clusterCount) + var i = 0 + while (i < length) { + val clusterBaseIndex = i++ + widths.add(widthsArray[clusterBaseIndex]) + while (i < length && widthsArray[i] == 0f) { + i++ + } + stringList.add(text.substring(clusterBaseIndex, i)) + } + return stringList to widths + } + /** * 更新样式 */ @@ -759,8 +773,6 @@ object ChapterProvider { getPaints(typeface).let { titlePaint = it.first contentPaint = it.second - titleMeasureHelper.setPaint(titlePaint) - contentMeasureHelper.setPaint(contentPaint) // reviewPaint.color = contentPaint.color // reviewPaint.textSize = contentPaint.textSize * 0.45f // reviewPaint.textAlign = Paint.Align.CENTER 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 688725afa..894c61fc3 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,7 +16,6 @@ class ZhLayout( text: CharSequence, textPaint: TextPaint, width: Int, - measureHelper: TextMeasure, ) : Layout(text, textPaint, width, Alignment.ALIGN_NORMAL, 0f, 0f) { companion object { private val postPanc = hashSetOf( @@ -50,7 +49,7 @@ class ZhLayout( init { var line = 0 - val (words, widths) = measureHelper.measureTextSplit(text as String) + val (words, widths) = ChapterProvider.measureTextSplit(text as String, textPaint) var lineW = 0f var cwPre = 0f var length = 0