Android - 如何正确调用 onDraw(Canvas) 中的 intent(activity)?
Android - How to call an intent(activity) inside the onDraw(Canvas) properly?
我正在尝试调用 canvas 中的意图,但它似乎没有按照我认为的方式工作。我的想法是当它通过 startactivity()
时,就是这样,它立即退出 canvas 但我错了。
流量应该是:
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 多次,因为在下一个 activity 中找到的 "High Score" 的祝酒词不会停止并且屏幕停留在 canvas 直到循环停止。这给了我一个线索,要调用的 activity 循环了无数次。
谁对谁错?即使它已经启动了 startActivity()
,它是否是用于重绘的 onDraw()
?如果是,我如何在达到意图之前停止 onDraw()
循环,这样它就不会循环下一个 activity?
这是我的 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);
}
}
}
onDraw 每秒可以调用 60 次,它应该只是绘制,而不是处理 activity 流程。
最小的变化是添加一个布尔值并确保只调用 startActivity 一次。更好的解决方案是将 activity 管理人员移出绘图,并移入状态管理逻辑
我正在尝试调用 canvas 中的意图,但它似乎没有按照我认为的方式工作。我的想法是当它通过 startactivity()
时,就是这样,它立即退出 canvas 但我错了。
流量应该是:
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 多次,因为在下一个 activity 中找到的 "High Score" 的祝酒词不会停止并且屏幕停留在 canvas 直到循环停止。这给了我一个线索,要调用的 activity 循环了无数次。
谁对谁错?即使它已经启动了 startActivity()
,它是否是用于重绘的 onDraw()
?如果是,我如何在达到意图之前停止 onDraw()
循环,这样它就不会循环下一个 activity?
这是我的 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);
}
}
}
onDraw 每秒可以调用 60 次,它应该只是绘制,而不是处理 activity 流程。 最小的变化是添加一个布尔值并确保只调用 startActivity 一次。更好的解决方案是将 activity 管理人员移出绘图,并移入状态管理逻辑