【问题标题】:Android OnTouch swipe up/down direction changeAndroid OnTouch 上下滑动改变方向
【发布时间】:2016-11-28 23:34:45
【问题描述】:

我正在尝试检测何时更改了滑动方向,而用户仍在屏幕上滑动。

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

@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

【问题讨论】:

  • 如果你从 y = 100 开始,那么你将如何向上移动直到 y = 150?
  • 对不起,我搞砸了方向,现在更新了。
  • 你得到的其实是真的......如果您只想要滑动的最后一个方向(我从问题中理解),您必须以不同的方式实现它。
  • 我知道这基本上是正确的,但是当用户改变方向时,我想对这种改变做出正确的反应。问题是我无法想出一个好的解决方案来检测 OnTouch MotionEvent 何时实际发生方向变化。如果您有任何想法,请发布它,也许它至少可以引导我朝着正确的方向前进。谢谢。

标签: android direction ontouch yaxis


【解决方案1】:

如果你想检测滑动的方向变化有一个简单的方法:

    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...

【讨论】:

  • 我会尝试切换到 GestureDetector,也许更容易实现这一点。你知道这是否能正确检测到你何时越界?
  • @IonutNegru 不确定它是否这样做。不过你总是可以测试它;)
  • 将在接下来的几天对其进行测试,因为目前我正忙于其他任务,但一旦我完成了,我就会得到结果。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多