pull/48/head
kunfei 5 years ago
parent 6edfd8f7a3
commit fbd962c07a
  1. 40
      app/src/main/java/io/legado/app/ui/widget/page/PageView.kt
  2. 6
      app/src/main/java/io/legado/app/ui/widget/page/curl/CurlRenderer.kt
  3. 13
      app/src/main/java/io/legado/app/ui/widget/page/curl/CurlView.kt
  4. 2
      app/src/main/java/io/legado/app/ui/widget/page/delegate/PageDelegate.kt
  5. 85
      app/src/main/java/io/legado/app/ui/widget/page/delegate/SimulationPageDelegate.kt

@ -17,7 +17,7 @@ class PageView(context: Context, attrs: AttributeSet) :
ContentView.CallBack,
DataSource {
var callback: CallBack? = null
var callBack: CallBack? = null
var pageFactory: TextPageFactory? = null
private var pageDelegate: PageDelegate? = null
@ -27,7 +27,7 @@ class PageView(context: Context, attrs: AttributeSet) :
var curlView: CurlView? = null
init {
callback = activity as? CallBack
callBack = activity as? CallBack
prevPage = ContentView(context)
addView(prevPage)
nextPage = ContentView(context)
@ -111,7 +111,7 @@ class PageView(context: Context, attrs: AttributeSet) :
curPage?.setContent(it.currentPage())
nextPage?.setContent(it.nextPage())
prevPage?.setContent(it.previousPage())
callback?.let { callback ->
callBack?.let { callback ->
if (isScrollDelegate) {
curPage?.scrollTo(callback.textChapter()?.getStartLine(callback.durChapterPos()))
}
@ -128,7 +128,7 @@ class PageView(context: Context, attrs: AttributeSet) :
fun moveToPrevPage(noAnim: Boolean = true) {
if (noAnim) {
if (isScrollDelegate) {
callback?.textChapter()?.let {
callBack?.textChapter()?.let {
curPage?.scrollTo(it.getStartLine(pageIndex - 1))
}
} else {
@ -140,7 +140,7 @@ class PageView(context: Context, attrs: AttributeSet) :
fun moveToNextPage(noAnim: Boolean = true) {
if (noAnim) {
if (isScrollDelegate) {
callback?.textChapter()?.let {
callBack?.textChapter()?.let {
curPage?.scrollTo(it.getStartLine(pageIndex + 1))
}
} else {
@ -180,68 +180,68 @@ class PageView(context: Context, attrs: AttributeSet) :
get() = pageDelegate is ScrollPageDelegate
override val pageIndex: Int
get() = callback?.durChapterPos() ?: 0
get() = callBack?.durChapterPos() ?: 0
override fun setPageIndex(pageIndex: Int) {
callback?.setPageIndex(pageIndex)
callBack?.setPageIndex(pageIndex)
}
override fun getChapterPosition(): Int {
return callback?.durChapterIndex() ?: 0
return callBack?.durChapterIndex() ?: 0
}
override fun getChapter(position: Int): TextChapter? {
return callback?.textChapter(position)
return callBack?.textChapter(position)
}
override fun getCurrentChapter(): TextChapter? {
return callback?.textChapter(0)
return callBack?.textChapter(0)
}
override fun getNextChapter(): TextChapter? {
return callback?.textChapter(1)
return callBack?.textChapter(1)
}
override fun getPreviousChapter(): TextChapter? {
return callback?.textChapter(-1)
return callBack?.textChapter(-1)
}
override fun hasNextChapter(): Boolean {
callback?.let {
callBack?.let {
return it.durChapterIndex() < it.chapterSize() - 1
}
return false
}
override fun hasPrevChapter(): Boolean {
callback?.let {
callBack?.let {
return it.durChapterIndex() > 0
}
return false
}
override fun moveToNextChapter() {
callback?.moveToNextChapter(false)
callBack?.moveToNextChapter(false)
}
override fun moveToPrevChapter() {
callback?.moveToPrevChapter(false)
callBack?.moveToPrevChapter(false)
}
override fun scrollToLine(line: Int) {
if (isScrollDelegate) {
callback?.textChapter()?.let {
callBack?.textChapter()?.let {
val pageIndex = it.getPageIndex(line)
curPage?.setPageIndex(pageIndex)
callback?.setPageIndex(pageIndex)
callBack?.setPageIndex(pageIndex)
}
}
}
override fun scrollToLast() {
if (isScrollDelegate) {
callback?.textChapter()?.let {
callback?.setPageIndex(it.lastIndex())
callBack?.textChapter()?.let {
callBack?.setPageIndex(it.lastIndex())
curPage?.setPageIndex(it.lastIndex())
}
}

@ -67,6 +67,10 @@ class CurlRenderer(private val mObserver: Observer) : GLSurfaceView.Renderer {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT)
gl.glLoadIdentity()
if (!mObserver.canDraw) {
return
}
for (i in mCurlMeshes.indices) {
mCurlMeshes[i].onDrawFrame(gl)
}
@ -200,6 +204,8 @@ class CurlRenderer(private val mObserver: Observer) : GLSurfaceView.Renderer {
* what needs to be done when this happens.
*/
fun onSurfaceCreated()
var canDraw: Boolean
}
companion object {

@ -18,7 +18,7 @@ import kotlin.math.sqrt
* @author harism
*/
class CurlView : GLSurfaceView, View.OnTouchListener, CurlRenderer.Observer {
var callBack: CallBack? = null
private var mAllowLastPageCurl = true
private var mAnimate = false
@ -133,6 +133,8 @@ class CurlView : GLSurfaceView, View.OnTouchListener, CurlRenderer.Observer {
mPageRight.setFlipTexture(false)
}
override var canDraw: Boolean = false
override fun onDrawFrame() {
// We are not animating.
if (!mAnimate) {
@ -155,7 +157,9 @@ class CurlView : GLSurfaceView, View.OnTouchListener, CurlRenderer.Observer {
// If we were curling left page update current index.
if (mCurlState == CURL_LEFT) {
--mCurrentIndex
callBack?.pageChange(-1)
}
canDraw = false
} else if (mAnimationTargetEvent == SET_CURL_TO_LEFT) {
// Switch curled page to left.
val left = mPageCurl
@ -172,7 +176,9 @@ class CurlView : GLSurfaceView, View.OnTouchListener, CurlRenderer.Observer {
// If we were curling right page update current index.
if (mCurlState == CURL_RIGHT) {
++mCurrentIndex
callBack?.pageChange(1)
}
canDraw = false
}
mCurlState = CURL_NONE
mAnimate = false
@ -187,6 +193,7 @@ class CurlView : GLSurfaceView, View.OnTouchListener, CurlRenderer.Observer {
}
}
override fun onPageSizeChanged(width: Int, height: Int) {
mPageBitmapWidth = width
mPageBitmapHeight = height
@ -738,6 +745,10 @@ class CurlView : GLSurfaceView, View.OnTouchListener, CurlRenderer.Observer {
fun onSizeChanged(width: Int, height: Int)
}
interface CallBack {
fun pageChange(change: Int)
}
companion object {
// Curl state. We are flipping none, left or right page.

@ -253,7 +253,7 @@ abstract class PageDelegate(protected val pageView: PageView) {
val x = e.x
val y = e.y
if (centerRectF.contains(x, y)) {
pageView.callback?.clickCenter()
pageView.callBack?.clickCenter()
setTouchPoint(x, y)
} else {
bitmap = if (x > viewWidth / 2) {

@ -6,21 +6,31 @@ import io.legado.app.ui.widget.page.PageView
import io.legado.app.ui.widget.page.curl.CurlPage
import io.legado.app.ui.widget.page.curl.CurlView
import io.legado.app.utils.screenshot
import kotlin.math.abs
class SimulationPageDelegate(pageView: PageView) : HorizontalPageDelegate(pageView) {
class SimulationPageDelegate(pageView: PageView) : HorizontalPageDelegate(pageView),
CurlView.CallBack {
var curlView: CurlView? = null
init {
pageView.curlView ?: let {
pageView.curlView = CurlView(pageView.context)
pageView.addView(pageView.curlView)
pageView.curlView?.mPageProvider = PageProvider()
pageView.curlView?.setSizeChangedObserver(SizeChangedObserver())
pageView.curlView?.currentIndex = 1
curlView = CurlView(pageView.context)
pageView.curlView = curlView
pageView.addView(curlView)
curlView?.mPageProvider = PageProvider()
curlView?.setSizeChangedObserver(SizeChangedObserver())
curlView?.callBack = this
}
}
override fun onTouch(event: MotionEvent): Boolean {
pageView.curlView?.dispatchTouchEvent(event)
when (event.action) {
MotionEvent.ACTION_DOWN -> {
curlView?.currentIndex = 1
}
}
curlView?.dispatchTouchEvent(event)
return super.onTouch(event)
}
@ -33,9 +43,64 @@ class SimulationPageDelegate(pageView: PageView) : HorizontalPageDelegate(pageVi
override fun onScrollStop() {
}
override fun onScroll(
e1: MotionEvent,
e2: MotionEvent,
distanceX: Float,
distanceY: Float
): Boolean {
if (!isMoved) {
val event = e1.toAction(MotionEvent.ACTION_UP)
curPage?.dispatchTouchEvent(event)
event.recycle()
if (abs(distanceX) > abs(distanceY)) {
if (distanceX < 0) {
//如果上一页不存在
if (!hasPrev()) {
noNext = true
return true
}
//上一页截图
bitmap = prevPage?.screenshot()
} else {
//如果不存在表示没有下一页了
if (!hasNext()) {
noNext = true
return true
}
//下一页截图
bitmap = nextPage?.screenshot()
}
isMoved = true
}
}
if (isMoved) {
curlView?.canDraw = true
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
//设置触摸点
setTouchPoint(e2.x, e2.y)
}
return isMoved
}
override fun onPageUp() {
pageView.curlView?.updatePages()
pageView.curlView?.requestRender()
curlView?.updatePages()
curlView?.requestRender()
}
override fun pageChange(change: Int) {
pageView.post {
if (change > 0) {
pageView.moveToNextPage()
} else {
pageView.moveToPrevPage()
}
}
}
private inner class PageProvider : CurlView.PageProvider {
@ -55,7 +120,7 @@ class SimulationPageDelegate(pageView: PageView) : HorizontalPageDelegate(pageVi
// 定义书籍尺寸的变化监听器
private inner class SizeChangedObserver : CurlView.SizeChangedObserver {
override fun onSizeChanged(width: Int, height: Int) {
pageView.curlView?.setViewMode(CurlView.SHOW_ONE_PAGE)
curlView?.setViewMode(CurlView.SHOW_ONE_PAGE)
}
}
}
Loading…
Cancel
Save