簡體   English   中英

MotionEvent-Java中的action_move(監聽action_up)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM