ユーザーがまだ画面をスワイプしているときに、スワイプの方向がいつ変更されたかを検出しようとしています。
スワイプ方向を検出するために、次のような(非常に基本的な)ものがあります。
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN: {
Log.d(TAG, "onTouch: DOWN _Y = " + motionEvent.getRawY());
mLastTouchY = mPrevTouchY = motionEvent.getRawY();
break;
}
case MotionEvent.ACTION_MOVE: {
Log.d(TAG, "onTouch: MOVE _Y = " + motionEvent.getRawY());
final float dy = motionEvent.getRawY();
if (dy >= mLastTouchY) {
/* Move down */
} else {
/* Move up */
}
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_UP: {
Log.d(TAG, "onTouch: UP _Y = " + motionEvent.getRawY());
// snap page
break;
}
}
return true;
}
私が必要とするのは、ユーザーがスワイプの方向を変更したときを実際に検出することです。たとえば、上記のコードはいくつかのエッジ ケースの検出に失敗します。
- Y = 100 から開始し、
- 150まで下に移動し、
- 50まで上がり、
- 90まで再び下に移動
最初の Y が最後の Y よりも高いため、これは上へのスワイプとして検出されます。