pull/1164/head
gedoor 4 years ago
parent eb42f84a8b
commit df838197ae
  1. 197
      app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt

@ -227,36 +227,16 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
select: (relativePage: Int, lineIndex: Int, charIndex: Int) -> Unit, select: (relativePage: Int, lineIndex: Int, charIndex: Int) -> Unit,
) { ) {
if (!selectAble) return if (!selectAble) return
if (!visibleRect.contains(x, y)) return touch(x, y) { relativePos, textPage, _, lineIndex, _, charIndex, textChar ->
var relativeOffset: Float
for (relativePos in 0..2) {
relativeOffset = relativeOffset(relativePos)
if (relativePos > 0) {
//滚动翻页
if (!callBack.isScroll) return
if (relativeOffset >= ChapterProvider.visibleHeight) return
}
val page = relativePage(relativePos)
for ((lineIndex, textLine) in page.textLines.withIndex()) {
if (textLine.isTouch(y, relativeOffset)) {
for ((charIndex, textChar) in textLine.textChars.withIndex()) {
if (textChar.isTouch(x)) {
if (textChar.isImage) { if (textChar.isImage) {
activity?.supportFragmentManager?.let { activity?.supportFragmentManager?.let {
PhotoDialog.show(it, page.chapterIndex, textChar.charData) PhotoDialog.show(it, textPage.chapterIndex, textChar.charData)
} }
} else { } else {
textChar.selected = true textChar.selected = true
invalidate() invalidate()
select(relativePos, lineIndex, charIndex) select(relativePos, lineIndex, charIndex)
} }
return
}
}
return
}
}
} }
} }
@ -264,25 +244,14 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
* 开始选择符移动 * 开始选择符移动
*/ */
fun selectStartMove(x: Float, y: Float) { fun selectStartMove(x: Float, y: Float) {
if (!visibleRect.contains(x, y)) return touch(x, y) { relativePos, _, relativeOffset, lineIndex, textLine, charIndex, textChar ->
var relativeOffset: Float if (selectStart[0] != relativePos ||
for (relativePos in 0..2) { selectStart[1] != lineIndex ||
relativeOffset = relativeOffset(relativePos) selectStart[2] != charIndex
if (relativePos > 0) { ) {
//滚动翻页
if (!callBack.isScroll) return
if (relativeOffset >= ChapterProvider.visibleHeight) return
}
for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) {
if (textLine.isTouch(y, relativeOffset)) {
for ((charIndex, textChar) in textLine.textChars.withIndex()) {
if (textChar.isTouch(x)) {
if (selectStart[0] != relativePos || selectStart[1] != lineIndex || selectStart[2] != charIndex) {
if (selectToInt(relativePos, lineIndex, charIndex) if (selectToInt(relativePos, lineIndex, charIndex)
> selectToInt(selectEnd) < selectToInt(selectEnd)
) { ) {
return
}
selectStart[0] = relativePos selectStart[0] = relativePos
selectStart[1] = lineIndex selectStart[1] = lineIndex
selectStart[2] = charIndex selectStart[2] = charIndex
@ -293,11 +262,6 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
) )
upSelectChars() upSelectChars()
} }
return
}
}
return
}
} }
} }
} }
@ -306,34 +270,57 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
* 结束选择符移动 * 结束选择符移动
*/ */
fun selectEndMove(x: Float, y: Float) { fun selectEndMove(x: Float, y: Float) {
if (!visibleRect.contains(x, y)) return touch(x, y) { relativePos, _, relativeOffset, lineIndex, textLine, charIndex, textChar ->
var relativeOffset: Float
for (relativePos in 0..2) {
relativeOffset = relativeOffset(relativePos)
if (relativePos > 0) {
//滚动翻页
if (!callBack.isScroll) return
if (relativeOffset >= ChapterProvider.visibleHeight) return
}
for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) {
if (textLine.isTouch(y, relativeOffset)) {
for ((charIndex, textChar) in textLine.textChars.withIndex()) {
if (textChar.isTouch(x)) {
if (selectEnd[0] != relativePos if (selectEnd[0] != relativePos
|| selectEnd[1] != lineIndex || selectEnd[1] != lineIndex
|| selectEnd[2] != charIndex || selectEnd[2] != charIndex
) { ) {
if (selectToInt(relativePos, lineIndex, charIndex) if (selectToInt(relativePos, lineIndex, charIndex)
< selectToInt(selectStart) > selectToInt(selectStart)
) { ) {
return
}
selectEnd[0] = relativePos selectEnd[0] = relativePos
selectEnd[1] = lineIndex selectEnd[1] = lineIndex
selectEnd[2] = charIndex selectEnd[2] = charIndex
upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset) upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset)
upSelectChars() upSelectChars()
} }
}
}
}
private fun touch(
x: Float,
y: Float,
touched: (
relativePos: Int,
textPage: TextPage,
relativeOffset: Float,
lineIndex: Int,
textLine: TextLine,
charIndex: Int,
textChar: TextChar
) -> Unit
) {
if (!visibleRect.contains(x, y)) return
var relativeOffset: Float
for (relativePos in 0..2) {
relativeOffset = relativeOffset(relativePos)
if (relativePos > 0) {
//滚动翻页
if (!callBack.isScroll) return
if (relativeOffset >= ChapterProvider.visibleHeight) return
}
val textPage = relativePage(relativePos)
for ((lineIndex, textLine) in textPage.textLines.withIndex()) {
if (textLine.isTouch(y, relativeOffset)) {
for ((charIndex, textChar) in textLine.textChars.withIndex()) {
if (textChar.isTouch(x)) {
touched.invoke(
relativePos, textPage,
relativeOffset,
lineIndex, textLine,
charIndex, textChar
)
return return
} }
} }
@ -378,29 +365,35 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
for (relativePos in 0..last) { for (relativePos in 0..last) {
for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) { for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) {
for ((charIndex, textChar) in textLine.textChars.withIndex()) { for ((charIndex, textChar) in textLine.textChars.withIndex()) {
textChar.selected = textChar.selected = when {
if (relativePos == selectStart[0] relativePos == selectStart[0]
&& relativePos == selectEnd[0] && relativePos == selectEnd[0]
&& lineIndex == selectStart[1] && lineIndex == selectStart[1]
&& lineIndex == selectEnd[1] && lineIndex == selectEnd[1] -> {
) {
charIndex in selectStart[2]..selectEnd[2] charIndex in selectStart[2]..selectEnd[2]
} else if (relativePos == selectStart[0] && lineIndex == selectStart[1]) { }
relativePos == selectStart[0] && lineIndex == selectStart[1] -> {
charIndex >= selectStart[2] charIndex >= selectStart[2]
} else if (relativePos == selectEnd[0] && lineIndex == selectEnd[1]) { }
relativePos == selectEnd[0] && lineIndex == selectEnd[1] -> {
charIndex <= selectEnd[2] charIndex <= selectEnd[2]
} else if (relativePos == selectStart[0] && relativePos == selectEnd[0]) { }
relativePos == selectStart[0] && relativePos == selectEnd[0] -> {
lineIndex in (selectStart[1] + 1) until selectEnd[1] lineIndex in (selectStart[1] + 1) until selectEnd[1]
} else if (relativePos == selectStart[0]) { }
relativePos == selectStart[0] -> {
lineIndex > selectStart[1] lineIndex > selectStart[1]
} else if (relativePos == selectEnd[0]) { }
relativePos == selectEnd[0] -> {
lineIndex < selectEnd[1] lineIndex < selectEnd[1]
} else { }
else -> {
relativePos in selectStart[0] + 1 until selectEnd[0] relativePos in selectStart[0] + 1 until selectEnd[0]
} }
} }
} }
} }
}
invalidate() invalidate()
} }
@ -430,57 +423,71 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
val stringBuilder = StringBuilder() val stringBuilder = StringBuilder()
for (relativePos in selectStart[0]..selectEnd[0]) { for (relativePos in selectStart[0]..selectEnd[0]) {
val textPage = relativePage(relativePos) val textPage = relativePage(relativePos)
if (relativePos == selectStart[0] && relativePos == selectEnd[0]) { when {
relativePos == selectStart[0] && relativePos == selectEnd[0] -> {
for (lineIndex in selectStart[1]..selectEnd[1]) { for (lineIndex in selectStart[1]..selectEnd[1]) {
if (lineIndex == selectStart[1] && lineIndex == selectEnd[1]) { when {
lineIndex == selectStart[1] && lineIndex == selectEnd[1] -> {
stringBuilder.append( stringBuilder.append(
textPage.textLines[lineIndex].text.substring( textPage.textLines[lineIndex].text
selectStart[2], .substring(selectStart[2], selectEnd[2] + 1)
selectEnd[2] + 1
)
) )
} else if (lineIndex == selectStart[1]) { }
lineIndex == selectStart[1] -> {
stringBuilder.append( stringBuilder.append(
textPage.textLines[lineIndex].text.substring( textPage.textLines[lineIndex].text
selectStart[2] .substring(selectStart[2])
) )
) }
} else if (lineIndex == selectEnd[1]) { lineIndex == selectEnd[1] -> {
stringBuilder.append( stringBuilder.append(
textPage.textLines[lineIndex].text.substring(0, selectEnd[2] + 1) textPage.textLines[lineIndex].text
.substring(0, selectEnd[2] + 1)
) )
} else { }
else -> {
stringBuilder.append(textPage.textLines[lineIndex].text) stringBuilder.append(textPage.textLines[lineIndex].text)
} }
} }
} else if (relativePos == selectStart[0]) { }
for (lineIndex in selectStart[1] until relativePage(relativePos).textLines.size) { }
if (lineIndex == selectStart[1]) { relativePos == selectStart[0] -> {
for (lineIndex in selectStart[1] until textPage.textLines.size) {
when (lineIndex) {
selectStart[1] -> {
stringBuilder.append( stringBuilder.append(
textPage.textLines[lineIndex].text.substring( textPage.textLines[lineIndex].text
selectStart[2] .substring(selectStart[2])
)
) )
} else { }
else -> {
stringBuilder.append(textPage.textLines[lineIndex].text) stringBuilder.append(textPage.textLines[lineIndex].text)
} }
} }
} else if (relativePos == selectEnd[0]) { }
}
relativePos == selectEnd[0] -> {
for (lineIndex in 0..selectEnd[1]) { for (lineIndex in 0..selectEnd[1]) {
if (lineIndex == selectEnd[1]) { when (lineIndex) {
selectEnd[1] -> {
stringBuilder.append( stringBuilder.append(
textPage.textLines[lineIndex].text.substring(0, selectEnd[2] + 1) textPage.textLines[lineIndex].text
.substring(0, selectEnd[2] + 1)
) )
} else { }
else -> {
stringBuilder.append(textPage.textLines[lineIndex].text) stringBuilder.append(textPage.textLines[lineIndex].text)
} }
} }
} else if (relativePos in selectStart[0] + 1 until selectEnd[0]) { }
}
relativePos in selectStart[0] + 1 until selectEnd[0] -> {
for (lineIndex in selectStart[1]..selectEnd[1]) { for (lineIndex in selectStart[1]..selectEnd[1]) {
stringBuilder.append(textPage.textLines[lineIndex].text) stringBuilder.append(textPage.textLines[lineIndex].text)
} }
} }
} }
}
return stringBuilder.toString() return stringBuilder.toString()
} }

Loading…
Cancel
Save