繁体   English   中英

android:如何检测水平和垂直手势线

[英]android: how to detect horizontal and vertical gesture lines

我有一些我想要与线连接的对象。 用户应该能够通过简单的线条手势完成此操作。 我使用GestureOverlayView并阅读文章http://developer.android.com/resources/articles/gestures.html ,其中说明以下内容

orientation:表示下方视图的滚动方向。 在这种情况下,列表垂直滚动,这意味着任何水平手势(如action_delete)都可以立即被识别为手势。 以垂直笔划开始的手势必须包含至少一个要识别的水平分量。 换句话说,简单的垂直线不能被识别为手势,因为它会与列表的滚动冲突。

这是我的问题 - 我想画水平和垂直的线条

现在我有一个OnGesturePerfomedListener,它执行正常的手势识别,另外还有一个GestureOverlayView.OnGestureListener,我在其中检测线条。 但现在我想画一条虚线 - 也是垂直和水平的。 如果我能像OnGesturePerformedListener那样获得完整的手势,而不是像onGestureListener那样获得虚线的每一个笔划,那将会更加容易。

我有什么想法可以轻松解决这个问题? 是否有一种方法,即使无法识别手势,也会在手势完成时调用? 我也尝试使用GestureDetector.OnGestureListener,我现在用它来检测longPress,但它对这个问题无济于事。

在其他线程中找到了类似的解决方案,这可能对您(以及可能遇到此问题的任何其他人)有用。 这很可能需要认真修改以适应您的目的,但我认为它会让您接近:

//Swipe direction detection constants
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

    //Gesture detection
    this.gestureDetector = new GestureDetectorCompat(this,this);
    gestureDetector.setOnDoubleTapListener(this);
}

//On gesture...
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    return true;
}

@Override
public boolean onDoubleTap(MotionEvent e) {
    return true;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    return true;
}

@Override
public boolean onDown(MotionEvent e) {
    return true;
}

@Override
public void onShowPress(MotionEvent e) {

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    return true;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    return true;
}

@Override
public void onLongPress(MotionEvent e) {

}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

    try {
        // right to left swipe
        if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            //DO SOMETHING...
        }
        // left to right swipe
        else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            //DO SOMETHING...
        }
        // top to bottom swipe
        if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            //DO SOMETHING...
        }
        // bottom to top swipe
        else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            //DO SOMETHING...
        }
    } catch (Exception e) {
        return false;
    }

    return true;

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    this.gestureDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM