pull/34/head
parent
09bf55bcf4
commit
a2f49c7c0b
@ -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…
Reference in new issue