Android - 如何正确调用onDraw(Canvas)中的intent(活动)?

时间:2015-03-20 18:32:14

标签: android android-intent android-canvas android-context

我试图在画布中调用一个intent,但它似乎没有像我想象的那样工作。我想到的是当它通过startactivity()时,那就是它,它会立即离开画布,但我错了。

流程应该是:

Menu -> Pong(Activity) -> Canvas -> Game_Over

发生了什么:

Menu -> Pong(Activity) -> Canvas(screen stuck here) -> Game_Over(iterates unknown times)

有时会崩溃而不会进入Game_Over。

在我的onDraw()内部是满足游戏结束条件时的代码:

Intent i = new Intent(getContext(), GameOver.class);
i.putExtra("score", Integer.toString(ball.getScore()));
i.putExtra("level", Integer.toString(ball.getLevel()));
getContext().startActivity(i);

根据我在分数后观察到的情况,它似乎循环了20多次,因为在下一个活动中发现的“高分”的吐司不会停止并且屏幕被卡在画布上直到循环停止。这让我知道要调用的活动无数次循环。

谁在这里有过错?是否重新绘制onDraw(),即使它已经启动startActivity()了吗?如果是,如何在onDraw()到达意图之前停止循环,以便它不会循环下一个活动?

这是我的onDraw()

public void onDraw(Canvas canvas) {
    // Background
    canvas.drawColor(Color.DKGRAY);

    // Score
    canvas.drawText("Score: " + Integer.toString(ball.getScore()), 25, 50,
            paint);

    // Level
    canvas.drawText("Level: " + Integer.toString(ball.getLevel()), 25, 100,
            paint);

    // =========================
    // Draw Paddle
    // paint.setColor(Color.parseColor("#AA00FFFF"));
    paint.setColor(Color.argb(170, 0, 255, 255));
    paint.setStrokeWidth(20);
    canvas.drawLine(padX, padY, padX + padWidth, padY, paint);

    // Draw Ball
    canvas.drawCircle(ball.getX(), ball.getY(), BALL_RADIUS, paint);

    if (ball.getScore() % 200 == 0) {
        // counter = counter + 1;
        if (ball.getLevel() < MAX_LEVEL) {
            ball.setSpeedX(ball.getSpeedX() * 0.25f);
            ball.setSpeedY(ball.getSpeedY() * 0.25f);
        }
    }

    postInvalidate();

    if (ball.getY() + (float) BALL_RADIUS >= y - 6) {
        if (ball.getX() + BALL_RADIUS / 2 > padX
                && ball.getX() - BALL_RADIUS / 2 < padX + padWidth) {
            ball.setGameOver(false);
        }

        else {
            ball.setGameOver(true);
            canvas.drawText("Game Over! Please Wait.", x / 2 - 170, y / 3,
                    paint);

            Intent i = new Intent(getContext(), GameOver.class);
            i.putExtra("score", Integer.toString(ball.getScore()));
            i.putExtra("level", Integer.toString(ball.getLevel()));
            getContext().startActivity(i);
        }

    }
}

1 个答案:

答案 0 :(得分:2)

onDraw可以每秒调用60次,它应该只是绘制,而不是处理活动流。 最小的改变是添加一个布尔值,并确保只调用一次startActivity。更好的解决方案是将活动管理者移出绘图,并进入状态管理逻辑