surfaceView用法例子
SurfaceView是Android系统中一种特殊的View,主要用于在应用程序中显示实时的视频流或者进行高性能的图形绘制,如游戏场景。它的出现主要是为了解决View体系中UI更新与绘图性能之间的矛盾,因为普通的View在更新时会阻塞主线程,而SurfaceView则提供了一个独立的绘图表面,可以在后台线程中进行高效绘制。 SurfaceView的核心概念有以下几个: 1. **SurfaceHolder**: SurfaceHolder是SurfaceView的接口,用于管理Surface的创建、销毁以及回调事件。开发者可以通过它来监听Surface的状态变化,例如Surface的创建、改变和销毁等。 2. **后台线程绘制**: SurfaceView允许在单独的线程中进行绘图操作,避免了主线程(UI线程)被阻塞,提高了性能。这对于处理大量图形计算或视频播放非常有利。 3. **双缓冲机制**: SurfaceView内部实现了双缓冲技术,以减少画面闪烁。这意味着开发者可以在一个缓冲区中进行绘制,完成后将其提交到另一个缓冲区并显示,保证了绘制的平滑性。 4. **Camera与SurfaceView的结合**: SurfaceView常用于视频捕捉,因为它可以直接与Camera类配合,将捕获的视频流显示在Surface上。 5. **自定义绘图**: SurfaceView可以重写其子类的`onDraw()`方法来自定义绘图逻辑,从而实现各种复杂的动画效果或游戏场景。 下面是一个简单的SurfaceView使用例子: 创建一个继承自SurfaceView的类,并实现SurfaceHolder.Callback接口: ```java public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder; private DrawThread drawThread; public MySurfaceView(Context context) { super(context); init(); } public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { holder = getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceCreated(SurfaceHolder holder) { drawThread = new DrawThread(holder); drawThread.setRunning(true); drawThread.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} @Override public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; drawThread.setRunning(false); while (retry) { try { drawThread.join(); retry = false; } catch (InterruptedException e) { // do nothing and loop } } } // 在这里实现自定义绘图逻辑 private class DrawThread extends Thread { private SurfaceHolder surfaceHolder; private boolean running; public DrawThread(SurfaceHolder surfaceHolder) { this.surfaceHolder = surfaceHolder; } public void setRunning(boolean running) { this.running = running; } @Override public void run() { Canvas canvas; while (running) { if ((canvas = surfaceHolder.lockCanvas()) != null) { synchronized (surfaceHolder) { // 在这里执行绘图操作 // ... } surfaceHolder.unlockCanvasAndPost(canvas); } } } } } ``` 在这个例子中,我们创建了一个名为MySurfaceView的自定义SurfaceView,并在`DrawThread`中进行绘图操作。当SurfaceView的Surface创建时,启动绘图线程;Surface销毁时,停止线程。 以上就是SurfaceView的基本用法,实际应用中可能需要根据具体需求进行更复杂的定制,例如添加动画、处理触摸事件等。对于Android开发初学者来说,理解SurfaceView的工作原理和使用方式,对于提高应用的性能和用户体验具有重要意义。
- 1
- showtree2012-07-05对于我这样的新手,有点参考价值。
- chenghui10012013-01-19很 值得参考,谢谢
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- java的概要介绍与分析
- MoonBit 编译器.MoonBit - 文档 - 概览 - 标准库.MoonBit 是一个用户友好,构建快,产出质量高的编程语言
- 解决微电网调度中的两阶段鲁棒优化问题,考虑了风电出力和负荷功率的不确定性,通过迭代求解主问题和子问题,最终得到最优的调度方案,并绘制了风电出力、负荷功率、购售电功率、充放电功率和储能调度结果等相关图表
- wireshark免安装版本 WiresharkPortable64-4.4.2
- springboot-基于springboot的房屋租赁管理系统
- ssm员工工作日志管理系统-lw.zip
- 人脸疲劳图像目标检测数据【已标注,约10,000张数据,YOLO 标注格式】
- 123456789.py
- RouterHandler
- 页面居中设置的process