优化
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user