[英]MotionEvent - action_move (listening for action_up) in java
假設我有一個動作事件,當我按住鑰匙時,我的大炮會發射球。 一切都很好,但是我需要在事件內部為此創建一個while()循環,這會導致球滯后。
關鍵是我無法逃脫此事件。 while循環是無限的,我無法收聽ACTION_UP。 在此循環中,有什么方法可以在ACTION_UP上停止此操作?
編輯:部分代碼:
@Override
public void surfaceCreated(SurfaceHolder holder) {
game = new Game(holder, resources);
game.start();
shootingThread = new Thread(new Runnable() {
@Override
public void run(){
while(running) {
int size = game.gameLoop.balls.size();
if (size == 0) {
game.gameLoop.balls.add(new Ball(metrics.widthPixels, metrics.heightPixels, touched_x, touched_y, game.gameLoop.ball_bmp_width, metrics.heightPixels - game.gameLoop.ball_bmp_width / 2));
} else if (size > 0 && game.gameLoop.balls.get(size - 1).image_center_y < metrics.heightPixels - game.gameLoop.ball_bmp_width - 50)
game.gameLoop.balls.add(new Ball(metrics.widthPixels, metrics.heightPixels, touched_x, touched_y, game.gameLoop.ball_bmp_width, metrics.heightPixels - game.gameLoop.ball_bmp_width / 2));
}
// }
}
});
shootingThread.start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
touched_x = event.getX();
touched_y = event.getY();
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
startShootTime = new Date().getTime();
running = true;
shootingThread.run();
Log.i("", "\n\ndown\n\n");
} else if (action == MotionEvent.ACTION_MOVE ) {
touched_x = event.getX();
touched_y = event.getY();
} else if (action == MotionEvent.ACTION_UP) {
Log.i("", "\n\nup\n\n");
running = false;
}
return true;
}
onTouchEvent方法會在事件進入時觸發事件,因此不應將其阻止。 如果要在用戶的手指按下時連續觸發動作,則一旦獲得ACTION_DOWN事件,就應該啟動一個線程(或異步任務或計時器或其他線程上的任何其他形式的動作),然后將球添加到您的游戲循環。 然后,在主線程中,您需要確定UI上是否有更改,並使無效的視圖/繪制更新的視圖。
但是,當用戶將手指放下時,ACTION_MOVE將被觸發很多次。 因此,您必須自己確定這是否足夠快,還是需要將該邏輯移至另一個線程。
請注意,onTouchEvent將以您可以消耗的最快的速度觸發,因此,如果遇到性能問題,可以在這里稍作睡眠。 您可以在此處查看該建議的文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.