2016-06-30 11 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

フィンガーが画面上に停止したままである場合は、ではなく、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

この行は、すべての保留中のタスクを削除します。新しいタッチイベントが発生した場合、以前のすべての待機は意味をなさないので必要です。 –

関連する問題