mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
优化
This commit is contained in:
@@ -16,6 +16,7 @@ import io.legado.app.ui.book.read.PhotoDialog
|
||||
import io.legado.app.ui.book.read.page.entities.TextChar
|
||||
import io.legado.app.ui.book.read.page.entities.TextLine
|
||||
import io.legado.app.ui.book.read.page.entities.TextPage
|
||||
import io.legado.app.ui.book.read.page.entities.TextPos
|
||||
import io.legado.app.ui.book.read.page.provider.ChapterProvider
|
||||
import io.legado.app.ui.book.read.page.provider.ImageProvider
|
||||
import io.legado.app.ui.book.read.page.provider.TextPageFactory
|
||||
@@ -36,8 +37,8 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
}
|
||||
private var callBack: CallBack
|
||||
private val visibleRect = RectF()
|
||||
private val selectStart = Pos(0, 0, 0)
|
||||
private val selectEnd = Pos(0, 0, 0)
|
||||
private val selectStart = TextPos(0, 0, 0)
|
||||
private val selectEnd = TextPos(0, 0, 0)
|
||||
var textPage: TextPage = TextPage()
|
||||
private set
|
||||
|
||||
@@ -240,7 +241,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
*/
|
||||
fun selectStartMove(x: Float, y: Float) {
|
||||
touch(x, y) { relativePos, _, relativeOffset, lineIndex, textLine, charIndex, textChar ->
|
||||
val pos = Pos(relativePos, lineIndex, charIndex)
|
||||
val pos = TextPos(relativePos, lineIndex, charIndex)
|
||||
if (selectStart.compare(pos) != 0) {
|
||||
if (pos.compare(selectEnd) <= 0) {
|
||||
selectStart.upData(pos = pos)
|
||||
@@ -260,7 +261,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
*/
|
||||
fun selectEndMove(x: Float, y: Float) {
|
||||
touch(x, y) { relativePos, _, relativeOffset, lineIndex, textLine, charIndex, textChar ->
|
||||
val pos = Pos(relativePos, lineIndex, charIndex)
|
||||
val pos = TextPos(relativePos, lineIndex, charIndex)
|
||||
if (pos.compare(selectEnd) != 0) {
|
||||
if (pos.compare(selectStart) >= 0) {
|
||||
selectEnd.upData(pos)
|
||||
@@ -345,15 +346,15 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
|
||||
private fun upSelectChars() {
|
||||
val last = if (callBack.isScroll) 2 else 0
|
||||
val charPos = Pos(0, 0, 0)
|
||||
val textPos = TextPos(0, 0, 0)
|
||||
for (relativePos in 0..last) {
|
||||
charPos.relativePos = relativePos
|
||||
textPos.relativePos = relativePos
|
||||
for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) {
|
||||
charPos.lineIndex = lineIndex
|
||||
textPos.lineIndex = lineIndex
|
||||
for ((charIndex, textChar) in textLine.textChars.withIndex()) {
|
||||
charPos.charIndex = charIndex
|
||||
textPos.charIndex = charIndex
|
||||
textChar.selected =
|
||||
charPos.compare(selectStart) >= 0 && charPos.compare(selectEnd) <= 0
|
||||
textPos.compare(selectStart) >= 0 && textPos.compare(selectEnd) <= 0
|
||||
textChar.isSearchResult = textChar.selected && callBack.isSelectingSearchResult
|
||||
}
|
||||
}
|
||||
@@ -383,17 +384,17 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
}
|
||||
|
||||
fun getSelectedText(): String {
|
||||
val pos = Pos(0, 0, 0)
|
||||
val textPos = TextPos(0, 0, 0)
|
||||
val builder = StringBuilder()
|
||||
for (relativePos in selectStart.relativePos..selectEnd.relativePos) {
|
||||
val textPage = relativePage(relativePos)
|
||||
pos.relativePos = relativePos
|
||||
textPos.relativePos = relativePos
|
||||
textPage.textLines.forEachIndexed { lineIndex, textLine ->
|
||||
pos.lineIndex = lineIndex
|
||||
textPos.lineIndex = lineIndex
|
||||
textLine.textChars.forEachIndexed { charIndex, textChar ->
|
||||
pos.charIndex = charIndex
|
||||
val compareStart = pos.compare(selectStart)
|
||||
val compareEnd = pos.compare(selectEnd)
|
||||
textPos.charIndex = charIndex
|
||||
val compareStart = textPos.compare(selectStart)
|
||||
val compareEnd = textPos.compare(selectEnd)
|
||||
if (compareStart >= 0 && compareEnd <= 0) {
|
||||
builder.append(textChar.charData)
|
||||
if (
|
||||
@@ -442,31 +443,6 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
}
|
||||
}
|
||||
|
||||
private data class Pos(
|
||||
var relativePos: Int,
|
||||
var lineIndex: Int,
|
||||
var charIndex: Int
|
||||
) {
|
||||
|
||||
fun upData(pos: Pos) {
|
||||
relativePos = pos.relativePos
|
||||
lineIndex = pos.lineIndex
|
||||
charIndex = pos.charIndex
|
||||
}
|
||||
|
||||
fun compare(pos: Pos): Int {
|
||||
return when {
|
||||
relativePos < pos.relativePos -> -3
|
||||
relativePos > pos.relativePos -> 3
|
||||
lineIndex < pos.lineIndex -> -2
|
||||
lineIndex > pos.lineIndex -> 2
|
||||
charIndex < pos.charIndex -> -1
|
||||
charIndex > pos.charIndex -> 1
|
||||
else -> 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface CallBack {
|
||||
fun upSelectedStart(x: Float, y: Float, top: Float)
|
||||
fun upSelectedEnd(x: Float, y: Float)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package io.legado.app.ui.book.read.page.entities
|
||||
|
||||
data class TextPos(
|
||||
var relativePos: Int,
|
||||
var lineIndex: Int,
|
||||
var charIndex: Int
|
||||
) {
|
||||
|
||||
fun upData(pos: TextPos) {
|
||||
relativePos = pos.relativePos
|
||||
lineIndex = pos.lineIndex
|
||||
charIndex = pos.charIndex
|
||||
}
|
||||
|
||||
fun compare(pos: TextPos): Int {
|
||||
return when {
|
||||
relativePos < pos.relativePos -> -3
|
||||
relativePos > pos.relativePos -> 3
|
||||
lineIndex < pos.lineIndex -> -2
|
||||
lineIndex > pos.lineIndex -> 2
|
||||
charIndex < pos.charIndex -> -1
|
||||
charIndex > pos.charIndex -> 1
|
||||
else -> 0
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user