如何在Android手机中捕捉手指运动方向?

und*_*ack 22 android

我想捕捉Android触控手机上的手指移动方向.如果用户向上/向下/向左/向右滑动手指,我想捕获此方向.我怎么能找到这个?谢谢.

cst*_*ack 45

实现onTouchEvent(),并根据用户按下并抬起的位置计算dx和dy.您可以使用这些值来确定移动的方向.

float x1, x2, y1, y2, dx, dy;
String direction;
switch(event.getAction()) {
    case(MotionEvent.ACTION_DOWN):
        x1 = event.getX();
        y1 = event.getY();
        break;

    case(MotionEvent.ACTION_UP): {
        x2 = event.getX();
        y2 = event.getY();
        dx = x2-x1;
        dy = y2-y1;

        // Use dx and dy to determine the direction of the move
        if(Math.abs(dx) > Math.abs(dy)) {
            if(dx>0)
              direction = "right";
            else
              direction = "left";
        } else {
            if(dy>0)
              direction = "down";
            else
              direction = "up";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但我发现了一些拼写错误,并且不得不将这些变量带到更高的范围,以使它们在交换机内部变得可变. (4认同)
  • 对于第二个开关案例,我使用了ACTION_MOVE而不是ACTION_UP,因为在ViewPager中,无需ACTION_UP即可调用滑动.我有一个由ViewGroup持有的垂直方向的ScrollView,它是一个ViewPager页面.在ScrollView上滑动确实会更改页面而不是响应.case MotionEvent.ACTION_MOVE:float dx = event.getX() - x1; float dy = event.getY() - y1; if(Math.abs(dx)<= Math.abs(dy)){// vertical scroll v.getParent().requestDisallowInterceptTouchEvent(true); } else {v.getParent().requestDisallowInterceptTouchEvent(false);} break; (2认同)
  • 如果用户抬起他/她的手指并移动手指,如果用户在不抬起手指的情况下改变方向时如何处理外壳,这个方法效果很好? (2认同)

nic*_*ild 10

最好的办法是处理从View.OnTouchListener()回调中获得的MotionEvent.运动事件通过其action属性跟踪您当前与View的交互方式.

我想你可以通过检查MotionEvents的动作属性和动作事件发生位置的x/y值来计算某人滑动手指的方向.

switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            oldX= event.getX();
            oldY= event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            int newX = motionEvent.getX();
            int newY = motionEvent.getY();

            int deltaX = oldX - newX;
            int deltaY = oldY - newY;

            if(Math.abs(deltaY)>Math.abs(deltaX))
              //Motion in Y direction.
            else
              // Motion in X direction.
            break;
         }
Run Code Online (Sandbox Code Playgroud)

MotionEvent对象上还有许多其他方法可供使用:http: //developer.android.com/reference/android/view/MotionEvent.html