在Android上绘制到画布 - 屏幕闪烁/撕裂

时间:2011-11-03 14:46:15

标签: android

我有一张等长的地图,我画到画布上。当我尝试移动地图时,这些黑色线条在一些瓷砖之间闪烁,使整个东西看起来相当粗制滥造。

以下是我更新帖子的相关代码

public void run() {
    Canvas c;
    while (isRunning){
        c = null;
        try {
            c = cellMap.getHolder().lockCanvas(null);
            synchronized (cellMap.getHolder()) {
                cellMap.onDraw(c);
            }
        } finally {
            if( c != null){
                cellMap.getHolder().unlockCanvasAndPost(c);
            }
        }
    }
}

和我的CellMap类(扩展SurfaceView):

    public void onDraw(Canvas canvas){
    canvas.drawColor(Color.BLACK);
    int x = 0;
    int y = 0;

    for(int i = 0; i < mapSize; i++){
        for(int j = 0; j < mapSize; j++){
            x = (i-j) * 30 + xOffset;
            y = (i+j) * 15 + yOffset;
            mapCells[i][j].draw(canvas, paint, x, y);
        }
    }

mapCells[][]是一个包含需要绘制的Bitmap图像的对象数组。 draw()函数只有一行canvas.drawBitmap(bitmapImage, x, y, null)

我发现删除行Canvas.draw(Color.black)可以消除闪烁。但是,当我移动地图时,画布不会被清除,所以我仍然可以看到前一帧中的图像。我想这是因为绘制位图花了太长时间?但目前地图只是很小。

1 个答案:

答案 0 :(得分:2)

我发现了问题。移动地图时,偏移值正在改变。这导致地图的某些部分被临时绘制,具有不同的偏移值 - 创建撕裂。杜!

我通过在xOffset方法的开头复制yOffsetonDraw()值并使用这些值进行更新来解决此问题。