Android SurfaceView Double Buffer
来源:互联网 发布:mac 取色器工具 编辑:程序博客网 时间:2024/06/02 13:12
- 摘要
本文主要介绍Android SurfaceView的双缓冲机制,并给出一个测试用例来展示SurfaceView用到了两块绘图缓冲。
- 概述
SurfaceView的机制可以简单的用下图来表示:
首先,SurfaceView内部会有两块Buffer。调用lockCanvas之后,便可以在第一块Buffer上绘图了。绘完之后,调用unlockCanvasAndPost将Buffer显示再屏幕上,两个Buffer互换。
其次,重复上面的步骤,整个过程相当于上图的右半部分。
- 测试
要测试它的两个Buffer很容易,下面的例子即可。
/** * Used to test SurfaceView double buffer mechanics. * @author Fred * */public class TestDoubleBuffer extends SurfaceView implements Callback {private boolean quit_;public TestDoubleBuffer(Context context) {super(context);this.getHolder().addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {quit_ = false;new Thread(new Runnable() {@Overridepublic void run() {while (!quit_) {// Generate coordinates for rectangle.int rw = 100, rh = 100;int sw = TestDoubleBuffer.this.getWidth();int sh = TestDoubleBuffer.this.getHeight();int left = (int) ((sw - rw) * Math.random());int top = (int) ((sh - rh) * Math.random());// Create yellow paint.Paint paint = new Paint();// Draw rectangle filled with yellow.SurfaceHolder holder = TestDoubleBuffer.this.getHolder();Canvas canvas = holder.lockCanvas();paint.setColor(Color.YELLOW);canvas.drawRect(new Rect(left, top, left + rw, top + rh),paint);holder.unlockCanvasAndPost(canvas);// Sleep 1 second after every draw.try {Thread.sleep(1000);} catch (InterruptedException e) {}}}}).start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {quit_ = true;}}
该例子随机生成一个黄色的矩形,然后绘制在Buffer上,你会发现最后的结果是,在两个Buffer上生成不同的矩形,下图是其中相邻两帧的截图。
当不是刷屏的时候,程序中可能要做特别处理,否则会像此例一样的闪。
- Android SurfaceView Double Buffer
- innodb double buffer
- A Canvas of Double Buffer
- 16. 7. 2. Double buffer
- innodb double write buffer--struct
- innodb double write buffer--buf_dblwr_write_single_page
- innodb double write buffer--buf_dblwr_add_to_batch
- android SurfaceView
- Android SurfaceView
- android SurfaceView
- Android SurfaceView
- android SurfaceView
- Android SurfaceView
- Android SurfaceView
- Android SurfaceView
- Android - SurfaceView
- Android SurfaceView
- android surfaceview
- 启动JBoss出现“java.lang.RuntimeException: java.lang.reflect.InvocationTargetException”解决
- Android eclipse中程序调试
- 小游戏系列算法之二贪吃蛇算法原理
- spring @Transactional相关说明
- Windows下OpenGL轻松加载BMP, GIF, JPEG, PNG, and TIFF图片
- Android SurfaceView Double Buffer
- 【Struts2】Annotation使用小记
- microblogs
- Android中如何查看内存
- Android google map apiv2的最新申请密钥方式
- 启动JBoss出现“Unable to load configuration struts-default.xml”异常解决
- 面向对象的通讯录
- 时间高效小技术
- C#方法 记录程序日志的方法