使用 canvas.drawBitmap 时位图重叠

Bitmaps overlap when using canvas.drawBitmap

我最近开始学习 android 和 java 并练习我开始制作 space 入侵者类型的游戏。

为了绘制所有图像(player/enemy/etc),我一直在使用覆盖的onDraw 方法和canvas.DrawBitmap(..)。这就是我的问题开始的地方。每当我使用新的 X、Y 坐标绘制图像时,之前的位图仍在 canvas 上,这使得所有内容重叠。有什么方法可以刷新 canvas 或只是摆脱 "leftovers"(我什至不知道如何称呼它们)。当我做这个的时候,我的印象是我只是在屏幕上移动了 1 个图像,但看起来我错了。

这是我用来绘制播放器位图的代码:

public void render(Canvas canvas){
     //draw the player image
     canvas.drawBitmap(_bmPlayerImg, (float) (_dX - (_iHalfWidth)),
             (float)(_dY - (_iHalfHeight)), null);
 }

onDraw()方法:

@Override
 protected void onDraw(Canvas canvas) {

    //draw the player
    _player.render(canvas);

 }//end method

onDraw() 方法在我用作游戏计时器的线程中每 50 毫秒调用一次:

public Runnable runnable = new Runnable() {
    @Override
    public void run() {
        canvas = null;

        try {
            canvas = surfaceHolder.lockCanvas();
            synchronized(surfaceHolder){
                //update the state of all objects in the game
                gamePanel.update(canvas);

                gamePanel.onDraw(canvas);
            }
        } finally {
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }//end if
        }//end finally          
        handler.postDelayed(this, _iRepeatTime);
    }
};

感谢任何帮助...我尝试查找但找不到任何内容。

在 canvas 上绘制任何内容之前:

//clear the canvas
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

现在你的canvas已经清楚了,你可以画出你的角色了。

如果您的 onDraw 方法在展开视图中 class 并且由您调用 invalidate() 触发,那么 canvas 会自动清除自身。但是你是手动调用的(貌似你用的是surface/texture视图?),所以你得手动清除。