2016-06-30 1 views
0

Я хочу рассчитать дельта положения касания на экране. Для этого я использую этот код:Android: Простейший способ расчета дельта положения касания?

public boolean onTouchEvent(MotionEvent event) { 
    touchX = (int) event.getX(); 
    touchY = (int) event.getY(); 

    deltaX = touchX - oldX; 
    deltaY = touchY - oldY; 

    oldX = touchX; 
    oldY = touchY; 

    return super.onTouchEvent(event); 
} 

Теперь, когда я двигаю палец на экране в течение некоторого времени, я получаю правильную дельту. Но проблема возникает, когда я останавливаю палец, но не поднимаю его. В то время я просто получаю ненулевую дельта последнего кадра. Это потому, что onTouchEvent не вызывается, когда палец находится на экране, но статичен. Я должен получить нулевую дельта, когда палец статичен.

Какое решение этой проблемы?

ответ

1

Оставшееся оставленное пальцем на экране не a MotionEvent, поэтому этот метод не будет называться.

Попробуйте это.

private Handler mHandler = new Handler(); 
private static final int FINGER_STOP_THRESHOLD = 500; 

public boolean onTouchEvent(MotionEvent event) { 
    touchX = (int) event.getX(); 
    touchY = (int) event.getY(); 

    deltaX = touchX - oldX; 
    deltaY = touchY - oldY; 

    oldX = touchX; 
    oldY = touchY; 

    mHandler.removeCallbacksAndMessages(null); 
    if(event.getActionMasked() != MotionEvent.ACTION_UP){ 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       deltaX = 0; 
       deltaY = 0; 
      } 
     }, FINGER_STOP_THRESHOLD); 
    } 

    return super.onTouchEvent(event); 
} 

Вы можете изменить FINGER_STOP_THRESHOLD на нужное вам значение.

+0

Я использовал тот же метод раньше, кроме строки 'mHandler.removeCallbacksAndMessages (null);'. Но это было вроде лагги. Использование вашего решения убило отставание. Что делает эта линия? –

+0

Эта строка удаляет все незавершенные задачи. Это необходимо, потому что, если произойдет новое событие касания, все предыдущие ожидания не имеют смысла. –