2015-09-14 6 views
0

Предположим, что у меня есть событие движения, когда я держу ключ, мои пушки стреляют шарами. Все в порядке, но мне нужно создать цикл while() для этого внутри этого события, потому что шары отстают.MotionEvent - action_move (прослушивание action_up) в java

Дело в том, что я не могу избежать этого события. Цикл while бесконечен, и я не могу слушать ACTION_UP. Есть ли способ остановить это на ACTION_UP, находясь в этом цикле?

EDIT: часть кода:

@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; 
} 

ответ

0

Метод onTouchEvent пожаров события, как они приходят и не должны быть заблокированы. Если вы хотите непрерывно запускать действие, пока пальцы пользователя опущены, то после того, как вы получите событие ACTION_DOWN, вы должны начать поток (или асинхронную задачу или таймер или любую другую форму действия в другом потоке), которые затем должны добавить шары в ваш игровой цикл. Затем в вашем основном потоке вам нужно будет определить, были ли изменения в пользовательском интерфейсе и недействительными/нарисовать обновленные просмотры.

Тем не менее, ACTION_MOVE будет уволен, пока у пользователя будет палец. Таким образом, вам нужно будет определить, достаточно ли это или достаточно, чтобы переместить эту логику в другой поток.

Обратите внимание, что onTouchEvent будет срабатывать так быстро, как вы можете его использовать, поэтому, если вы столкнулись с проблемами производительности, на самом деле нормально спать здесь. Вы можете ознакомиться с документацией по этой рекомендации here

+0

Я пробовал это, но когда я реализую новую тему и помещаю это, пока есть лагги (и я не знаю почему). Не могли бы вы сказать мне, как это должно быть сделано? Может быть, я только начинал это неправильно или что-то в этом роде. –

+0

Вы используете какой-то игровой движок или стандартную деятельность? Я могу дать некоторые рекомендации, но если вы испытываете отставание, вы должны прокомментировать свой код и определить, откуда происходят задержки. – BoredAndroidDeveloper

+0

Теперь я создал новую тему, и она должна работать, но я не могу изменить изменчивую переменную «running». Он просто застревает в цикле внутри метода run() (система не видит MotionEvent вниз/вверх, когда im в run()) Возможно, я сделал что-то не так Oo Я отредактировал код в своем первом сообщении , не могли бы вы посмотреть? И да, у меня есть два (теперь три отдельных потока) для рисования игрового цикла и т. Д. –