心里种花,人生才不会荒芜,如果你也想一起成长,请点个关注吧。
SurfaceView 是一个非常强大但也相对复杂的 UI 组件,特别适用于对性能要求较高的绘制任务,如视频播放、游戏等。
SurfaceView 是一种特殊的 View,它提供了一个独立的绘制表面。与普通的 View 不同,它把绘制内容和图层的生成放在一个独立的 Surface 上。SurfaceView 的主要特点是:
Surface 是一个图形接口,用于在不同的线程间传递图形缓冲区。Surface 类常与 SurfaceView、SurfaceHolder 以及 SurfaceTexture 一起使用。
SurfaceView 在布局上存在于 View 树中,但其内容实际上是在独立的 Surface 上进行绘制的。这使得它与普通的 View 有很大的不同:
下面是一个简单的使用 SurfaceView 绘制一个移动矩形的例子,使用 Kotlin 代码展示:
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.SurfaceHolder
import android.view.SurfaceView
class CustomSurfaceView(context: Context, attrs: AttributeSet? = null) : SurfaceView(context, attrs), SurfaceHolder.Callback {
private var drawingThread: Thread? = null
private var isRunning = false
private val paint = Paint().apply {
color = Color.RED
style = Paint.Style.FILL
}
private var positionX = 0
private val speedX = 5
init {
holder.addCallback(this)
}
override fun surfaceCreated(holder: SurfaceHolder) {
isRunning = true
drawingThread = Thread {
while (isRunning) {
val canvas: Canvas? = holder.lockCanvas()
if (canvas != null) {
synchronized(holder) {
drawSomething(canvas)
}
holder.unlockCanvasAndPost(canvas)
}
}
}
drawingThread?.start()
}
private fun drawSomething(canvas: Canvas) {
canvas.drawColor(Color.WHITE)
canvas.drawRect(positionX.toFloat(), 100f, (positionX + 100).toFloat(), 200f, paint)
positionX += speedX
if (positionX > width) positionX = 0
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
// Handle surface changes if needed
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
isRunning = false
drawingThread?.join()
}
}
在这个示例中,我们创建了一个 CustomSurfaceView,它继承了 SurfaceView 并实现了 SurfaceHolder.Callback 接口。在 surfaceCreated() 方法中启动了一个线程,该线程在独立的表面上绘制一个移动的矩形。
使用 SurfaceView 时需要注意几个问题:
SurfaceView 是一个非常适用于高性能绘制任务的组件,通过理解其原理、Surface 类的作用以及与 View 树的关系,可以更好地在实际项目中加以应用。在使用过程中注意线程安全、生命周期管理以及性能优化,以确保应用的稳定性和流畅性。
END
点赞转发,让精彩不停歇!关注我们,评论区见,一起期待下期的深度好文!