This commit is contained in:
Horis
2024-02-13 12:27:57 +08:00
parent 14e9bd557d
commit 300e78970c
7 changed files with 25 additions and 22 deletions
@@ -76,7 +76,6 @@ import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.TIP_DIVIDER_C
import io.legado.app.ui.book.read.page.ContentTextView import io.legado.app.ui.book.read.page.ContentTextView
import io.legado.app.ui.book.read.page.ReadView import io.legado.app.ui.book.read.page.ReadView
import io.legado.app.ui.book.read.page.entities.PageDirection import io.legado.app.ui.book.read.page.entities.PageDirection
import io.legado.app.ui.book.read.page.provider.TextPageFactory
import io.legado.app.ui.book.searchContent.SearchContentActivity import io.legado.app.ui.book.searchContent.SearchContentActivity
import io.legado.app.ui.book.searchContent.SearchResult import io.legado.app.ui.book.searchContent.SearchResult
import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity
@@ -212,7 +211,8 @@ class ReadBookActivity : BaseReadBookActivity(),
private val timeBatteryReceiver = TimeBatteryReceiver() private val timeBatteryReceiver = TimeBatteryReceiver()
private var screenTimeOut: Long = 0 private var screenTimeOut: Long = 0
private var loadStates: Boolean = false private var loadStates: Boolean = false
override val pageFactory: TextPageFactory get() = binding.readView.pageFactory override val pageFactory get() = binding.readView.pageFactory
override val pageDelegate get() = binding.readView.pageDelegate
override val headerHeight: Int get() = binding.readView.curPage.headerHeight override val headerHeight: Int get() = binding.readView.curPage.headerHeight
private val menuLayoutIsVisible get() = bottomDialog > 0 || binding.readMenu.isVisible private val menuLayoutIsVisible get() = bottomDialog > 0 || binding.readMenu.isVisible
private val nextPageDebounce by lazy { Debounce { keyPage(PageDirection.NEXT) } } private val nextPageDebounce by lazy { Debounce { keyPage(PageDirection.NEXT) } }
@@ -3,7 +3,6 @@ package io.legado.app.ui.book.read.page
import android.content.Context import android.content.Context
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Paint import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet import android.util.AttributeSet
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
@@ -14,6 +13,7 @@ import io.legado.app.constant.PreferKey
import io.legado.app.data.entities.Bookmark import io.legado.app.data.entities.Bookmark
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.ui.book.read.page.delegate.PageDelegate
import io.legado.app.ui.book.read.page.entities.TextLine import io.legado.app.ui.book.read.page.entities.TextLine
import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.entities.TextPage
import io.legado.app.ui.book.read.page.entities.TextPos import io.legado.app.ui.book.read.page.entities.TextPos
@@ -45,7 +45,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
} }
} }
private var callBack: CallBack private var callBack: CallBack
private val visibleRect = RectF() private val visibleRect = ChapterProvider.visibleRect
val selectStart = TextPos(0, 0, 0) val selectStart = TextPos(0, 0, 0)
private val selectEnd = TextPos(0, 0, 0) private val selectEnd = TextPos(0, 0, 0)
var textPage: TextPage = TextPage() var textPage: TextPage = TextPage()
@@ -56,7 +56,8 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
var reverseEndCursor = false var reverseEndCursor = false
//滚动参数 //滚动参数
private val pageFactory: TextPageFactory get() = callBack.pageFactory private val pageFactory get() = callBack.pageFactory
private val pageDelegate get() = callBack.pageDelegate
private var pageOffset = 0 private var pageOffset = 0
private val pictureMirror = PictureMirror() private val pictureMirror = PictureMirror()
private val isNoAnim get() = ReadBook.pageAnim() == PageAnim.noAnim private val isNoAnim get() = ReadBook.pageAnim() == PageAnim.noAnim
@@ -81,23 +82,10 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
invalidate() invalidate()
} }
/**
* 更新绘制区域
*/
fun upVisibleRect() {
visibleRect.set(
ChapterProvider.paddingLeft.toFloat(),
ChapterProvider.paddingTop.toFloat(),
ChapterProvider.visibleRight.toFloat(),
ChapterProvider.visibleBottom.toFloat()
)
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh) super.onSizeChanged(w, h, oldw, oldh)
if (!isMainView) return if (!isMainView) return
ChapterProvider.upViewSize(w, h) ChapterProvider.upViewSize(w, h)
upVisibleRect()
textPage.format() textPage.format()
} }
@@ -159,17 +147,20 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
} }
if (!pageFactory.hasPrev() && pageOffset > 0) { if (!pageFactory.hasPrev() && pageOffset > 0) {
pageOffset = 0 pageOffset = 0
pageDelegate?.abortAnim()
} else if (!pageFactory.hasNext() } else if (!pageFactory.hasNext()
&& pageOffset < 0 && pageOffset < 0
&& pageOffset + textPage.height < ChapterProvider.visibleHeight && pageOffset + textPage.height < ChapterProvider.visibleHeight
) { ) {
val offset = (ChapterProvider.visibleHeight - textPage.height).toInt() val offset = (ChapterProvider.visibleHeight - textPage.height).toInt()
pageOffset = min(0, offset) pageOffset = min(0, offset)
pageDelegate?.abortAnim()
} else if (pageOffset > 0) { } else if (pageOffset > 0) {
if (pageFactory.moveToPrev(true)) { if (pageFactory.moveToPrev(true)) {
pageOffset -= textPage.height.toInt() pageOffset -= textPage.height.toInt()
} else { } else {
pageOffset = 0 pageOffset = 0
pageDelegate?.abortAnim()
} }
} else if (pageOffset < -textPage.height) { } else if (pageOffset < -textPage.height) {
val height = textPage.height val height = textPage.height
@@ -177,6 +168,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
pageOffset += height.toInt() pageOffset += height.toInt()
} else { } else {
pageOffset = -height.toInt() pageOffset = -height.toInt()
pageDelegate?.abortAnim()
} }
} }
invalidate() invalidate()
@@ -699,6 +691,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
interface CallBack { interface CallBack {
val headerHeight: Int val headerHeight: Int
val pageFactory: TextPageFactory val pageFactory: TextPageFactory
val pageDelegate: PageDelegate?
val isScroll: Boolean val isScroll: Boolean
var isSelectingSearchResult: Boolean var isSelectingSearchResult: Boolean
fun upSelectedStart(x: Float, y: Float, top: Float) fun upSelectedStart(x: Float, y: Float, top: Float)
@@ -101,7 +101,6 @@ class PageView(context: Context) : FrameLayout(context) {
vwTopDivider.gone(llHeader.isGone || !it.showHeaderLine) vwTopDivider.gone(llHeader.isGone || !it.showHeaderLine)
vwBottomDivider.gone(llFooter.isGone || !it.showFooterLine) vwBottomDivider.gone(llFooter.isGone || !it.showFooterLine)
} }
contentTextView.upVisibleRect()
upTime() upTime()
upBattery(battery) upBattery(battery)
} }
@@ -168,7 +168,7 @@ class ReadView(context: Context, attrs: AttributeSet) :
} }
override fun computeScroll() { override fun computeScroll() {
pageDelegate?.scroll() pageDelegate?.computeScroll()
} }
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
@@ -96,7 +96,7 @@ abstract class PageDelegate(protected val readView: ReadView) {
viewHeight = height viewHeight = height
} }
fun scroll() { fun computeScroll() {
if (scroller.computeScrollOffset()) { if (scroller.computeScrollOffset()) {
readView.setTouchPoint(scroller.currX.toFloat(), scroller.currY.toFloat()) readView.setTouchPoint(scroller.currX.toFloat(), scroller.currY.toFloat())
} else if (isStarted) { } else if (isStarted) {
@@ -9,7 +9,6 @@ import io.legado.app.model.ReadBook
import io.legado.app.ui.book.read.page.ReadView import io.legado.app.ui.book.read.page.ReadView
import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.book.read.page.provider.ChapterProvider
@Suppress("UnnecessaryVariable")
class ScrollPageDelegate(readView: ReadView) : PageDelegate(readView) { class ScrollPageDelegate(readView: ReadView) : PageDelegate(readView) {
// 滑动追踪的时间 // 滑动追踪的时间
@@ -1,6 +1,7 @@
package io.legado.app.ui.book.read.page.provider package io.legado.app.ui.book.read.page.provider
import android.graphics.Paint.FontMetrics import android.graphics.Paint.FontMetrics
import android.graphics.RectF
import android.graphics.Typeface import android.graphics.Typeface
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
@@ -133,6 +134,9 @@ object ChapterProvider {
var doublePage = false var doublePage = false
private set private set
@JvmStatic
var visibleRect = RectF()
private val titleMeasureHelper = TextMeasure(titlePaint) private val titleMeasureHelper = TextMeasure(titlePaint)
private val contentMeasureHelper = TextMeasure(contentPaint) private val contentMeasureHelper = TextMeasure(contentPaint)
@@ -911,6 +915,14 @@ object ChapterProvider {
visibleRight = viewWidth - paddingRight visibleRight = viewWidth - paddingRight
visibleBottom = paddingTop + visibleHeight visibleBottom = paddingTop + visibleHeight
} }
visibleRect.set(
paddingLeft.toFloat(),
paddingTop.toFloat(),
visibleRight.toFloat(),
visibleBottom.toFloat()
)
} }
} }