1

ユーザーがまだ画面をスワイプしているときに、スワイプの方向がいつ変更されたかを検出しようとしています。

スワイプ方向を検出するために、次のような(非常に基本的な)ものがあります。

@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;
}

私が必要とするのは、ユーザーがスワイプの方向を変更したときを実際に検出することです。たとえば、上記のコードはいくつかのエッジ ケースの検出に失敗します。

  1. Y = 100 から開始し、
  2. 150まで下に移動し、
  3. 50まで上がり、
  4. 90まで再び下に移動

最初の Y が最後の Y よりも高いため、これは上へのスワイプとして検出されます。

4

1 に答える 1

0

スワイプの方向の変化を検出したい場合は、簡単な方法があります。

    private GestureDetector gestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        findViewById(R.id.myView).setOnTouchListener(this);
        gestureDetector = new GestureDetector(this, this);
    }

そして、次のように OnTouch と GestureListeners を実装します。

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        if (distanceY > 0){
            // you are going up
        } else {
            // you are going down
        }
        return true;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }
    //the rest of the methods you must implement...
于 2016-07-25T17:26:03.083 に答える