TextureView
是 Android API 级别 14(ICS)及以上版本引入的一个视图组件,它允许应用程序以一种更加高效的方式显示 OpenGL ES 渲染的内容。与 SurfaceView
类似,TextureView
提供了一个直接与 GPU 交云的绘制表面,但它使用 SurfaceTexture
作为后端,这使得它能够支持硬件加速的 2D 图形变换,如旋转和缩放。
TextureView 的工作原理:
-
创建 TextureView:在布局文件中定义
TextureView
或在代码中动态创建。 -
绑定 SurfaceTexture:
TextureView
内部创建了一个SurfaceTexture
对象,用于接收 OpenGL ES 渲染器的输出。 -
设置 SurfaceTextureListener:监听
SurfaceTexture
的状态,如可用性和大小改变。 -
OpenGL ES 渲染:使用 OpenGL ES 进行渲染,并将
SurfaceTexture
设置为目标。 -
更新和渲染:在应用程序的渲染循环中,更新
TextureView
的内容。 -
显示:
TextureView
将渲染的内容显示在屏幕上。
使用 TextureView 的步骤:
1. 在布局文件中添加 TextureView
<!-- res/layout/activity_main.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
2. 在 Activity 中使用 TextureView
public class MainActivity extends AppCompatActivity {
private TextureView textureView;
private GLSurfaceView.Renderer renderer; // 假设使用 GLSurfaceView 作为渲染器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textureView = findViewById(R.id.texture_view);
// 设置 TextureView 的 SurfaceTextureListener
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
// TextureView 准备好了,可以开始渲染
renderer.onSurfaceCreated(); // 通知渲染器,渲染表面已准备好
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
// TextureView 被销毁,停止渲染
return true; // 返回 true 表示纹理不再需要
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
// TextureView 大小改变
renderer.onSurfaceChanged(width, height); // 通知渲染器,渲染大小已改变
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
// TextureView 内容更新
}
});
}
}
3. 使用 OpenGL ES 进行渲染
在 GLSurfaceView.Renderer
的实现中,你将编写 OpenGL ES 渲染代码:
public class MyRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 初始化 OpenGL ES 环境
}
@Override
public void onSurfaceChanged(int width, int height) {
// 调整视图大小或视口
}
@Override
public void onDrawFrame(GL10 gl) {
// 绘制帧
}
}
4. 将 TextureView 与 OpenGL ES 渲染器关联
// 在 Activity 中设置渲染器
textureView.setRenderer(new MyRenderer());
注意事项:
-
硬件加速:
TextureView
支持硬件加速的图形变换,这使得它比SurfaceView
更适合用于需要这些变换的场景。 -
兼容性:
TextureView
从 Android API 级别 14(ICS)开始引入,确保你的应用目标兼容的最低版本支持TextureView
。 -
性能:由于
TextureView
使用SurfaceTexture
,它可能比SurfaceView
提供更好的性能,特别是在需要频繁更新屏幕内容的场景。 -
资源管理:确保在
Activity
结束或TextureView
不再需要时,释放相关资源,如结束 OpenGL ES 上下文。
通过上述步骤,你可以在 Android 应用中使用 TextureView
来显示 OpenGL ES 渲染的内容,实现高效的图形渲染和变换。