Java在Android中使用canvas和surfaceview实现双缓冲

7
如何进行这个操作?有人能给我一个大致的步骤吗?
从我在网上找到的资料来看,在我的run()函数中:
1.创建一个位图
2.创建一个画布并将其附加到位图上
3.lockCanvas()
4.调用draw(canvas)并将位图绘制到后备缓冲区中(如何实现?)
5.unlockCanvasAndPost()
这样做对吗?如果是,请给我一些解释;这些步骤是什么意思,如何实现?我以前从未为Android编程过,所以我真的很菜。如果不正确,我该怎么做?
2个回答

17

它已经实现了双缓冲,这就是unlockCanvasAndPost()调用的作用。不需要创建位图。


我不是很明白。所以,我只需要在锁定和解锁之间画出我需要的一切,然后...双缓冲会自动发生?我难道不需要在锁定之前也进行绘制吗?对不起,我需要以最基本的方式来解释这个问题... - Kalina
7
在调用lockCanvas()之后在画布上绘制时,实际上是在下一帧上进行绘制,而当前帧正在显示。调用unlockCanvasAndPost()将切换下一帧缓冲区与当前帧缓冲区,以显示更新的画布。 - Wroclai
如果您想要能够缩放和移动您的“工作区”,那么位图部分非常有用。 - TheRealChx101

2
Android开发者组中的步骤可以看出,您需要一个缓冲画布,将所有渲染内容绘制到其中。
Bitmap buffCanvasBitmap;
Canvas buffCanvas;

// Creating bitmap with attaching it to the buffer-canvas, it means that all the changes // done with the canvas are captured into the attached bitmap
tempCanvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
tempCanvas = new Canvas();
tempCanvas.setBitmap(tempCanvasBitmap);

// and then you lock main canvas
canvas = getHolder().lockCanvas();              
// draw everything you need into the buffer
tempCanvas.drawRect.... // and etc
// then you draw the attached bitmap into the main canvas
canvas.drawBitmap(tempCanvasBitmap, 0, 0, drawView.getPaint());
// then unlocking canvas to let it be drawn with main mechanisms
getHolder().unlockCanvasAndPost(canvas);

您正在获取主缓冲区,这样您就可以在不获取每个持有者锁定的不同双缓冲画布的情况下进行绘制。


我认为这里的变量名有点混乱了? - netpoetica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接