2012-06-04 101 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); 
}