关于视频的控件SurfaceView及相关
来源:互联网 发布:淘宝里金小姐正品代购 编辑:程序博客网 时间:2024/05/21 19:37
Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback开发实例
原文:Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screen compositor)管理的。
Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原生缓冲器以及其它方面的内容。
通过SurfaceHolder这个接口去访问Surface,而执行getHolder()方法可以得到SurfaceHolder接口。当SurfaceView的窗口可见时,Surface就会被创建,当SurfaceView窗口隐藏时,Surface就会被销毁。
SurfaceView提供了一个运行在渲染线程的surface,若要更新屏幕,需要了解以下线程知识。
所有SurfaceView 和 SurfaceHolder.Callback的方法都应该在主线程(UI线程)里面调用,应该要确保渲染进程所访问变量的同步性。
必须确保只有当Surface有效的时候,(也就是当Surface的生命周期在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间)才能让渲染进程访问。
SurfaceView与Surface的联系就是,Surface是管理显示内容的数据(implementsParcelable),包括存储于数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。
SurfaceHolder是控制surface的一个抽象接口,你可以通过SurfaceHolder来控制surface的尺寸和格式,或者修改surface的像素,监视surface的变化等等,SurfaceHolder是SurfaceView的典型接口。
与直接控制SurfaceView来修改surface不同,使用SurfaceHolder来修改surface时,需要注意lockCanvas() 和Callback.surfaceCreated().这两个方法。
SurfaceHolder控制surface的流程所使用的几个方法。
3.1、abstract void addCallback(SurfaceHolder.Callback callback)
Add a Callback interface for this holder.// 给SurfaceHolder一个回调对象。
3.2、abstract Canvas lockCanvas(Rect dirty)
Just like lockCanvas() but allows specification of a dirty rectangle.
// 锁定画布中的某一个区域,返回的画布对象Canvas(当更新的内容只有一个区域时,同时要追求高效,可以只更
新一部分的区域,而不必更新全部画布区域)
3.3、abstract Canvas lockCanvas()
Start editing the pixels in the surface.// 锁定画布,返回的画布对象Canvas
3.4、abstract void removeCallback(SurfaceHolder.Callback callback)
Removes a previously added Callback interface from this holder.//移除回调对象
3.5、abstract void unlockCanvasAndPost(Canvas canvas)
Finish editing pixels in the surface.// 结束锁定画图,并提交改变
SurfaceHolder.Callback是监听surface改变的一个接口
public abstract voidsurfaceChanged(SurfaceHolder holder, int format, int width, int height)
holder The SurfaceHolder whose surface has changed.
format The new PixelFormat of the surface.
width The new width of the surface.
height The new height of the surfa //surface发生改变时被调用
2. public abstract voidsurfaceCreated(SurfaceHolder holder)
Parameters holder The SurfaceHolder whose surface is being created
//在surface创建时被调用,一般在这个方法里面开启渲染屏幕的线程。
3. public abstract voidsurfaceDestroyed(SurfaceHolder holder)
Parameters holder The SurfaceHolder whose surface is being destroyed.
//销毁时被调用,一般在这个方法里将渲染的线程停止。
Demo:
原文:Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screen compositor)管理的。
Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原生缓冲器以及其它方面的内容。
通过SurfaceHolder这个接口去访问Surface,而执行getHolder()方法可以得到SurfaceHolder接口。当SurfaceView的窗口可见时,Surface就会被创建,当SurfaceView窗口隐藏时,Surface就会被销毁。
SurfaceView提供了一个运行在渲染线程的surface,若要更新屏幕,需要了解以下线程知识。
所有SurfaceView 和 SurfaceHolder.Callback的方法都应该在主线程(UI线程)里面调用,应该要确保渲染进程所访问变量的同步性。
必须确保只有当Surface有效的时候,(也就是当Surface的生命周期在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间)才能让渲染进程访问。
SurfaceView与Surface的联系就是,Surface是管理显示内容的数据(implementsParcelable),包括存储于数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。
SurfaceHolder是控制surface的一个抽象接口,你可以通过SurfaceHolder来控制surface的尺寸和格式,或者修改surface的像素,监视surface的变化等等,SurfaceHolder是SurfaceView的典型接口。
与直接控制SurfaceView来修改surface不同,使用SurfaceHolder来修改surface时,需要注意lockCanvas() 和Callback.surfaceCreated().这两个方法。
SurfaceHolder控制surface的流程所使用的几个方法。
3.1、abstract void addCallback(SurfaceHolder.Callback callback)
Add a Callback interface for this holder.// 给SurfaceHolder一个回调对象。
3.2、abstract Canvas lockCanvas(Rect dirty)
Just like lockCanvas() but allows specification of a dirty rectangle.
// 锁定画布中的某一个区域,返回的画布对象Canvas(当更新的内容只有一个区域时,同时要追求高效,可以只更
新一部分的区域,而不必更新全部画布区域)
3.3、abstract Canvas lockCanvas()
Start editing the pixels in the surface.// 锁定画布,返回的画布对象Canvas
3.4、abstract void removeCallback(SurfaceHolder.Callback callback)
Removes a previously added Callback interface from this holder.//移除回调对象
3.5、abstract void unlockCanvasAndPost(Canvas canvas)
Finish editing pixels in the surface.// 结束锁定画图,并提交改变
SurfaceHolder.Callback是监听surface改变的一个接口
public abstract voidsurfaceChanged(SurfaceHolder holder, int format, int width, int height)
holder The SurfaceHolder whose surface has changed.
format The new PixelFormat of the surface.
width The new width of the surface.
height The new height of the surfa //surface发生改变时被调用
2. public abstract voidsurfaceCreated(SurfaceHolder holder)
Parameters holder The SurfaceHolder whose surface is being created
//在surface创建时被调用,一般在这个方法里面开启渲染屏幕的线程。
3. public abstract voidsurfaceDestroyed(SurfaceHolder holder)
Parameters holder The SurfaceHolder whose surface is being destroyed.
//销毁时被调用,一般在这个方法里将渲染的线程停止。
Demo:
<span style="font-size:24px;">public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } class MyView extends SurfaceView implements SurfaceHolder.Callback, Runnable { SurfaceHolder holder = null; Paint paint; public MyView(Context context) { super(context); holder = getHolder(); holder.addCallback(this); paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 创建画笔 paint.setColor(Color.RED); // 设置画笔颜色 this.setFocusable(true); } @Override public void surfaceCreated(SurfaceHolder holder) { Thread t = new Thread(this); t.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { isRunning = false; } @Override protected void onDraw(Canvas canvas) { canvas = holder.lockCanvas(); canvas.drawColor(Color.BLACK); canvas.drawCircle(x, y, 10, paint); holder.unlockCanvasAndPost(canvas); } private void paint(Paint paint) { Canvas canvas = holder.lockCanvas(); // 锁定画布,得到Canvas对象 canvas.drawColor(Color.WHITE); // 设定Canvas对象的背景颜色 canvas.drawCircle(x, y, 10, paint); // 在画布上画圆 holder.unlockCanvasAndPost(canvas); // 解除锁定,并提交修改内容,更新屏幕 } boolean isRunning = true; @Override public void run() { while (isRunning) { // onDraw(null); paint(paint); move(); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } private int x, y; private void move() { x += 2; y += 2; } }}</span>
0 0
- 关于视频的控件SurfaceView及相关
- 视频画面帧的展示控件SurfaceView及TextureView对比
- 视频画面帧的展示控件SurfaceView及TextureView对比
- SurfaceView播放视频控件的使用
- 关于surfaceView视频的拉伸问题
- 使用视频控件SurfaceView注意事项
- 关于SurfaceView控件设置透明
- 视频播放控件SurfaceView与VideoView
- 简单的视频播放surfaceView
- SurfaceView播放视频的截图
- 关于SurfaceView的问题
- 关于SurfaceView的问题
- 关于surfaceview的理解
- 关于SurfaceView的使用
- 关于surfaceview的使用
- SurfaceView相关概念的整理
- 关于视频相关协议的分析
- Android SurfaceView相关概念及原理
- 【2016-CCPC-B】强连通分量,tarjan(Bomb,hdu 5934)
- 编写函数void change(char *a,char *b,char*c)。 函数功能是首先把b指向的字符串逆向存放,然后将a指向的字符串和b指向的字符串按排列顺序交叉合并到c指向的数组中,两个字
- 高效使用Vim编辑器--Vim编辑器常用命令学习笔记
- 【caffe学习】学习初探
- Android学习之路:android开发工具包分享
- 关于视频的控件SurfaceView及相关
- Android环境搭建
- 将整数转换为相应的一个字符数组。 分析:从个位提取数字,组合字符 符号位的处理 12345=>"12345"
- hdu5945Fxx and game
- 观察者模式浅谈
- 对一个二维数组中的数据排序,方法如下: 将整个数组中值最小的元素所在行调整为数组第一行, 将除第一行外的行中最小元素所在行调整为第2行, 将除第1,2行外的行中最小值元素所在行调整为第3行,以此类推
- Java--异常处理进阶
- java中级_apache_提供的JDBC的DQL使用
- ELFhash - 优秀的字符串哈希算法