使用canvas.drawBitmap时,位图会重叠

时间:2015-03-12 02:59:16

标签: java android android-canvas

我最近开始学习android和java,并且练习我开始制作一个太空入侵者类型的游戏。

为了绘制所有图像(玩家/敌人/等),我一直在使用被覆盖的onDraw方法和canvas.DrawBitmap(..)。这是我的问题开始的地方。每当我用新的X,Y坐标绘制图像时,前一个位图仍然在画布上,这使得一切都重叠。有没有办法刷新画布或只是摆脱剩余的#34;(我甚至不知道该怎么称呼它们)。当我做到这一点时,我的印象是我只是将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()方法在我每隔50ms用作游戏计时器的线程中调用:

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);
    }
};

任何帮助都表示赞赏......我试着查找它,但我找不到任何东西。

1 个答案:

答案 0 :(得分:1)

在画布上绘制任何内容之前:

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

现在你的画布很清晰,你可以画出你的角色。

如果onDraw方法在扩展视图类中并且由调用invalidate()触发,则画布将自动清除。但是你手动调用它(看起来你正在使用表面/纹理视图?),所以你必须手动清除它。