Android OnTouch向上/向下滑动方向更改

时间:2016-07-25 14:48:28

标签: android direction ontouch yaxis

当用户仍然在屏幕上滑动时,我试图检测滑动方向的变化。

我有类似的东西(非常基本的)用于检测滑动方向:

@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
  5. 这会被检测为向上滑动,因为初始Y高于最后Y

1 个答案:

答案 0 :(得分: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...