From fc408c42dd0e1d4777576685f1170e6e0a50cbd5 Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Thu, 11 Jun 2026 12:47:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=AB=98=E4=BA=AE=E8=A7=84=E5=88=99?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookViewModel.kt | 1 + .../read/page/entities/column/TextColumn.kt | 2 ++ .../read/page/provider/TextChapterLayout.kt | 36 ++++++++++--------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 6312747f6..8015da012 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -2774,6 +2774,7 @@ class ReadBookViewModel( } } is ConfigUpdate.DoubleHorizontalPage -> { + ReadConfig.doubleHorizontalPage = update.value viewModelScope.launch { readSettingsRepository.setDoubleHorizontalPage(update.value) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt index 6ea1a3019..b8abd7c87 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt @@ -75,12 +75,14 @@ data class TextColumn( val needRestoreTypeface = customTypeface != null if (needRestoreSize) { val originalSize = textPaint.textSize + val originalTypeface = if (needRestoreTypeface) textPaint.typeface else null textPaint.textSize = textLine.titleTextSize!! if (needRestoreColor) textPaint.color = drawColor if (needRestoreTypeface) textPaint.typeface = customTypeface val y = textLine.lineBase - textLine.lineTop drawText(canvas, y, textPaint) textPaint.textSize = originalSize + if (needRestoreTypeface) textPaint.typeface = originalTypeface } else if (needRestoreColor || needRestoreTypeface) { val originalColor = textPaint.color val originalTypeface = textPaint.typeface 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 0edfa0eff..d299d7774 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 @@ -1365,6 +1365,7 @@ class TextChapterLayout( /** * 对有自定义字体的高亮字符重新测量宽度,确保排版和绘制使用同一套字体度量。 + * 不使用 getTextWidthsCompat 避免对子串错误添加 letterSpacing。 */ private fun remeasureWithHighlightFonts( text: String, @@ -1373,23 +1374,26 @@ class TextChapterLayout( widthsArray: FloatArray ) { val originalTypeface = textPaint.typeface - var i = 0 - while (i < text.length) { - val fontPath = charStyles[i]?.fontPath.orEmpty() - if (fontPath.isEmpty()) { i++; continue } - // 找连续使用同一字体的区间 - val segStart = i - i++ - while (i < text.length && charStyles[i]?.fontPath.orEmpty() == fontPath) i++ - val segEnd = i - val typeface = TextColumn.getTypeface(fontPath) ?: continue - textPaint.typeface = typeface - val segment = text.substring(segStart, segEnd) - val segWidths = FloatArray(segEnd - segStart) - textPaint.getTextWidthsCompat(segment, segWidths) - segWidths.copyInto(widthsArray, segStart) + try { + var i = 0 + while (i < text.length) { + val fontPath = charStyles[i]?.fontPath.orEmpty() + if (fontPath.isEmpty()) { i++; continue } + // 找连续使用同一字体的区间 + val segStart = i + i++ + while (i < text.length && charStyles[i]?.fontPath.orEmpty() == fontPath) i++ + val segEnd = i + val typeface = TextColumn.getTypeface(fontPath) ?: continue + textPaint.typeface = typeface + val segLen = segEnd - segStart + val segWidths = FloatArray(segLen) + textPaint.getTextWidths(text, segStart, segEnd, segWidths) + segWidths.copyInto(widthsArray, segStart) + } + } finally { + textPaint.typeface = originalTypeface } - textPaint.typeface = originalTypeface } /**