MotionEvent-java中的动作移动(监听动作向上)

MotionEvent-java中的动作移动(监听动作向上),java,motionevent,Java,Motionevent,假设我有一个动作事件,当我拿着一把钥匙的时候,我的大炮就会射出球来。一切都很好,但我需要在这个项目中创建一个while循环,因为球落后了 关键是我无法逃避这件事。while循环是无限的,我听不到动作。在这个循环中,有什么方法可以阻止这个动作 编辑:代码的一部分: @Override public void surfaceCreated(SurfaceHolder holder) { game = new Game(holder, resources); game.start()

假设我有一个动作事件,当我拿着一把钥匙的时候,我的大炮就会射出球来。一切都很好,但我需要在这个项目中创建一个while循环,因为球落后了

关键是我无法逃避这件事。while循环是无限的,我听不到动作。在这个循环中,有什么方法可以阻止这个动作

编辑:代码的一部分:

@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方法在事件进入时激发事件,不应被阻止。如果你想在用户手指向下时连续触发动作,那么一旦你获得动作向下事件,你应该在另一个线程上启动一个线程或异步任务或计时器或任何其他形式的动作,然后将球添加到游戏循环中。然后在主线程中,您需要确定UI上是否有更改,并使更新的视图无效/绘制

然而,当用户下手时,ACTION_MOVE会被解雇很多次。因此,您必须自己确定这是否足够快,或者是否需要将该逻辑移动到另一个线程


请注意,onTouchEvent将以最快的速度启动,因此,如果遇到性能问题,可以在这里进行小规模睡眠。您可以查看该建议的文档

我已经尝试过了,但是当我实现一个新线程并在存在延迟的情况下使用它时,我不知道为什么。你能告诉我怎么做吗?也许我只是开始的时候做错了什么。你是在使用某种游戏引擎还是标准的活动?我可以提供一些指导,但如果您遇到延迟,那么您应该分析代码并确定延迟的来源。现在我已经创建了一个新线程,它应该可以工作,但我不能更改volatile“running”变量。它只是卡在运行方法中的一个循环中,当我在运行时,系统没有看到MotionEvent向下/向上,可能是我做错了什么O.O我在第一篇文章中编辑了代码,你能看一下吗?是的,我现在有两个三个独立的线程用于绘制游戏循环等。仅供参考-下次添加代码编辑,因为现在我的答案与你的新问题无关。对于这个新的编辑,我有点紧张,因为缺乏线程同步,所以你会想谷歌。此外,一旦启动线程并完成,那么线程就死了。因此,要使您所拥有的工作正常,您需要在onTouchEvent中创建/启动线程。问题是它会产生大量的垃圾回收。你分析过你的代码吗?老实说,我认为你可以通过在动作移动中添加一个球,然后忽略一个动作移动,如果它在x秒内发生。当你的手指向下时,这个项目会被大量发射,所以它会产生大量的球。