Skip to content

Commit

Permalink
优化
Browse files Browse the repository at this point in the history
  • Loading branch information
821938089 committed Feb 15, 2024
1 parent dff21fe commit 61049dd
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand All @@ -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 {
Expand Down
14 changes: 2 additions & 12 deletions app/src/main/java/io/legado/app/utils/PictureMirror.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Expand Down

0 comments on commit 61049dd

Please sign in to comment.