Android音频开发之SurfaceView的使用详解
作者:JulyYu 发布时间:2023-01-15 13:56:43
SurfaceView
SurfaceView
从源码上看继承自View
,但在内部实现上SurfaceView
和其他View
有很多区别。 SurfaceView
主要作用是提供一个直接绘图表面嵌入到视图结构中,实际上真正做绘制能力的是Surface
。因此SurfaceView
和宿主窗口是分离的。正常情况下窗口的View
共享同一个Window
,而Window
也对应一个Surface
,所有View
也就共享同一个Surface
。所以SurfaceView
具备独立的Surface
,相当于和宿主窗口绘制是分离互不干扰。
不同点
不同点 | SurfaceView | View |
---|---|---|
绘制 | 结构在View当中,但绘制表面是独立的。内部拥有自己的Canvas进行绘制操作 | 和宿主窗口共享同一个绘图表面 |
刷新 | 窗口刷新不需要重绘宿主窗口 | 任何一个子元素或是局部刷新都会使得整个视图结构发生重绘 |
线程 | 线程独立,不影响主线程 使用界面频繁刷新 | 在UI主线程使用 |
操作 | 低版本不支持平移、缩放、旋转等动画 不具备View属性控制 | 均可正常操作 |
刷新 | 可控制刷新频率、双缓存机制 | 只在主线程刷新更新 |
双缓冲机制
SurfaceView
将视频流解析成一帧帧图像数据显示。例如一帧图像显示后,等待下一帧图像可能存在还未及时解析的情况,这种情况下就会导致画面不流畅。利用双缓冲可以避免这种情况,可以理解双缓冲是两个线程轮流解析视频流图像数据两者交替进行解析和渲染操作从而保证视频流能够流畅播放。
SurfaceHolder
SurfaceView
双缓冲机制事实上是比较消耗系统内存。因此当SurfaceView
在不可见状态下就会去销毁SurfaceHolder
来减轻内存开销。因此就有了SurfaceHolder
的addCallback
方法来监听SurfaceHolder
状态。
void surfaceCreated(@NonNull SurfaceHolder holder); 创建回调
void surfaceChanged(@NonNull SurfaceHolder holder, @PixelFormat.Format int format, @IntRange(from = 0) int width, @IntRange(from = 0) int height); 修改回调
void surfaceDestroyed(@NonNull SurfaceHolder holder); 销毁回调
使用
自定义继承SurfaceView
可以自定义绘制内容。当创建SurfaceHolder
成功后再surfaceCreated
回调中调用lockCanvas
获取到SurfaceHolder
的画布并锁定,然后绘制内容。绘制结束后调用unlockCanvasAndPost
释放并提交画布改动信息,让新数据在画布上进行展示。
public class SurfaceViewTest extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mSurfaceHolder;
private Canvas mCanvas;
private Paint paint;
public SurfaceViewTest(Context context) {
this(context,null,0);
}
public SurfaceViewTest(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public SurfaceViewTest(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mSurfaceHolder = getHolder(); // 初始化
mSurfaceHolder.addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 创建成功后就能通过线程绘制自定义内容
new Thread(new Runnable() {
@Override
public void run() {
draw();
}
}).start();
}
private void draw() {
try {
mCanvas = mSurfaceHolder.lockCanvas();
mCanvas.drawCircle(500,500,300,paint);
mCanvas.drawCircle(100,100,20,paint);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (mCanvas != null)
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
}
来源:https://juejin.cn/post/7086047678727585822
猜你喜欢
- 一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的if else等判断逻辑,特别是在不同方法
- Java IDE工具提供了多种用户独特需求和个人偏好来创建编程环境的方法。Java框架能够简化程序员的工作。这些框架被设计和开发用于在任何服
- AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合。其实AsyncTask并不是那么好,甚至有些糟糕。本文
- 效果展示前面的导入过程这里就不多说了,不会的可以自己去问度娘。导入后,选择Spider.java类直接运行就可以了,下面是游戏运行的截图:游
- 本文实例讲述了Android游戏开发学习之引擎用法。分享给大家供大家参考。具体如下:汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们
- 本文实例讲述了C#生成随机数功能。分享给大家供大家参考,具体如下:using System;using System.Collections
- 1.编写核心类MainApp:package com.yiidian.gson;import com.google.gson.Gson;im
- 第一次接触到随机数还是在c语言里面 使用的是 rand(); 但是重新执行一次的时候会发现,诶,居然和上一次执行的结果是一样的,因为没有初始
- 在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法。开发环境:IntelliJ ID
- 一、ThreadLocal简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般
- 本文实例讲述了C#实现左截取和右截取字符串的方法,分享给大家供大家参考。具体方法分析如下:问题如下:使用C#语法编写程序时,我们需要截取一个
- 1.官网下载JDK:1.1下载地址:https://www.oracle.com/java/technologies/javase-down
- 知识准备需要了解POI工具,以及POI对Excel中的对象的封装对应关系。什么是POIApache POI 是用Java编写的免费开源的跨平
- 在网上虽然看到了方法,但是处理感觉很复杂,我的办法,老实说,是突然试一下试到的,哈哈QWQOK,开始说明如何整的。效果如上图所示代码如下pa
- 1.简介建议阅读本文最好对Dokcer有一些了解首先我们先了解一下Docker是什么Docker 属于 Linux 容器的一种封装,提供简单
- 一、项目简述功能包括: 登录注册,办理借阅。借阅记录,预约借阅,借出未还, 借阅逾期,学生管理,图书管理,书库分类查询搜索。二、项目运行环境
- DataGridView是Visual Studio中一个最重要的数据控件。它可以应用在大多数场合,功能强大,使用灵活。本文要重点介绍一下,
- 本章,会对synchronized关键字进行介绍。涉及到的内容包括:1. synchronized原理2. synchronized基本规则
- 前言大家对AOP应该都不陌生, 就算没有用过也肯定听说过,切面编程一直是一个热点的话题,AOP即Aspect Oriented Progra
- 目录前言实现思路其它总结前言本文将介绍如何通过使用EasyExcel自定义 * 实现在最终的Excel文件中新增一列自增的序号列,最终的效果