From 23e1692d022d5d51ed8bce598e708b524756d062 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 4 Mar 2020 11:34:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/page/ChapterProvider.kt | 19 +++++++++---------- .../io/legado/app/utils/StringExtensions.kt | 13 +++++++++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ChapterProvider.kt index 7725759c8..20afe26cf 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ChapterProvider.kt @@ -16,6 +16,7 @@ import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.utils.dp import io.legado.app.utils.getPrefString import io.legado.app.utils.removePref +import io.legado.app.utils.toStringArray @Suppress("DEPRECATION") @@ -177,10 +178,10 @@ object ChapterProvider { var x = 0f val bodyIndent = ReadBookConfig.bodyIndent val icw = StaticLayout.getDesiredWidth(bodyIndent, textPaint) / bodyIndent.length - for (i in 0..bodyIndent.lastIndex) { + bodyIndent.toStringArray().forEach { val x1 = x + icw textLine.addTextChar( - charData = bodyIndent[i].toString(), + charData = it, start = paddingLeft + x, end = paddingLeft + x1 ) @@ -203,12 +204,11 @@ object ChapterProvider { val gapCount: Int = words.length - 1 val d = (visibleWidth - desiredWidth) / gapCount var x = startX - for (i in words.indices) { - val char = words[i] - val cw = StaticLayout.getDesiredWidth(char.toString(), textPaint) + for ((i, char) in words.toStringArray().withIndex()) { + val cw = StaticLayout.getDesiredWidth(char, textPaint) val x1 = if (i != words.lastIndex) (x + cw + d) else (x + cw) textLine.addTextChar( - charData = char.toString(), + charData = char, start = paddingLeft + x, end = paddingLeft + x1 ) @@ -230,12 +230,11 @@ object ChapterProvider { stringBuilder.append("\n") textLine.text = "$words\n" var x = startX - for (i in words.indices) { - val char = words.substring(i, i + 1) - val cw = StaticLayout.getDesiredWidth(char, textPaint) + words.toStringArray().forEach { + val cw = StaticLayout.getDesiredWidth(it, textPaint) val x1 = x + cw textLine.addTextChar( - charData = char, + charData = it, start = paddingLeft + x, end = paddingLeft + x1 ) diff --git a/app/src/main/java/io/legado/app/utils/StringExtensions.kt b/app/src/main/java/io/legado/app/utils/StringExtensions.kt index 3f4f40ee2..9daa31c8a 100644 --- a/app/src/main/java/io/legado/app/utils/StringExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/StringExtensions.kt @@ -48,6 +48,19 @@ fun String.splitNotBlank(regex: Regex, limit: Int = 0): Array = run { this.split(regex, limit).map { it.trim() }.filterNot { it.isBlank() }.toTypedArray() } +fun String.toStringArray(): Array { + val strArray = Array(this.codePointCount(0, this.length)) { "" } + var codePointIndex = 0 + for (i in strArray.indices) { + strArray[i] = substring( + codePointIndex, + offsetByCodePoints(codePointIndex, 1) + .apply { codePointIndex = this } + ) + } + return strArray +} + fun Char?.isHAN(): Boolean { this ?: return false val ub: Character.UnicodeBlock = Character.UnicodeBlock.of(this) ?: return false