如何控制Android的双缓冲行为?

时间:2017-04-25 22:30:10

标签: android animation doublebuffered double-buffering

我正在编写一个小动画,其中一个区域应该从屏幕的左侧开始,然后加宽以覆盖整个屏幕,然后反弹回来。我希望速度变化,但我发现当速度很高时,会出现很多“幽灵”图像。

我首先尝试使用基本View,然后更改为SurfaceView。它仍然是鬼怪。我查看了绘制在单独的位图(缓冲区)上,如in this question所示。

我当前版本的绘图代码如下所示:

Bitmap tempCanvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas screenCanvas = currentCanvasHolder.lockCanvas();
Canvas buffCanvas = new Canvas();
buffCanvas.setBitmap( tempCanvasBitmap );
blackRect.set( widthToPaint + 1, 0, viewWidth, viewHeight );
colorRect.set( 0, 0, widthToPaint, viewHeight );

buffCanvas.drawRect( blackRect, blackPaint );
buffCanvas.drawRect( colorRect, colorPaints[ currentColor ] );

screenCanvas.drawBitmap( tempCanvasBitmap, 0, 0, new Paint());

currentCanvasHolder.unlockCanvasAndPost( screenCanvas );

但它仍然是鬼怪!为了帮助解释,我在当前状态下附加了几个动画视频:

为了更多地了解这个问题,我创建了一个新项目,其中一条线来回反弹。正如Android文档中关于缓冲的建议,我每次都清理整个画布。但是,我仍然在整个动画中看到这条线“重复”几次(在它停止之后它只会出现,这是我所期待的。)

该项目可在https://github.com/thedanielgray/android-flickering-demo找到。在渲染动画时,Android会以某种方式组合所有以前的缓冲区吗?我试图绘制几行而不清除画布,似乎有超过2个画布/缓冲在动画的不同步骤进行交换。我有什么选择来控制这种缓冲行为?

0 个答案:

没有答案
相关问题