Событие вызывается, когда пользователь касается экрана?

Добро пожаловать

Я разрабатываю игру. Я хочу, чтобы, когда пользователь касается экрана, лазер должен запускаться постоянно каждые 100 мс от нижней части экрана до затронутых координат x, y, пока пользователь не перестанет касаться экрана. У меня работает лазер, но теперь мне нужно запускать его постоянно каждые 100 мс.

Я перезаписываю событие onTouch, и проблема в том, что я не знаю, как удовлетворить свои потребности. Я хочу запускать лазер каждые 100 мс, если пользователь касается экрана.

Если я поместил анимацию лазера в событие onTouch MotionEvent.ACTION_MOVE, то лазер выбрасывается только при перемещении пальца. Но я хочу, чтобы лазер запускался каждые 100 мс, не двигая пальцем.

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

Как мои потребности могут быть удовлетворены?


person NullPointerException    schedule 25.01.2015    source источник


Ответы (2)


Не существует простого способа получать ваше событие каждые 100 мс.

но вы можете сделать это:

        class TouchStarted {
        AtomicBoolean actionDownFlag = new AtomicBoolean(true);

        Thread loggingThread = new Thread(new Runnable(){

            public void run(){
                while(actionDownFlag.get()){
                    Log.d("event", "Touching Down");
                    try {
                       Thread.sleep(100, 0);
                    } catch (InterruptedException e) {
                    }
                    //maybe sleep some times to not polute your logcat
                }
                Log.d("event", "Not Touching");
            }
        });

        public void stop() {
            actionDownFlag.set(false);
        }

        public void start() {
            actionDownFlag.set(true);
            loggingThread.start();
        }

    }

    TouchStarted last = null;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if(event.getAction()==MotionEvent.ACTION_DOWN){
            if(last != null) last.stop();
            last = new TouchStarted();
            last.start();
        }
        if(event.getAction()==MotionEvent.ACTION_UP){
            last.stop();
        }
    }
person RonM    schedule 25.01.2015

Вы можете попробовать что-то подобное в своем ACTION_DOWN

Thread thread = new Thread(new Runnable){
    @Override
    public void run(){
        while(yourFlag) //figure out something to set up a loop 
          try{ 

            yourfirelasermethod();  
            Thread.sleep(100);     // this waits 100ms until firing             
                                   // again
         }catch(Exception e){

         }
    }
}).start();
person A Honey Bustard    schedule 25.01.2015