pull/1164/head
gedoor 4 years ago
parent eb42f84a8b
commit df838197ae
  1. 269
      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 if (textChar.isImage) {
for (relativePos in 0..2) { activity?.supportFragmentManager?.let {
relativeOffset = relativeOffset(relativePos) PhotoDialog.show(it, textPage.chapterIndex, textChar.charData)
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) {
activity?.supportFragmentManager?.let {
PhotoDialog.show(it, page.chapterIndex, textChar.charData)
}
} else {
textChar.selected = true
invalidate()
select(relativePos, lineIndex, charIndex)
}
return
}
}
return
} }
} else {
textChar.selected = true
invalidate()
select(relativePos, lineIndex, charIndex)
} }
} }
} }
@ -264,39 +244,23 @@ 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 (selectToInt(relativePos, lineIndex, charIndex)
if (!callBack.isScroll) return < selectToInt(selectEnd)
if (relativeOffset >= ChapterProvider.visibleHeight) return ) {
} selectStart[0] = relativePos
for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) { selectStart[1] = lineIndex
if (textLine.isTouch(y, relativeOffset)) { selectStart[2] = charIndex
for ((charIndex, textChar) in textLine.textChars.withIndex()) { upSelectedStart(
if (textChar.isTouch(x)) { textChar.start,
if (selectStart[0] != relativePos || selectStart[1] != lineIndex || selectStart[2] != charIndex) { textLine.lineBottom + relativeOffset,
if (selectToInt(relativePos, lineIndex, charIndex) textLine.lineTop + relativeOffset
> selectToInt(selectEnd) )
) { upSelectChars()
return
}
selectStart[0] = relativePos
selectStart[1] = lineIndex
selectStart[2] = charIndex
upSelectedStart(
textChar.start,
textLine.lineBottom + relativeOffset,
textLine.lineTop + relativeOffset
)
upSelectChars()
}
return
}
}
return
} }
} }
} }
@ -306,6 +270,37 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
* 结束选择符移动 * 结束选择符移动
*/ */
fun selectEndMove(x: Float, y: Float) { fun selectEndMove(x: Float, y: Float) {
touch(x, y) { relativePos, _, relativeOffset, lineIndex, textLine, charIndex, textChar ->
if (selectEnd[0] != relativePos
|| selectEnd[1] != lineIndex
|| selectEnd[2] != charIndex
) {
if (selectToInt(relativePos, lineIndex, charIndex)
> selectToInt(selectStart)
) {
selectEnd[0] = relativePos
selectEnd[1] = lineIndex
selectEnd[2] = charIndex
upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset)
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 if (!visibleRect.contains(x, y)) return
var relativeOffset: Float var relativeOffset: Float
for (relativePos in 0..2) { for (relativePos in 0..2) {
@ -315,25 +310,17 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
if (!callBack.isScroll) return if (!callBack.isScroll) return
if (relativeOffset >= ChapterProvider.visibleHeight) return if (relativeOffset >= ChapterProvider.visibleHeight) return
} }
for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) { val textPage = relativePage(relativePos)
for ((lineIndex, textLine) in textPage.textLines.withIndex()) {
if (textLine.isTouch(y, relativeOffset)) { if (textLine.isTouch(y, relativeOffset)) {
for ((charIndex, textChar) in textLine.textChars.withIndex()) { for ((charIndex, textChar) in textLine.textChars.withIndex()) {
if (textChar.isTouch(x)) { if (textChar.isTouch(x)) {
if (selectEnd[0] != relativePos touched.invoke(
|| selectEnd[1] != lineIndex relativePos, textPage,
|| selectEnd[2] != charIndex relativeOffset,
) { lineIndex, textLine,
if (selectToInt(relativePos, lineIndex, charIndex) charIndex, textChar
< selectToInt(selectStart) )
) {
return
}
selectEnd[0] = relativePos
selectEnd[1] = lineIndex
selectEnd[2] = charIndex
upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset)
upSelectChars()
}
return return
} }
} }
@ -378,26 +365,32 @@ 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]
} }
}
} }
} }
} }
@ -430,54 +423,68 @@ 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 {
for (lineIndex in selectStart[1]..selectEnd[1]) { relativePos == selectStart[0] && relativePos == selectEnd[0] -> {
if (lineIndex == selectStart[1] && lineIndex == selectEnd[1]) { for (lineIndex in selectStart[1]..selectEnd[1]) {
stringBuilder.append( when {
textPage.textLines[lineIndex].text.substring( lineIndex == selectStart[1] && lineIndex == selectEnd[1] -> {
selectStart[2], stringBuilder.append(
selectEnd[2] + 1 textPage.textLines[lineIndex].text
) .substring(selectStart[2], selectEnd[2] + 1)
) )
} else if (lineIndex == selectStart[1]) { }
stringBuilder.append( lineIndex == selectStart[1] -> {
textPage.textLines[lineIndex].text.substring( stringBuilder.append(
selectStart[2] textPage.textLines[lineIndex].text
) .substring(selectStart[2])
) )
} else if (lineIndex == selectEnd[1]) { }
stringBuilder.append( lineIndex == selectEnd[1] -> {
textPage.textLines[lineIndex].text.substring(0, selectEnd[2] + 1) stringBuilder.append(
) textPage.textLines[lineIndex].text
} else { .substring(0, selectEnd[2] + 1)
stringBuilder.append(textPage.textLines[lineIndex].text) )
}
else -> {
stringBuilder.append(textPage.textLines[lineIndex].text)
}
}
} }
} }
} else if (relativePos == selectStart[0]) { relativePos == selectStart[0] -> {
for (lineIndex in selectStart[1] until relativePage(relativePos).textLines.size) { for (lineIndex in selectStart[1] until textPage.textLines.size) {
if (lineIndex == selectStart[1]) { when (lineIndex) {
stringBuilder.append( selectStart[1] -> {
textPage.textLines[lineIndex].text.substring( stringBuilder.append(
selectStart[2] textPage.textLines[lineIndex].text
) .substring(selectStart[2])
) )
} else { }
stringBuilder.append(textPage.textLines[lineIndex].text) else -> {
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) {
stringBuilder.append( selectEnd[1] -> {
textPage.textLines[lineIndex].text.substring(0, selectEnd[2] + 1) stringBuilder.append(
) textPage.textLines[lineIndex].text
} else { .substring(0, selectEnd[2] + 1)
stringBuilder.append(textPage.textLines[lineIndex].text) )
}
else -> {
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)
}
} }
} }
} }

Loading…
Cancel
Save