diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt index 0c8fa3a3b..eab124233 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt @@ -26,11 +26,14 @@ abstract class PageDelegate(protected val pageView: PageView) : ) protected val context: Context = pageView.context //起始点 - protected var startX: Float = 0.toFloat() - protected var startY: Float = 0.toFloat() + protected var startX: Float = 0f + protected var startY: Float = 0f + //上一个触碰点 + protected var lastX: Float = 0f + protected var lastY: Float = 0f //触碰点 - protected var touchX: Float = 0.toFloat() - protected var touchY: Float = 0.toFloat() + protected var touchX: Float = 0f + protected var touchY: Float = 0f protected val nextPage: ContentView get() = pageView.nextPage @@ -76,6 +79,10 @@ abstract class PageDelegate(protected val pageView: PageView) : open fun setStartPoint(x: Float, y: Float, invalidate: Boolean = true) { startX = x startY = y + lastX = x + lastY = y + touchX = x + touchY = y if (invalidate) { invalidate() @@ -83,6 +90,8 @@ abstract class PageDelegate(protected val pageView: PageView) : } open fun setTouchPoint(x: Float, y: Float, invalidate: Boolean = true) { + lastX = touchX + lastY = touchY touchX = x touchY = y @@ -101,6 +110,16 @@ abstract class PageDelegate(protected val pageView: PageView) : pageView.invalidate() } + open fun fling( + startX: Int, startY: Int, velocityX: Int, velocityY: Int, + minX: Int, maxX: Int, minY: Int, maxY: Int + ) { + scroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY) + isRunning = true + isStarted = true + invalidate() + } + protected fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int) { scroller.startScroll( startX, @@ -331,20 +350,4 @@ abstract class PageDelegate(protected val pageView: PageView) : NONE, PREV, NEXT } - fun MotionEvent.toAction(action: Int): MotionEvent { - return MotionEvent.obtain( - downTime, - eventTime, - action, - x, - y, - pressure, - size, - metaState, - xPrecision, - yPrecision, - deviceId, - edgeFlags - ) - } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt index a3de87a4d..3d2af49dd 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt @@ -14,7 +14,11 @@ class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { private val mVelocity: VelocityTracker = VelocityTracker.obtain() override fun onAnimStart() { - + //惯性滚动 + fling( + 0, touchY.toInt(), 0, mVelocity.yVelocity.toInt(), + 0, 0, -10 * viewHeight, 10 * viewHeight + ) } override fun onDraw(canvas: Canvas) { @@ -29,6 +33,7 @@ class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { override fun onDown(e: MotionEvent): Boolean { mVelocity.clear() + mVelocity.addMovement(e) return super.onDown(e) } @@ -38,12 +43,11 @@ class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { distanceX: Float, distanceY: Float ): Boolean { + mVelocity.addMovement(e2) + setTouchPoint(e2.x, e2.y) if (!isMoved && abs(distanceX) < abs(distanceY)) { if (distanceY < 0) { if (atTop) { - val event = e1.toAction(MotionEvent.ACTION_UP) - curPage.dispatchTouchEvent(event) - event.recycle() //如果上一页不存在 if (!hasPrev()) { noNext = true @@ -54,9 +58,6 @@ class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { } } else { if (atBottom) { - val event = e1.toAction(MotionEvent.ACTION_UP) - curPage.dispatchTouchEvent(event) - event.recycle() //如果不存在表示没有下一页了 if (!hasNext()) { noNext = true @@ -81,6 +82,15 @@ class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { return isMoved } + override fun onFling( + e1: MotionEvent?, + e2: MotionEvent?, + velocityX: Float, + velocityY: Float + ): Boolean { + mVelocity.addMovement(e2) + return super.onFling(e1, e2, velocityX, velocityY) + } override fun onDestroy() { super.onDestroy()