刷新画布会擦除以前的数据

时间:2013-06-10 19:36:16

标签: java android android-canvas

我在Canvas上制作了类似Battleships游戏的东西。 我们来看看这个领域: enter image description here

问题是:当我按下另一个单元时,黄色单元会再次变黑。我想保存它的状态,这样这个黄色的细胞就不会再变黑了。

以下是代码在点击时要执行的操作:

// it's some method A
case 1:
        drawHit = true;
        this.draw_x = x;
        this.draw_y = y;
        invalidate();
        break;

// It's in onDraw() method
if (drawHit == true) {
        Log.d(TAG, "drawHit! drawX = " + draw_x + ", drawY = " + draw_y);
        Paint ship = new Paint();
        ship.setColor(getResources().getColor(R.color.ship_color));
        Rect r = new Rect(draw_x*rebro_piece, draw_y * rebro_piece, (draw_x+1) * rebro_piece, (draw_y+1)*rebro_piece);
        canvas.drawRect(r, ship);
        drawHit = false; }

2 个答案:

答案 0 :(得分:1)

我相信最好的解决方案是改变你的方法,这是一个简单的例子:

创建一个类来对动作进行建模,例如:

public class BattleTurn {
 //here you save your Rect you had on your onDraw()
 //but you will have to create the moment user clicks
 private Rect rect;
 private boolean hit;
 //...
}

为每回合游戏保留一份清单。

List<BattleTurn> turns = new ArrayList<BattleTurn>();

每次有人玩你都会添加一个新的转弯(turns.add(...))并使你的画布无效,这样它就会重绘。

onDraw()上,您将完成每个转弯并绘制它:

//for each turn you draw it on the canvas
for (BattleTurn turn: turns){
 //draw the turn like you already do
 if (turn.getHit()) {
        Log.d(TAG, "drawHit! drawX = " + draw_x + ", drawY = " + draw_y);
        Paint ship = new Paint();
        ship.setColor(getResources().getColor(R.color.ship_color));
        canvas.drawRect(turn.getRect(), ship);
 }
}

答案 1 :(得分:1)

我在最近的应用程序中遇到了这个问题,打印了画布上的点。每个点都有不同的颜色和大小,我不得不保存他们的状态。

您所要做的就是创建一个小类,您可以在其中保存单元格,保存信息并将所有信息存储在列表中。在onDraw()方法中,在drawRect()之前,使用已保存的颜色更新Paint对象。

我会在这里向您展示我的片段。 (1个建议:每次调用onDraw时都不要实例化Paint,最好在外面声明它,也许作为你班级的私有变量)

private class MyPoint {

        private float x;
        private float y;
        private int color;
        private int size;
    // + constructor, getters and setters
}

@Override
    public void onDraw(Canvas canvas) {
        for (MyPoint point : points) {
            paint.setColor(point.get_color());
            canvas.drawCircle(point.x, point.y, current_size, paint);
        }
    }