pull/737/head
Robot 4 years ago
commit 904287d23f
  1. 104
      app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt

@ -86,14 +86,9 @@ class ReadView(context: Context, attrs: AttributeSet) :
private val blRect = RectF(10F, height * 0.66f, width * 0.33f, height - 10f) private val blRect = RectF(10F, height * 0.66f, width * 0.33f, height - 10f)
private val bcRect = RectF(width * 0.33f, height * 0.66f, width * 0.66f, height - 10f) private val bcRect = RectF(width * 0.33f, height * 0.66f, width * 0.66f, height - 10f)
private val brRect = RectF(width * 0.66f, height * 0.66f, width - 10f, height - 10f) private val brRect = RectF(width * 0.66f, height * 0.66f, width - 10f, height - 10f)
private val autoPageRect by lazy { private val autoPageRect by lazy { Rect() }
Rect() private val autoPagePint by lazy { Paint().apply { color = context.accentColor } }
} private val boundary by lazy { BreakIterator.getWordInstance(Locale.getDefault()) }
private val autoPagePint by lazy {
Paint().apply {
color = context.accentColor
}
}
init { init {
addView(nextPage) addView(nextPage)
@ -247,27 +242,104 @@ class ReadView(context: Context, attrs: AttributeSet) :
/** /**
* 长按选择 * 长按选择
*/ */
private fun onLongPress() { private fun onLongPress() = with(curPage.textPage) {
curPage.selectText(startX, startY) { relativePage, lineIndex, charIndex -> curPage.selectText(startX, startY) { relativePage, lineIndex, charIndex ->
isTextSelected = true isTextSelected = true
firstRelativePage = relativePage firstRelativePage = relativePage
firstLineIndex = lineIndex firstLineIndex = lineIndex
firstCharIndex = charIndex firstCharIndex = charIndex
val boundary = BreakIterator.getWordInstance(Locale.getDefault()) var lineStart = lineIndex
val lineText = curPage.textPage.textLines[lineIndex].text var lineEnd = lineIndex
var start: Int
var end: Int
if (lineIndex - 1 > 0 && lineIndex + 1 < lineSize) {
// 中间行
val lineText = with(textLines) {
get(lineIndex - 1).text + get(lineIndex).text + get(lineIndex + 1).text
}
boundary.setText(lineText)
start = boundary.first()
end = boundary.next()
val cIndex = textLines[lineIndex - 1].text.length + charIndex
while (end != BreakIterator.DONE) {
if (cIndex in start until end) {
break
}
start = end
end = boundary.next()
}
if (start < textLines[lineIndex - 1].text.length) {
lineStart = lineIndex - 1
} else {
start -= textLines[lineIndex - 1].text.length
}
if (end > textLines[lineIndex - 1].text.length + textLines[lineIndex].text.length) {
lineEnd = lineIndex + 1
end = (end - textLines[lineIndex - 1].text.length
- textLines[lineIndex].text.length)
} else {
end = end - textLines[lineIndex - 1].text.length - 1
}
} else if (lineIndex - 1 > 0) {
// 尾行
val lineText = with(textLines) {
get(lineIndex - 1).text + get(lineIndex).text
}
boundary.setText(lineText) boundary.setText(lineText)
var start = boundary.first() start = boundary.first()
var end = boundary.next() end = boundary.next()
val cIndex = textLines[lineIndex - 1].text.length + charIndex
while (end != BreakIterator.DONE) {
if (cIndex in start until end) {
break
}
start = end
end = boundary.next()
}
if (start < textLines[lineIndex - 1].text.length) {
lineStart = lineIndex - 1
} else {
start -= textLines[lineIndex - 1].text.length
}
end = end - textLines[lineIndex - 1].text.length - 1
} else if (lineIndex + 1 < lineSize) {
// 首行
val lineText = with(textLines) {
get(lineIndex).text + get(lineIndex + 1).text
}
boundary.setText(lineText)
start = boundary.first()
end = boundary.next()
while (end != BreakIterator.DONE) { while (end != BreakIterator.DONE) {
if (charIndex in start until end) { if (charIndex in start until end) {
firstCharIndex = start
break break
} }
start = end start = end
end = boundary.next() end = boundary.next()
} }
curPage.selectStartMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) if (end > textLines[lineIndex].text.length) {
curPage.selectEndMoveIndex(firstRelativePage, firstLineIndex, end - 1) lineEnd = lineIndex + 1
end -= textLines[lineIndex].text.length
} else {
end -= 1
}
} else {
// 单行
val lineText = textLines[lineIndex].text
boundary.setText(lineText)
start = boundary.first()
end = boundary.next()
while (end != BreakIterator.DONE) {
if (charIndex in start until end) {
break
}
start = end
end = boundary.next()
}
end -= 1
}
curPage.selectStartMoveIndex(firstRelativePage, lineStart, start)
curPage.selectEndMoveIndex(firstRelativePage, lineEnd, end)
} }
} }

Loading…
Cancel
Save