This commit is contained in:
Horis 2024-02-15 16:24:49 +08:00
parent dff21fe415
commit 61049ddffa
3 changed files with 22 additions and 19 deletions

View File

@ -172,11 +172,23 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
private fun preRenderPage() {
val view = this
var invalidate = false
pageFactory.run {
prevPage.preRender(view)
curPage.preRender(view)
nextPage.preRender(view)
nextPlusPage.preRender(view)
hasPrev() && prevPage.preRender(view)
if (curPage.preRender(view)) {
invalidate = true
}
if (hasNext() && nextPage.preRender(view) && callBack.isScroll) {
invalidate = true
}
if (hasNextPlus() && nextPlusPage.preRender(view) && callBack.isScroll
&& relativeOffset(2) < ChapterProvider.visibleHeight
) {
invalidate = true
}
if (invalidate) {
postInvalidate()
}
}
}

View File

@ -264,7 +264,7 @@ data class TextPage(
}
fun draw(view: ContentTextView, canvas: Canvas?) {
pictureMirror.drawLocked(canvas, view.width, height.toInt(), view) {
pictureMirror.drawLocked(canvas, view.width, height.toInt()) {
drawPage(view, this)
}
}
@ -278,9 +278,10 @@ data class TextPage(
}
}
fun preRender(view: ContentTextView) {
if (!pictureMirror.isDirty) return
fun preRender(view: ContentTextView): Boolean {
if (!pictureMirror.isDirty) return false
draw(view, null)
return true
}
fun isDirty(): Boolean {

View File

@ -3,41 +3,31 @@ package io.legado.app.utils
import android.graphics.Canvas
import android.graphics.Picture
import android.os.Build
import android.view.View
import androidx.core.graphics.record
import java.util.concurrent.locks.ReentrantLock
class PictureMirror {
var picture: Picture? = null
@Volatile
var isDirty = true
val lock = ReentrantLock()
@Volatile
var scheduleInvalidateView: View? = null
inline fun drawLocked(
canvas: Canvas?,
width: Int,
height: Int,
view: View? = null,
block: Canvas.() -> Unit
) {
if (atLeastApi23) {
if (picture == null) picture = Picture()
val picture = picture!!
if (isDirty) {
if (!lock.tryLock()) {
if (canvas != null && view != null) {
scheduleInvalidateView = view
}
return
}
if (!lock.tryLock()) return
try {
picture.record(width, height, block)
isDirty = false
scheduleInvalidateView?.postInvalidate()
scheduleInvalidateView = null
} finally {
lock.unlock()
}