|
@@ -1,6 +1,5 @@
|
|
|
package io.legado.app.ui.book.read.page.provider
|
|
package io.legado.app.ui.book.read.page.provider
|
|
|
|
|
|
|
|
-import android.graphics.Paint
|
|
|
|
|
import android.graphics.Paint.FontMetrics
|
|
import android.graphics.Paint.FontMetrics
|
|
|
import android.graphics.Typeface
|
|
import android.graphics.Typeface
|
|
|
import android.net.Uri
|
|
import android.net.Uri
|
|
@@ -25,13 +24,13 @@ import io.legado.app.ui.book.read.page.entities.column.ReviewColumn
|
|
|
import io.legado.app.ui.book.read.page.entities.column.TextColumn
|
|
import io.legado.app.ui.book.read.page.entities.column.TextColumn
|
|
|
import io.legado.app.utils.RealPathUtil
|
|
import io.legado.app.utils.RealPathUtil
|
|
|
import io.legado.app.utils.dpToPx
|
|
import io.legado.app.utils.dpToPx
|
|
|
|
|
+import io.legado.app.utils.fastSum
|
|
|
import io.legado.app.utils.isContentScheme
|
|
import io.legado.app.utils.isContentScheme
|
|
|
import io.legado.app.utils.isPad
|
|
import io.legado.app.utils.isPad
|
|
|
import io.legado.app.utils.postEvent
|
|
import io.legado.app.utils.postEvent
|
|
|
import io.legado.app.utils.spToPx
|
|
import io.legado.app.utils.spToPx
|
|
|
import io.legado.app.utils.splitNotBlank
|
|
import io.legado.app.utils.splitNotBlank
|
|
|
import io.legado.app.utils.textHeight
|
|
import io.legado.app.utils.textHeight
|
|
|
-import io.legado.app.utils.toStringArray
|
|
|
|
|
import splitties.init.appCtx
|
|
import splitties.init.appCtx
|
|
|
import java.util.LinkedList
|
|
import java.util.LinkedList
|
|
|
import java.util.Locale
|
|
import java.util.Locale
|
|
@@ -47,6 +46,8 @@ object ChapterProvider {
|
|
|
//用于评论按钮的替换
|
|
//用于评论按钮的替换
|
|
|
private const val reviewChar = "▨"
|
|
private const val reviewChar = "▨"
|
|
|
|
|
|
|
|
|
|
+ private const val indentChar = " "
|
|
|
|
|
+
|
|
|
@JvmStatic
|
|
@JvmStatic
|
|
|
var viewWidth = 0
|
|
var viewWidth = 0
|
|
|
private set
|
|
private set
|
|
@@ -104,7 +105,7 @@ object ChapterProvider {
|
|
|
private var indentCharWidth = 0f
|
|
private var indentCharWidth = 0f
|
|
|
|
|
|
|
|
@JvmStatic
|
|
@JvmStatic
|
|
|
- private var titlePaintTextHeight = 0f
|
|
|
|
|
|
|
+ var titlePaintTextHeight = 0f
|
|
|
|
|
|
|
|
@JvmStatic
|
|
@JvmStatic
|
|
|
var contentPaintTextHeight = 0f
|
|
var contentPaintTextHeight = 0f
|
|
@@ -132,6 +133,9 @@ object ChapterProvider {
|
|
|
var doublePage = false
|
|
var doublePage = false
|
|
|
private set
|
|
private set
|
|
|
|
|
|
|
|
|
|
+ private val titleMeasureHelper = TextMeasure(titlePaint)
|
|
|
|
|
+ private val contentMeasureHelper = TextMeasure(contentPaint)
|
|
|
|
|
+
|
|
|
init {
|
|
init {
|
|
|
upStyle()
|
|
upStyle()
|
|
|
}
|
|
}
|
|
@@ -161,6 +165,7 @@ object ChapterProvider {
|
|
|
textPages,
|
|
textPages,
|
|
|
stringBuilder,
|
|
stringBuilder,
|
|
|
titlePaint,
|
|
titlePaint,
|
|
|
|
|
+ titleMeasureHelper,
|
|
|
titlePaintTextHeight,
|
|
titlePaintTextHeight,
|
|
|
titlePaintFontMetrics,
|
|
titlePaintFontMetrics,
|
|
|
isTitle = true,
|
|
isTitle = true,
|
|
@@ -196,6 +201,7 @@ object ChapterProvider {
|
|
|
textPages,
|
|
textPages,
|
|
|
stringBuilder,
|
|
stringBuilder,
|
|
|
contentPaint,
|
|
contentPaint,
|
|
|
|
|
+ contentMeasureHelper,
|
|
|
contentPaintTextHeight,
|
|
contentPaintTextHeight,
|
|
|
contentPaintFontMetrics,
|
|
contentPaintFontMetrics,
|
|
|
srcList = srcList
|
|
srcList = srcList
|
|
@@ -217,6 +223,7 @@ object ChapterProvider {
|
|
|
textPages,
|
|
textPages,
|
|
|
stringBuilder,
|
|
stringBuilder,
|
|
|
contentPaint,
|
|
contentPaint,
|
|
|
|
|
+ contentMeasureHelper,
|
|
|
contentPaintTextHeight,
|
|
contentPaintTextHeight,
|
|
|
contentPaintFontMetrics
|
|
contentPaintFontMetrics
|
|
|
).let {
|
|
).let {
|
|
@@ -224,10 +231,19 @@ object ChapterProvider {
|
|
|
durY = it.second
|
|
durY = it.second
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- durY = setTypeImage(
|
|
|
|
|
- book, matcher.group(1)!!,
|
|
|
|
|
- absStartX, durY, textPages, stringBuilder, book.getImageStyle()
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ setTypeImage(
|
|
|
|
|
+ book,
|
|
|
|
|
+ matcher.group(1)!!,
|
|
|
|
|
+ absStartX,
|
|
|
|
|
+ durY,
|
|
|
|
|
+ textPages,
|
|
|
|
|
+ contentPaintTextHeight,
|
|
|
|
|
+ stringBuilder,
|
|
|
|
|
+ book.getImageStyle()
|
|
|
|
|
+ ).let {
|
|
|
|
|
+ absStartX = it.first
|
|
|
|
|
+ durY = it.second
|
|
|
|
|
+ }
|
|
|
start = matcher.end()
|
|
start = matcher.end()
|
|
|
}
|
|
}
|
|
|
if (start < content.length) {
|
|
if (start < content.length) {
|
|
@@ -239,6 +255,7 @@ object ChapterProvider {
|
|
|
textPages,
|
|
textPages,
|
|
|
stringBuilder,
|
|
stringBuilder,
|
|
|
contentPaint,
|
|
contentPaint,
|
|
|
|
|
+ contentMeasureHelper,
|
|
|
contentPaintTextHeight,
|
|
contentPaintTextHeight,
|
|
|
contentPaintFontMetrics
|
|
contentPaintFontMetrics
|
|
|
).let {
|
|
).let {
|
|
@@ -249,14 +266,22 @@ object ChapterProvider {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- textPages.last().height = durY + 20.dpToPx()
|
|
|
|
|
- textPages.last().text = stringBuilder.toString()
|
|
|
|
|
|
|
+ val textPage = textPages.last()
|
|
|
|
|
+ val endPadding = 20.dpToPx()
|
|
|
|
|
+ val durYPadding = durY + endPadding
|
|
|
|
|
+ if (textPage.height < durYPadding) {
|
|
|
|
|
+ textPage.height = durYPadding
|
|
|
|
|
+ } else {
|
|
|
|
|
+ textPage.height += endPadding
|
|
|
|
|
+ }
|
|
|
|
|
+ textPage.text = stringBuilder.toString()
|
|
|
textPages.forEachIndexed { index, item ->
|
|
textPages.forEachIndexed { index, item ->
|
|
|
item.index = index
|
|
item.index = index
|
|
|
item.pageSize = textPages.size
|
|
item.pageSize = textPages.size
|
|
|
item.chapterIndex = bookChapter.index
|
|
item.chapterIndex = bookChapter.index
|
|
|
item.chapterSize = chapterSize
|
|
item.chapterSize = chapterSize
|
|
|
item.title = displayTitle
|
|
item.title = displayTitle
|
|
|
|
|
+ item.doublePage = doublePage
|
|
|
item.upLinesPosition()
|
|
item.upLinesPosition()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -280,15 +305,19 @@ object ChapterProvider {
|
|
|
x: Int,
|
|
x: Int,
|
|
|
y: Float,
|
|
y: Float,
|
|
|
textPages: ArrayList<TextPage>,
|
|
textPages: ArrayList<TextPage>,
|
|
|
|
|
+ textHeight: Float,
|
|
|
stringBuilder: StringBuilder,
|
|
stringBuilder: StringBuilder,
|
|
|
imageStyle: String?,
|
|
imageStyle: String?,
|
|
|
- ): Float {
|
|
|
|
|
|
|
+ ): Pair<Int, Float> {
|
|
|
|
|
+ var absStartX = x
|
|
|
var durY = y
|
|
var durY = y
|
|
|
val size = ImageProvider.getImageSize(book, src, ReadBook.bookSource)
|
|
val size = ImageProvider.getImageSize(book, src, ReadBook.bookSource)
|
|
|
if (size.width > 0 && size.height > 0) {
|
|
if (size.width > 0 && size.height > 0) {
|
|
|
if (durY > visibleHeight) {
|
|
if (durY > visibleHeight) {
|
|
|
val textPage = textPages.last()
|
|
val textPage = textPages.last()
|
|
|
- textPage.height = durY
|
|
|
|
|
|
|
+ if (textPage.height < durY) {
|
|
|
|
|
+ textPage.height = durY
|
|
|
|
|
+ }
|
|
|
textPage.text = stringBuilder.toString().ifEmpty { "本页无文字内容" }
|
|
textPage.text = stringBuilder.toString().ifEmpty { "本页无文字内容" }
|
|
|
stringBuilder.clear()
|
|
stringBuilder.clear()
|
|
|
textPages.add(TextPage())
|
|
textPages.add(TextPage())
|
|
@@ -313,10 +342,23 @@ object ChapterProvider {
|
|
|
}
|
|
}
|
|
|
if (durY + height > visibleHeight) {
|
|
if (durY + height > visibleHeight) {
|
|
|
val textPage = textPages.last()
|
|
val textPage = textPages.last()
|
|
|
- textPage.height = durY
|
|
|
|
|
- textPage.text = stringBuilder.toString().ifEmpty { "本页无文字内容" }
|
|
|
|
|
- stringBuilder.clear()
|
|
|
|
|
- textPages.add(TextPage())
|
|
|
|
|
|
|
+ if (doublePage && absStartX < viewWidth / 2) {
|
|
|
|
|
+ //当前页面左列结束
|
|
|
|
|
+ textPage.leftLineSize = textPage.lineSize
|
|
|
|
|
+ absStartX = viewWidth / 2 + paddingLeft
|
|
|
|
|
+ } else {
|
|
|
|
|
+ //当前页面结束
|
|
|
|
|
+ if (textPage.leftLineSize == 0) {
|
|
|
|
|
+ textPage.leftLineSize = textPage.lineSize
|
|
|
|
|
+ }
|
|
|
|
|
+ textPage.text = stringBuilder.toString().ifEmpty { "本页无文字内容" }
|
|
|
|
|
+ stringBuilder.clear()
|
|
|
|
|
+ textPages.add(TextPage())
|
|
|
|
|
+ }
|
|
|
|
|
+ // 双页的 durY 不正确,可能会小于实际高度
|
|
|
|
|
+ if (textPage.height < durY) {
|
|
|
|
|
+ textPage.height = durY
|
|
|
|
|
+ }
|
|
|
durY = 0f
|
|
durY = 0f
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -336,7 +378,7 @@ object ChapterProvider {
|
|
|
)
|
|
)
|
|
|
textPages.last().addLine(textLine)
|
|
textPages.last().addLine(textLine)
|
|
|
}
|
|
}
|
|
|
- return durY + paragraphSpacing / 10f
|
|
|
|
|
|
|
+ return absStartX to durY + textHeight * paragraphSpacing / 10f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -350,6 +392,7 @@ object ChapterProvider {
|
|
|
textPages: ArrayList<TextPage>,
|
|
textPages: ArrayList<TextPage>,
|
|
|
stringBuilder: StringBuilder,
|
|
stringBuilder: StringBuilder,
|
|
|
textPaint: TextPaint,
|
|
textPaint: TextPaint,
|
|
|
|
|
+ measureHelper: TextMeasure,
|
|
|
textHeight: Float,
|
|
textHeight: Float,
|
|
|
fontMetrics: FontMetrics,
|
|
fontMetrics: FontMetrics,
|
|
|
isTitle: Boolean = false,
|
|
isTitle: Boolean = false,
|
|
@@ -358,14 +401,11 @@ object ChapterProvider {
|
|
|
srcList: LinkedList<String>? = null
|
|
srcList: LinkedList<String>? = null
|
|
|
): Pair<Int, Float> {
|
|
): Pair<Int, Float> {
|
|
|
var absStartX = x
|
|
var absStartX = x
|
|
|
- val widthsArray = FloatArray(text.length)
|
|
|
|
|
val layout = if (ReadBookConfig.useZhLayout) {
|
|
val layout = if (ReadBookConfig.useZhLayout) {
|
|
|
- ZhLayout(text, textPaint, visibleWidth, widthsArray)
|
|
|
|
|
|
|
+ ZhLayout(text, textPaint, visibleWidth, measureHelper)
|
|
|
} else {
|
|
} else {
|
|
|
- textPaint.getTextWidths(text, widthsArray)
|
|
|
|
|
StaticLayout(text, textPaint, visibleWidth, Layout.Alignment.ALIGN_NORMAL, 0f, 0f, true)
|
|
StaticLayout(text, textPaint, visibleWidth, Layout.Alignment.ALIGN_NORMAL, 0f, 0f, true)
|
|
|
}
|
|
}
|
|
|
- val widthsList = widthsArray.asList()
|
|
|
|
|
var durY = when {
|
|
var durY = when {
|
|
|
//标题y轴居中
|
|
//标题y轴居中
|
|
|
emptyContent && textPages.size == 1 -> {
|
|
emptyContent && textPages.size == 1 -> {
|
|
@@ -398,6 +438,7 @@ object ChapterProvider {
|
|
|
if (durY + textHeight > visibleHeight) {
|
|
if (durY + textHeight > visibleHeight) {
|
|
|
val textPage = textPages.last()
|
|
val textPage = textPages.last()
|
|
|
if (doublePage && absStartX < viewWidth / 2) {
|
|
if (doublePage && absStartX < viewWidth / 2) {
|
|
|
|
|
+ //当前页面左列结束
|
|
|
textPage.leftLineSize = textPage.lineSize
|
|
textPage.leftLineSize = textPage.lineSize
|
|
|
absStartX = viewWidth / 2 + paddingLeft
|
|
absStartX = viewWidth / 2 + paddingLeft
|
|
|
} else {
|
|
} else {
|
|
@@ -406,32 +447,34 @@ object ChapterProvider {
|
|
|
textPage.leftLineSize = textPage.lineSize
|
|
textPage.leftLineSize = textPage.lineSize
|
|
|
}
|
|
}
|
|
|
textPage.text = stringBuilder.toString()
|
|
textPage.text = stringBuilder.toString()
|
|
|
- textPage.height = durY
|
|
|
|
|
//新建页面
|
|
//新建页面
|
|
|
textPages.add(TextPage())
|
|
textPages.add(TextPage())
|
|
|
stringBuilder.clear()
|
|
stringBuilder.clear()
|
|
|
absStartX = paddingLeft
|
|
absStartX = paddingLeft
|
|
|
}
|
|
}
|
|
|
|
|
+ if (textPage.height < durY) {
|
|
|
|
|
+ textPage.height = durY
|
|
|
|
|
+ }
|
|
|
durY = 0f
|
|
durY = 0f
|
|
|
}
|
|
}
|
|
|
val lineStart = layout.getLineStart(lineIndex)
|
|
val lineStart = layout.getLineStart(lineIndex)
|
|
|
val lineEnd = layout.getLineEnd(lineIndex)
|
|
val lineEnd = layout.getLineEnd(lineIndex)
|
|
|
- val words = text.substring(lineStart, lineEnd)
|
|
|
|
|
- val textWidths = widthsList.subList(lineStart, lineEnd)
|
|
|
|
|
- val desiredWidth = textWidths.sum()
|
|
|
|
|
|
|
+ val lineText = text.substring(lineStart, lineEnd)
|
|
|
|
|
+ val (words, widths) = measureHelper.measureTextSplit(lineText)
|
|
|
|
|
+ val desiredWidth = widths.fastSum()
|
|
|
when {
|
|
when {
|
|
|
lineIndex == 0 && layout.lineCount > 1 && !isTitle -> {
|
|
lineIndex == 0 && layout.lineCount > 1 && !isTitle -> {
|
|
|
//第一行 非标题
|
|
//第一行 非标题
|
|
|
- textLine.text = words
|
|
|
|
|
|
|
+ textLine.text = lineText
|
|
|
addCharsToLineFirst(
|
|
addCharsToLineFirst(
|
|
|
book, absStartX, textLine, words,
|
|
book, absStartX, textLine, words,
|
|
|
- textPaint, desiredWidth, textWidths, srcList
|
|
|
|
|
|
|
+ desiredWidth, widths, srcList
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
lineIndex == layout.lineCount - 1 -> {
|
|
lineIndex == layout.lineCount - 1 -> {
|
|
|
//最后一行
|
|
//最后一行
|
|
|
- textLine.text = words
|
|
|
|
|
|
|
+ textLine.text = lineText
|
|
|
textLine.isParagraphEnd = true
|
|
textLine.isParagraphEnd = true
|
|
|
//标题x轴居中
|
|
//标题x轴居中
|
|
|
val startX = if (
|
|
val startX = if (
|
|
@@ -443,8 +486,8 @@ object ChapterProvider {
|
|
|
0f
|
|
0f
|
|
|
}
|
|
}
|
|
|
addCharsToLineNatural(
|
|
addCharsToLineNatural(
|
|
|
- book, absStartX, textLine, words, textPaint,
|
|
|
|
|
- startX, !isTitle && lineIndex == 0, textWidths, srcList
|
|
|
|
|
|
|
+ book, absStartX, textLine, words,
|
|
|
|
|
+ startX, !isTitle && lineIndex == 0, widths, srcList
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -457,20 +500,23 @@ object ChapterProvider {
|
|
|
val startX = (visibleWidth - desiredWidth) / 2
|
|
val startX = (visibleWidth - desiredWidth) / 2
|
|
|
addCharsToLineNatural(
|
|
addCharsToLineNatural(
|
|
|
book, absStartX, textLine, words,
|
|
book, absStartX, textLine, words,
|
|
|
- textPaint, startX, false, textWidths, srcList
|
|
|
|
|
|
|
+ startX, false, widths, srcList
|
|
|
)
|
|
)
|
|
|
} else {
|
|
} else {
|
|
|
//中间行
|
|
//中间行
|
|
|
- textLine.text = words
|
|
|
|
|
|
|
+ textLine.text = lineText
|
|
|
addCharsToLineMiddle(
|
|
addCharsToLineMiddle(
|
|
|
book, absStartX, textLine, words,
|
|
book, absStartX, textLine, words,
|
|
|
- textPaint, desiredWidth, 0f, textWidths, srcList
|
|
|
|
|
|
|
+ desiredWidth, 0f, widths, srcList
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ if (doublePage) {
|
|
|
|
|
+ textLine.isLeftLine = absStartX < viewWidth / 2
|
|
|
|
|
+ }
|
|
|
val sbLength = stringBuilder.length
|
|
val sbLength = stringBuilder.length
|
|
|
- stringBuilder.append(words)
|
|
|
|
|
|
|
+ stringBuilder.append(lineText)
|
|
|
if (textLine.isParagraphEnd) {
|
|
if (textLine.isParagraphEnd) {
|
|
|
stringBuilder.append("\n")
|
|
stringBuilder.append("\n")
|
|
|
}
|
|
}
|
|
@@ -487,10 +533,13 @@ object ChapterProvider {
|
|
|
chapterPosition + charSize + if (isParagraphEnd) 1 else 0
|
|
chapterPosition + charSize + if (isParagraphEnd) 1 else 0
|
|
|
} ?: 0) + sbLength
|
|
} ?: 0) + sbLength
|
|
|
textLine.pagePosition = sbLength
|
|
textLine.pagePosition = sbLength
|
|
|
- textPages.last().addLine(textLine)
|
|
|
|
|
textLine.upTopBottom(durY, textHeight, fontMetrics)
|
|
textLine.upTopBottom(durY, textHeight, fontMetrics)
|
|
|
|
|
+ val textPage = textPages.last()
|
|
|
|
|
+ textPage.addLine(textLine)
|
|
|
durY += textHeight * lineSpacingExtra
|
|
durY += textHeight * lineSpacingExtra
|
|
|
- textPages.last().height = durY
|
|
|
|
|
|
|
+ if (textPage.height < durY) {
|
|
|
|
|
+ textPage.height = durY
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
durY += textHeight * paragraphSpacing / 10f
|
|
durY += textHeight * paragraphSpacing / 10f
|
|
|
return Pair(absStartX, durY)
|
|
return Pair(absStartX, durY)
|
|
@@ -503,8 +552,7 @@ object ChapterProvider {
|
|
|
book: Book,
|
|
book: Book,
|
|
|
absStartX: Int,
|
|
absStartX: Int,
|
|
|
textLine: TextLine,
|
|
textLine: TextLine,
|
|
|
- text: String,
|
|
|
|
|
- textPaint: TextPaint,
|
|
|
|
|
|
|
+ words: List<String>,
|
|
|
/**自然排版长度**/
|
|
/**自然排版长度**/
|
|
|
desiredWidth: Float,
|
|
desiredWidth: Float,
|
|
|
textWidths: List<Float>,
|
|
textWidths: List<Float>,
|
|
@@ -513,17 +561,17 @@ object ChapterProvider {
|
|
|
var x = 0f
|
|
var x = 0f
|
|
|
if (!ReadBookConfig.textFullJustify) {
|
|
if (!ReadBookConfig.textFullJustify) {
|
|
|
addCharsToLineNatural(
|
|
addCharsToLineNatural(
|
|
|
- book, absStartX, textLine, text, textPaint,
|
|
|
|
|
|
|
+ book, absStartX, textLine, words,
|
|
|
x, true, textWidths, srcList
|
|
x, true, textWidths, srcList
|
|
|
)
|
|
)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
val bodyIndent = ReadBookConfig.paragraphIndent
|
|
val bodyIndent = ReadBookConfig.paragraphIndent
|
|
|
- for (char in bodyIndent.toStringArray()) {
|
|
|
|
|
|
|
+ for (i in bodyIndent.indices) {
|
|
|
val x1 = x + indentCharWidth
|
|
val x1 = x + indentCharWidth
|
|
|
textLine.addColumn(
|
|
textLine.addColumn(
|
|
|
TextColumn(
|
|
TextColumn(
|
|
|
- charData = char,
|
|
|
|
|
|
|
+ charData = indentChar,
|
|
|
start = absStartX + x,
|
|
start = absStartX + x,
|
|
|
end = absStartX + x1
|
|
end = absStartX + x1
|
|
|
)
|
|
)
|
|
@@ -531,12 +579,12 @@ object ChapterProvider {
|
|
|
x = x1
|
|
x = x1
|
|
|
textLine.indentWidth = x
|
|
textLine.indentWidth = x
|
|
|
}
|
|
}
|
|
|
- if (text.length > bodyIndent.length) {
|
|
|
|
|
- val text1 = text.substring(bodyIndent.length, text.length)
|
|
|
|
|
|
|
+ if (words.size > bodyIndent.length) {
|
|
|
|
|
+ val text1 = words.subList(bodyIndent.length, words.size)
|
|
|
val textWidths1 = textWidths.subList(bodyIndent.length, textWidths.size)
|
|
val textWidths1 = textWidths.subList(bodyIndent.length, textWidths.size)
|
|
|
addCharsToLineMiddle(
|
|
addCharsToLineMiddle(
|
|
|
book, absStartX, textLine, text1,
|
|
book, absStartX, textLine, text1,
|
|
|
- textPaint, desiredWidth, x, textWidths1, srcList
|
|
|
|
|
|
|
+ desiredWidth, x, textWidths1, srcList
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -548,8 +596,7 @@ object ChapterProvider {
|
|
|
book: Book,
|
|
book: Book,
|
|
|
absStartX: Int,
|
|
absStartX: Int,
|
|
|
textLine: TextLine,
|
|
textLine: TextLine,
|
|
|
- text: String,
|
|
|
|
|
- textPaint: TextPaint,
|
|
|
|
|
|
|
+ words: List<String>,
|
|
|
/**自然排版长度**/
|
|
/**自然排版长度**/
|
|
|
desiredWidth: Float,
|
|
desiredWidth: Float,
|
|
|
/**起始x坐标**/
|
|
/**起始x坐标**/
|
|
@@ -559,19 +606,19 @@ object ChapterProvider {
|
|
|
) {
|
|
) {
|
|
|
if (!ReadBookConfig.textFullJustify) {
|
|
if (!ReadBookConfig.textFullJustify) {
|
|
|
addCharsToLineNatural(
|
|
addCharsToLineNatural(
|
|
|
- book, absStartX, textLine, text, textPaint,
|
|
|
|
|
|
|
+ book, absStartX, textLine, words,
|
|
|
startX, false, textWidths, srcList
|
|
startX, false, textWidths, srcList
|
|
|
)
|
|
)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
val residualWidth = visibleWidth - desiredWidth
|
|
val residualWidth = visibleWidth - desiredWidth
|
|
|
- val spaceSize = text.count { it == ' ' }
|
|
|
|
|
- val (words, widths) = getStringArrayAndTextWidths(text, textWidths, textPaint)
|
|
|
|
|
|
|
+ val spaceSize = words.count { it == " " }
|
|
|
if (spaceSize > 1) {
|
|
if (spaceSize > 1) {
|
|
|
val d = residualWidth / spaceSize
|
|
val d = residualWidth / spaceSize
|
|
|
var x = startX
|
|
var x = startX
|
|
|
- words.forEachIndexed { index, char ->
|
|
|
|
|
- val cw = widths[index]
|
|
|
|
|
|
|
+ for (index in words.indices) {
|
|
|
|
|
+ val char = words[index]
|
|
|
|
|
+ val cw = textWidths[index]
|
|
|
val x1 = if (char == " ") {
|
|
val x1 = if (char == " ") {
|
|
|
if (index != words.lastIndex) (x + cw + d) else (x + cw)
|
|
if (index != words.lastIndex) (x + cw + d) else (x + cw)
|
|
|
} else {
|
|
} else {
|
|
@@ -587,8 +634,9 @@ object ChapterProvider {
|
|
|
val gapCount: Int = words.lastIndex
|
|
val gapCount: Int = words.lastIndex
|
|
|
val d = residualWidth / gapCount
|
|
val d = residualWidth / gapCount
|
|
|
var x = startX
|
|
var x = startX
|
|
|
- words.forEachIndexed { index, char ->
|
|
|
|
|
- val cw = widths[index]
|
|
|
|
|
|
|
+ for (index in words.indices) {
|
|
|
|
|
+ val char = words[index]
|
|
|
|
|
+ val cw = textWidths[index]
|
|
|
val x1 = if (index != words.lastIndex) (x + cw + d) else (x + cw)
|
|
val x1 = if (index != words.lastIndex) (x + cw + d) else (x + cw)
|
|
|
addCharToLine(
|
|
addCharToLine(
|
|
|
book, absStartX, textLine, char,
|
|
book, absStartX, textLine, char,
|
|
@@ -607,8 +655,7 @@ object ChapterProvider {
|
|
|
book: Book,
|
|
book: Book,
|
|
|
absStartX: Int,
|
|
absStartX: Int,
|
|
|
textLine: TextLine,
|
|
textLine: TextLine,
|
|
|
- text: String,
|
|
|
|
|
- textPaint: TextPaint,
|
|
|
|
|
|
|
+ words: List<String>,
|
|
|
startX: Float,
|
|
startX: Float,
|
|
|
hasIndent: Boolean,
|
|
hasIndent: Boolean,
|
|
|
textWidths: List<Float>,
|
|
textWidths: List<Float>,
|
|
@@ -616,9 +663,9 @@ object ChapterProvider {
|
|
|
) {
|
|
) {
|
|
|
val indentLength = ReadBookConfig.paragraphIndent.length
|
|
val indentLength = ReadBookConfig.paragraphIndent.length
|
|
|
var x = startX
|
|
var x = startX
|
|
|
- val (words, widths) = getStringArrayAndTextWidths(text, textWidths, textPaint)
|
|
|
|
|
- words.forEachIndexed { index, char ->
|
|
|
|
|
- val cw = widths[index]
|
|
|
|
|
|
|
+ for (index in words.indices) {
|
|
|
|
|
+ val char = words[index]
|
|
|
|
|
+ val cw = textWidths[index]
|
|
|
val x1 = x + cw
|
|
val x1 = x + cw
|
|
|
addCharToLine(book, absStartX, textLine, char, x, x1, index + 1 == words.size, srcList)
|
|
addCharToLine(book, absStartX, textLine, char, x, x1, index + 1 == words.size, srcList)
|
|
|
x = x1
|
|
x = x1
|
|
@@ -731,9 +778,11 @@ object ChapterProvider {
|
|
|
getPaints(typeface).let {
|
|
getPaints(typeface).let {
|
|
|
titlePaint = it.first
|
|
titlePaint = it.first
|
|
|
contentPaint = it.second
|
|
contentPaint = it.second
|
|
|
- reviewPaint.color = contentPaint.color
|
|
|
|
|
- reviewPaint.textSize = contentPaint.textSize * 0.45f
|
|
|
|
|
- reviewPaint.textAlign = Paint.Align.CENTER
|
|
|
|
|
|
|
+ titleMeasureHelper.setPaint(titlePaint)
|
|
|
|
|
+ contentMeasureHelper.setPaint(contentPaint)
|
|
|
|
|
+// reviewPaint.color = contentPaint.color
|
|
|
|
|
+// reviewPaint.textSize = contentPaint.textSize * 0.45f
|
|
|
|
|
+// reviewPaint.textAlign = Paint.Align.CENTER
|
|
|
}
|
|
}
|
|
|
//间距
|
|
//间距
|
|
|
lineSpacingExtra = ReadBookConfig.lineSpacingExtra / 10f
|
|
lineSpacingExtra = ReadBookConfig.lineSpacingExtra / 10f
|
|
@@ -820,12 +869,14 @@ object ChapterProvider {
|
|
|
/**
|
|
/**
|
|
|
* 更新View尺寸
|
|
* 更新View尺寸
|
|
|
*/
|
|
*/
|
|
|
- fun upViewSize(width: Int, height: Int) {
|
|
|
|
|
|
|
+ fun upViewSize(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {
|
|
|
if (width > 0 && height > 0 && (width != viewWidth || height != viewHeight)) {
|
|
if (width > 0 && height > 0 && (width != viewWidth || height != viewHeight)) {
|
|
|
viewWidth = width
|
|
viewWidth = width
|
|
|
viewHeight = height
|
|
viewHeight = height
|
|
|
upLayout()
|
|
upLayout()
|
|
|
- postEvent(EventBus.UP_CONFIG, true)
|
|
|
|
|
|
|
+ if (oldWidth > 0 && oldHeight > 0) {
|
|
|
|
|
+ postEvent(EventBus.UP_CONFIG, true)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|