2012-06-04 44 views
3

我有一些对象,我想用线连接。用户应该能够用简单的线条手势来完成。我使用一个GestureOverlayView并阅读那篇文章http://developer.android.com/resources/articles/gestures.html,其中说以下内容android:如何检测水平和垂直手势线

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

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

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

任何想法,我可以轻松解决这个问题吗?有没有一种方法,在做完手势后被调用,即使它不被识别? 我也尝试使用GestureDetector.OnGestureListener,我现在使用它来检测longPress,但它不会帮助解决这个问题。

+0

您是否得到了解决方案。我也面临这个问题。我怎样才能做到这一点? – SKK

回答

0

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

//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); 
}