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
@@ -172,11 +172,23 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
private fun preRenderPage() { private fun preRenderPage() {
val view = this val view = this
var invalidate = false
pageFactory.run { pageFactory.run {
prevPage.preRender(view) hasPrev() && prevPage.preRender(view)
curPage.preRender(view) if (curPage.preRender(view)) {
nextPage.preRender(view) invalidate = true
nextPlusPage.preRender(view) }
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()
}
} }
} }
@@ -264,7 +264,7 @@ data class TextPage(
} }
fun draw(view: ContentTextView, canvas: Canvas?) { fun draw(view: ContentTextView, canvas: Canvas?) {
pictureMirror.drawLocked(canvas, view.width, height.toInt(), view) { pictureMirror.drawLocked(canvas, view.width, height.toInt()) {
drawPage(view, this) drawPage(view, this)
} }
} }
@@ -278,9 +278,10 @@ data class TextPage(
} }
} }
fun preRender(view: ContentTextView) { fun preRender(view: ContentTextView): Boolean {
if (!pictureMirror.isDirty) return if (!pictureMirror.isDirty) return false
draw(view, null) draw(view, null)
return true
} }
fun isDirty(): Boolean { fun isDirty(): Boolean {
@@ -3,41 +3,31 @@ package io.legado.app.utils
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Picture import android.graphics.Picture
import android.os.Build import android.os.Build
import android.view.View
import androidx.core.graphics.record import androidx.core.graphics.record
import java.util.concurrent.locks.ReentrantLock import java.util.concurrent.locks.ReentrantLock
class PictureMirror { class PictureMirror {
var picture: Picture? = null var picture: Picture? = null
@Volatile @Volatile
var isDirty = true var isDirty = true
val lock = ReentrantLock() val lock = ReentrantLock()
@Volatile
var scheduleInvalidateView: View? = null
inline fun drawLocked( inline fun drawLocked(
canvas: Canvas?, canvas: Canvas?,
width: Int, width: Int,
height: Int, height: Int,
view: View? = null,
block: Canvas.() -> Unit block: Canvas.() -> Unit
) { ) {
if (atLeastApi23) { if (atLeastApi23) {
if (picture == null) picture = Picture() if (picture == null) picture = Picture()
val picture = picture!! val picture = picture!!
if (isDirty) { if (isDirty) {
if (!lock.tryLock()) { if (!lock.tryLock()) return
if (canvas != null && view != null) {
scheduleInvalidateView = view
}
return
}
try { try {
picture.record(width, height, block) picture.record(width, height, block)
isDirty = false isDirty = false
scheduleInvalidateView?.postInvalidate()
scheduleInvalidateView = null
} finally { } finally {
lock.unlock() lock.unlock()
} }