📜  Android-TextureView(1)

📅  最后修改于: 2023-12-03 14:59:16.829000             🧑  作者: Mango

Android-TextureView

Android-TextureView 是 Android 提供的一个 View,主要用于显示视频、Camera 预览等实时数据,相较于普通的 View,其有以下优势:

  1. 可以与 SurfaceTexture 进行交互,平滑而快速地展示视频,避免了不必要的拷贝操作和内存分配;
  2. 支持硬件加速,占用更少的 CPU 和内存资源;
  3. 可以进行任意大小和旋转的缩放,可以根据应用需求自由调节大小和位置;
  4. 同时在绘制和视频播放时可以使用 OpenGl 进行加速,提高渲染速度。
使用方法
  1. 在布局文件中添加 TextureView,可以通过 XML 或代码实现。
<TextureView
    android:id="@+id/texture_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
TextureView textureView = new TextureView(this);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
relativeLayout.addView(textureView, layoutParams);
  1. 在 Activity 或 Fragment 中获取 TextureView,设置 SurfaceTextureListener 监听
private TextureView mTextureView = findViewById(R.id.texture_view);

mTextureView.setSurfaceTextureListener(new SurfaceTextureListener() {
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
        // surfaceTexture 可用,可以进行 Camera、MediaPlayer 等操作
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
        // TextureView 尺寸大小发生变化,可进行相应调整
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        // surfaceTexture 被销毁,释放相应资源
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
        // surfaceTexture 更新
    }
});
  1. 配置 MediaPlayer 进行视频播放
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(mContext, mUri);
mMediaPlayer.setSurface(mTextureView.getSurface());
mTextureView.setOpaque(false);
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
});
注意事项
  1. TextureView 必须在主线程中创建,不能在其他线程中操作;
  2. TextureView 的大小必须在界面绘制前确定,如果在界面绘制后再动态设置大小可能会出现显示问题;
  3. TextureView 的动画不支持硬件加速,因此使用属性动画时需要先关闭硬件加速,否则动画可能无效;
  4. TextureView 的显示可能会受到设备性能的影响,在低端设备上可能会存在卡顿等问题,建议合理使用;
结语

Android-TextureView 提供了强大的视屏渲染能力,使得开发者可以更加方便地实现视频播放、相机预览等实时数据展示。在开发过程中需要注意设置好 SurfaceTextureListener 监听和 MediaPlayer 等播放器的配置,遵守相关的注意事项,才能更好地发挥其性能优势。