【问题标题】:Swipe gesture in all direction(Left,Right, Up, Down )向所有方向滑动手势(左、右、上、下)
【发布时间】:2016-11-29 13:59:38
【问题描述】:

我需要在我的代码中检测滑动方向。我可以检测到方向,但就像我在右上或左上滑动一样。左边也一样,我的要求是如果我向左滑动它应该只向左滑动,我的要求是不抬起手指,同样的所有方向。谁能帮我吗。提前致谢!

@覆盖 public boolean onTouchEvent(MotionEvent touchevent) {

    switch (touchevent.getAction()) {
        // when the user first touches the screen we get x and y coordinate
        case MotionEvent.ACTION_DOWN: {
            x1 = touchevent.getX();
            y1 = touchevent.getY();
            break;
        }

        case MotionEvent.ACTION_MOVE: {


            x2 = touchevent.getX();
            y2 = touchevent.getY();


            float deltaX = x2 - x1;


            if (Math.abs(deltaX) > MIN_DISTANCE) {
                // Left to Right swipe action
                if (x2 > x1) {;
                    Log.e("RTL", "Right to Left Swap Performed");
                }

                else {
                    Log.e("LTR", "Left to Right Swap Performed");
                }

            } else {

                if (y2 > y1) {

                    Log.e("UTD", "UP to Down Swap Performed");
                }

                // Right to left swipe action
                else {
                    Log.e("DTU", "Down to UP Swap Performed");
                }
            }
        }
    }
    return false;
}

【问题讨论】:

标签: android


【解决方案1】:

你应该计算角度然后决定。如果向量大于你的最小距离值,那么你可以检查角度。

float angle = (float) Math.toDegrees(Math.atan2(y2 - y1, x2 - x1));
if(angle > 45 && angle <= 135) return UP;
else if(angle > 135 && angle <= 225) return LEFT;
else if(angle > 225 && angle <= 315) return DOWN;
else return RIGHT;

【讨论】:

    【解决方案2】:

    创建一个GestureDetectorCompat对象

    GestureDetectorCompat gestureDetectorCompat;
    

    并在活动中覆盖 onTouchEvent

     @Override
            public boolean onTouchEvent(MotionEvent event) {
                gestureDetectorCompat.onTouchEvent(event);
                return true;
            }
    

    或者,如果您想在某些视图上进行检测,则可以覆盖 onTouch

    someView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    gestureDetectorCompat.onTouchEvent(motionEvent);
                    return false;
                }
            });
    

    并在 onCreate() 中按如下方式初始化gestureDetectorCompat,然后就完成了。

    gestureDetectorCompat = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                float angle = (float) Math.toDegrees(Math.atan2(e1.getY() - e2.getY(), e2.getX() - e1.getX()));
    
                if (angle > -45 && angle <= 45) {
                    Log.d(DEBUG_TAG, "Right to Left swipe performed");
                    return true;
                }
    
                if (angle >= 135 && angle < 180 || angle < -135 && angle > -180) {
                    Log.d(DEBUG_TAG, "Left to Right swipe performed");
                    return true;
                }
    
                if (angle < -45 && angle >= -135) {
                    Log.d(DEBUG_TAG, "Up to Down swipe performed");
                    return true;
                }
    
                if (angle > 45 && angle <= 135) {
                    Log.d(DEBUG_TAG, "Down to Up swipe performed");
                    return true;
                }
    
                return false;
            }
    
    
        });
    

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多