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 c4d3138ad814..1e68985e9ba8 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 @@ -625,16 +625,18 @@ object ChapterProvider { text: String, textWidths: List ): Pair, List> { - val strList = arrayListOf() - val textWidthList = arrayListOf() + val charArray = text.toCharArray() + val strList = ArrayList() + val textWidthList = ArrayList() + val lastIndex = text.lastIndex for (i in textWidths.indices) { - if (text[i].isLowSurrogate()) { + if (charArray[i].isLowSurrogate()) { continue } - val char = if (i + 1 < text.lastIndex && text[i + 1].isLowSurrogate()) { - text.substring(i, i + 2) + val char = if (i + 1 < lastIndex && charArray[i + 1].isLowSurrogate()) { + charArray[i].toString() + charArray[i + 1].toString() } else { - text.substring(i, i + 1) + charArray[i].toString() } strList.add(char) textWidthList.add(textWidths[i]) 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 1e9105ccda16..ead0d22091cd 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 @@ -1,8 +1,10 @@ package io.legado.app.ui.book.read.page.provider +import android.graphics.Paint import android.graphics.Rect import android.text.Layout import android.text.TextPaint +import java.util.WeakHashMap import kotlin.math.max /** @@ -22,6 +24,7 @@ class ZhLayout( "】", ")", ">", "]", "}", ",", ".", "?", "!", ":", "」", ";", ";" ) private val prePanc = hashSetOf("“", "(", "《", "【", "‘", "‘", "(", "<", "[", "{", "「") + private val cnCharWidthCache = WeakHashMap() } private val defaultCapacity = 10 @@ -29,7 +32,10 @@ class ZhLayout( var lineWidth = FloatArray(defaultCapacity) private var lineCount = 0 private val curPaint = textPaint - private val cnCharWitch = getDesiredWidth("我", textPaint) + private val cnCharWidth = cnCharWidthCache[textPaint] + ?: getDesiredWidth("我", textPaint).also { + cnCharWidthCache[textPaint] = it + } enum class BreakMod { NORMAL, BREAK_ONE_CHAR, BREAK_MORE_CHAR, CPS_1, CPS_2, CPS_3, } class Locate { @@ -197,10 +203,10 @@ class ZhLayout( } private fun inCompressible(width: Float): Boolean { - return width < cnCharWitch + return width < cnCharWidth } - private val gap = (cnCharWitch / 12.75).toFloat() + private val gap = (cnCharWidth / 12.75).toFloat() private fun getPostPancOffset(string: String): Float { val textRect = Rect() curPaint.getTextBounds(string, 0, 1, textRect) @@ -210,8 +216,8 @@ class ZhLayout( private fun getPrePancOffset(string: String): Float { val textRect = Rect() curPaint.getTextBounds(string, 0, 1, textRect) - val d = max(cnCharWitch - textRect.right.toFloat() - gap, 0f) - return cnCharWitch / 2 - d + val d = max(cnCharWidth - textRect.right.toFloat() - gap, 0f) + return cnCharWidth / 2 - d } fun getDesiredWidth(sting: String, paint: TextPaint) = paint.measureText(sting)