TextureView
是一个继承自 View
的类,其主要优势在于能够直接在硬件加速层进行渲染。它允许应用将内容绘制到一个 SurfaceTexture
,并能够将这个 SurfaceTexture
的内容呈现在其视图层级中。与 SurfaceView
不同,TextureView
支持复杂的视图层次并且可以与其他视图时序混用。这意味着,TextureView
能真正像普通的 View
一样参与到视图的动画和变换中。
下面是 TextureView
的基本使用示例,包括如何使用 SurfaceTextureListener
接口来管理其生命周期事件。
import android.graphics.SurfaceTexture
import android.media.MediaPlayer
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.view.TextureView
import android.view.TextureView.SurfaceTextureListener
class MainActivity : AppCompatActivity() {
private lateinit var textureView: TextureView
private var mediaPlayer: MediaPlayer? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textureView = findViewById(R.id.textureView)
textureView.surfaceTextureListener = object : SurfaceTextureListener {
override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
initializeMediaPlayer(surface)
}
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {
// Handle size change if needed
}
override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean {
mediaPlayer?.release()
return true
}
override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {
// Update as needed
}
}
}
private fun initializeMediaPlayer(surface: SurfaceTexture) {
mediaPlayer = MediaPlayer().apply {
setDataSource("path/to/your/video/file") // Replace with actual video path
setSurface(android.view.Surface(surface))
prepare()
start()
}
}
}
在上述示例中,我们在 Activity
中初始化了一个 TextureView
,并通过 SurfaceTextureListener
管理其生命周期。当 SurfaceTexture
可用时,我们初始化并启动了一个 MediaPlayer
,将其内容渲染到 TextureView
上。
onSurfaceTextureDestroyed
方法中应正确释放相关资源,以避免内存泄露。TextureView
功能强大,但由于其工作于 View 层次中,在复杂操作下可能导致性能瓶颈。TextureView
的内容分辨率及其与设备屏幕的适配需特别注意,特别是在播放高清视频时。TextureView
还支持 Canvas
绘制,可以用于实现自定义绘制的效果。例如:
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.TextureView
class CustomTextureView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : TextureView(context, attrs, defStyleAttr), TextureView.SurfaceTextureListener {
private val paint = Paint().apply {
color = Color.RED
style = Paint.Style.FILL
}
init {
surfaceTextureListener = this
}
override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
// Custom drawing can start here
val canvas = lockCanvas()
drawCustomContent(canvas)
unlockCanvasAndPost(canvas)
}
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {}
override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean {
return true
}
override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {}
private fun drawCustomContent(canvas: Canvas?) {
canvas?.drawCircle(width / 2f, height / 2f, 100f, paint)
}
}
这个自定义的 TextureView
在可用时会绘制一个红色的圆形,可以进一步使用 Canvas
在 TextureView
的内容上进行更多自定义绘制。
总的来说,TextureView
提供了一个功能强大且灵活的方式来处理复杂的图形和视频渲染任务,适合在需要与其他视图紧密集成的多种场景下使用。通过合理管理它的生命周期和资源,能够实现高效、流畅的用户体验。