2014-02-11 3 views
1

Это, скорее всего, тривиальный материал, но я не могу найти для него решение. Все просто, пользователь нажимает на экран, а когда он держит палец на экране, я хочу выполнить кусок кода.SurfaceView выполнить метод, пока пальцы касаются экрана

Вот пример кода:

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     synchronized (getHolder()) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
         myobject.setX(myobject.getX() - 10); 
      } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 

      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      } 
      return true; 
     } 
    } 

Эффект этого кода является то, что myobject.setX() происходит только один раз, я хочу, чтобы это повторять, пока пользователь держит палец на экране, так если он удерживает его в течение 3 секунд, myobject.setX() будет уменьшаться с -10 несколько раз.

+0

возвращая верно в в конце вы можете отключить дальнейшее распространение событий, изменить оператор return на false ... –

ответ

0

Вы могли бы сделать что-то вроде этого (пример):

int howLongUntilEdge = 1000; 
CountDownTimer t = new CountDownTimer(howLongUntilEdge, 1000) { 

    @Override 
    public void onTick(long millisUntilFinished) { 
     myobject.setX(myobject.getX() - 10); 
    } 

    @Override 
    public void onFinish() {} 
}; 

затем на сенсорном события:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    synchronized (getHolder()) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      t.start(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      t.stop(); 
     } 

     return true; 
    } 
} 

Это движение будет его влево на 10 каждую секунду. Вам нужно будет сделать что-то вроде решения, сколько секунд до тех пор, пока оно не достигнет края, и установите howLongUntilEdge var, чтобы отобразить правильное значение.

+0

Мне больше всего нравится этот подход. Спасибо за ответ. – Alin

+0

Добро пожаловать. Одна вещь, о которой нужно помнить - onTouchEvent с ACTION_UP, может не запускаться в некоторых редких случаях, например, если вы получили телефонный звонок, когда вы его нажали. Возможно, вы захотите также остановить таймер на странице вашего фрагмента/действия –

0

MotionEvent, указанный в public boolean onTouchEvent(MotionEvent event), будет соответствовать только MotionEvent.ACTION_DOWN для первоначального касания. Вам нужно будет продолжить ваши обновления в вашем случае if: (event.getAction() == MotionEvent.ACTION_MOVE).

1

Вы можете использовать логическую переменную (присвоенную true для ACTION_DOWN), чтобы указать, что вы все еще нажимаете экран, и когда вы поднимаете палец (ACTION_UP), вы установите его на ложь, поэтому во время этого вы можете создать тему, чтобы выполнить свой код много раз, когда вы хотите, как это:

private boolean mIsStillPressing; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    synchronized (getHolder()) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      mIsStillPressing = true; 
      new Thread() { 
       @Override 
       public void run() { 
        // Still moving object until an ACTION_UP is done. 
        while (mIsStillPressing) { 
         myobject.setX(myobject.getX() - 10); 

         // Some sleep time 
         try { 
          Thread.sleep(100L); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }.start(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      mIsStillPressing = false; 
     } 
     return true; 
    } 
}` 
Смежные вопросы