pull/34/head
kunfei 5 years ago
parent 09bf55bcf4
commit a2f49c7c0b
  1. 10
      app/src/main/java/io/legado/app/ui/widget/page/TextPageFactory.kt
  2. 37
      app/src/main/java/io/legado/app/ui/widget/page/delegate/PageDelegate.kt
  3. 61
      app/src/main/java/io/legado/app/ui/widget/page/delegate/ScrollPageDelegate.kt

@ -39,7 +39,9 @@ class TextPageFactory private constructor(dataSource: DataSource) :
override fun moveToNext(): Boolean = dataSource.pageIndex().let { index -> override fun moveToNext(): Boolean = dataSource.pageIndex().let { index ->
return if (hasNext()) { return if (hasNext()) {
if (dataSource.getCurrentChapter()?.isLastIndex(index) == true) { if (dataSource.getCurrentChapter()?.isLastIndex(index) == true
|| dataSource.isScrollDelegate()
) {
dataSource.moveToNextChapter() dataSource.moveToNextChapter()
} else { } else {
dataSource.setPageIndex(index.plus(1)) dataSource.setPageIndex(index.plus(1))
@ -51,10 +53,10 @@ class TextPageFactory private constructor(dataSource: DataSource) :
override fun moveToPrevious(): Boolean = dataSource.pageIndex().let { index -> override fun moveToPrevious(): Boolean = dataSource.pageIndex().let { index ->
return if (hasPrev()) { return if (hasPrev()) {
if (index > 0) { if (index <= 0 || dataSource.isScrollDelegate()) {
dataSource.setPageIndex(index.minus(1))
} else {
dataSource.moveToPrevChapter() dataSource.moveToPrevChapter()
} else {
dataSource.setPageIndex(index.minus(1))
} }
true true
} else } else

@ -176,7 +176,7 @@ abstract class PageDelegate(protected val pageView: PageView) {
/** /**
* 触摸事件处理 * 触摸事件处理
*/ */
fun onTouch(event: MotionEvent): Boolean { open fun onTouch(event: MotionEvent): Boolean {
if (isStarted) return false if (isStarted) return false
if (curPage?.isTextSelected() == true) { if (curPage?.isTextSelected() == true) {
curPage?.dispatchTouchEvent(event) curPage?.dispatchTouchEvent(event)
@ -278,8 +278,35 @@ abstract class PageDelegate(protected val pageView: PageView) {
if (pageView.isScrollDelegate()) { if (pageView.isScrollDelegate()) {
//传递触摸事件到textView //传递触摸事件到textView
curPage?.dispatchTouchEvent(e2) curPage?.dispatchTouchEvent(e2)
if (!isMoved && abs(distanceX) < abs(distanceY)) {
if (distanceY < 0) {
//上一页的参数配置
direction = Direction.PREV
//判断是否上一页存在
val hasPrev = pageView.hasPrev()
//如果上一页不存在
if (!hasPrev) {
noNext = true
return true
} }
if (!isMoved && abs(distanceX) > abs(distanceY)) { //上一页截图
bitmap = prevPage?.screenshot()
} else {
//进行下一页的配置
direction = Direction.NEXT
//判断是否下一页存在
val hasNext = pageView.hasNext()
//如果不存在表示没有下一页了
if (!hasNext) {
noNext = true
return true
}
//下一页截图
bitmap = nextPage?.screenshot()
}
isMoved = true
}
} else if (!isMoved && abs(distanceX) > abs(distanceY)) {
if (distanceX < 0) { if (distanceX < 0) {
//上一页的参数配置 //上一页的参数配置
direction = Direction.PREV direction = Direction.PREV
@ -308,7 +335,11 @@ abstract class PageDelegate(protected val pageView: PageView) {
isMoved = true isMoved = true
} }
if (isMoved) { if (isMoved) {
isCancel = if (direction == Direction.NEXT) distanceX < 0 else distanceX > 0 isCancel = if (pageView.isScrollDelegate()) {
if (direction == Direction.NEXT) distanceY < 0 else distanceY > 0
} else {
if (direction == Direction.NEXT) distanceX < 0 else distanceX > 0
}
isRunning = true isRunning = true
//设置触摸点 //设置触摸点
setTouchPoint(e2.x, e2.y) setTouchPoint(e2.x, e2.y)

@ -1,21 +1,78 @@
package io.legado.app.ui.widget.page.delegate package io.legado.app.ui.widget.page.delegate
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Matrix
import android.view.MotionEvent
import io.legado.app.ui.widget.page.PageView import io.legado.app.ui.widget.page.PageView
class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) {
private var atTop: Boolean = false
private var atBottom: Boolean = false
private val bitmapMatrix = Matrix()
override fun onTouch(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
curPage?.contentTextView()?.let {
atTop = it.atTop()
atBottom = it.atBottom()
}
}
return super.onTouch(event)
}
override fun onScrollStart() { override fun onScrollStart() {
if (!atTop && !atBottom) {
stopScroll()
return
}
val distanceY: Float
when (direction) {
Direction.NEXT -> if (isCancel) {
var dis = viewHeight - startY + touchY
if (dis > viewHeight) {
dis = viewHeight.toFloat()
}
distanceY = viewHeight - dis
} else {
distanceY = -(touchY + (viewHeight - startY))
}
else -> distanceY = if (isCancel) {
-(touchY - startY)
} else {
viewWidth - (touchY - startY)
}
}
startScroll(0, touchY.toInt(), 0, distanceY.toInt())
} }
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
if (atTop || atBottom) {
val offsetY = touchY - startY
if ((direction == Direction.NEXT && offsetY > 0)
|| (direction == Direction.PREV && offsetY < 0)
) return
val distanceY = if (offsetY > 0) offsetY - viewHeight else offsetY + viewHeight
if (atTop && direction == Direction.PREV) {
bitmap?.let {
bitmapMatrix.setTranslate(0.toFloat(), distanceY)
canvas.drawBitmap(it, bitmapMatrix, null)
}
} else if (atBottom && direction == Direction.NEXT) {
bitmap?.let {
bitmapMatrix.setTranslate(0.toFloat(), distanceY)
canvas.drawBitmap(it, bitmapMatrix, null)
}
}
}
} }
override fun onScrollStop() { override fun onScrollStop() {
if (!isCancel) {
pageView.fillPage(direction)
}
} }
} }
Loading…
Cancel
Save