选择文本时优先选词

pull/737/head
gedoor 4 years ago
parent 4bd52c18d1
commit 3e83d50762
  1. 114
      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 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 autoPageRect by lazy {
Rect()
}
private val autoPagePint by lazy {
Paint().apply {
color = context.accentColor
}
}
private val autoPageRect by lazy { Rect() }
private val autoPagePint by lazy { Paint().apply { color = context.accentColor } }
private val boundary by lazy { BreakIterator.getWordInstance(Locale.getDefault()) }
init {
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 ->
isTextSelected = true
firstRelativePage = relativePage
firstLineIndex = lineIndex
firstCharIndex = charIndex
val boundary = BreakIterator.getWordInstance(Locale.getDefault())
val lineText = curPage.textPage.textLines[lineIndex].text
boundary.setText(lineText)
var start = boundary.first()
var end = boundary.next()
while (end != BreakIterator.DONE) {
if (charIndex in start until end) {
firstCharIndex = start
break
var lineStart = lineIndex
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)
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
}
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) {
if (charIndex in start until end) {
break
}
start = end
end = boundary.next()
}
if (end > textLines[lineIndex].text.length) {
lineEnd = lineIndex + 1
end -= textLines[lineIndex].text.length
} else {
end -= 1
}
start = end
} 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, firstLineIndex, firstCharIndex)
curPage.selectEndMoveIndex(firstRelativePage, firstLineIndex, end - 1)
curPage.selectStartMoveIndex(firstRelativePage, lineStart, start)
curPage.selectEndMoveIndex(firstRelativePage, lineEnd, end)
}
}

Loading…
Cancel
Save