2010-10-26 94 views
2

我必須在我的程序中使用手勢檢測器。一個美麗的作品,另一個沒有。據我所知,他們都以同樣的方式實施。Android:手勢檢測器不會捕獲手勢

下面是執行不工作的一個代碼:

myExcuseGestureDetector = new GestureDetector(new excuseGestureDetector()); 
excuseView.setOnTouchListener(new View.OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     if(myExcuseGestureDetector.onTouchEvent(event)){ 
     Log.d("Excuse Gesture Return","true"); 
     return true; 
     } 
     Log.d("Excuse Gesture Return","false"); 
     return false; 
    } 
}); 

然後,我有這個模塊以後,它定義excuseGestureDetector

private class excuseGestureDetector extends SimpleOnGestureListener{ 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    Log.d("MotionEvent","onFling"); 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      // right to left swipe 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       if(currExcuseNumber<currExcuseSet.size()){ 
       currExcuseNumber++; 
       loadNextExcuse(currExcuseNumber,1); 
       excuseView.setInAnimation(slideLeftExcuseIn); 
        excuseView.setOutAnimation(slideLeftExcuseOut); 
       excuseView.showNext(); 
       return true; 
       } 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       if(currExcuseNumber > 1){ 
       loadNextExcuse(currExcuseNumber,0); 
       excuseView.setInAnimation(slideRightExcuseIn); 
        excuseView.setOutAnimation(slideRightExcuseOut); 
       excuseView.showPrevious(); 
       return true; 
       } 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
} 

無論出於何種原因,不登記一擲千金。無論動畫是否發生,程序都應該打印出Log.d(「MotionEvent」,「onFling」),我試圖追蹤它,但不會。我所知道的是,它確實記錄了某種類型的觸發事件已經發生,因爲它從我顯示的第一個塊中找出「Excuse Gesture Return」「false」。任何想法爲什麼它不會登記投擲?

回答

4

我不太確定爲什麼,但只要我在SimpleOnGestureListener中爲所有可能的手勢放置了Overrides,它就開始工作。所有這些都需要它們,不僅僅是在飛行中。

+1

這裏有兩件事:視圖中的「onTouch()」處理程序,如果它已消耗觸摸事件應該返回。儘管如此,GestureDetector可能需要多個事件。因此,您不應該像現在一樣返回myExcuseGestureDetector.onTouchEvent(event),但是您應該將每個事件都提供給GestureDetector,並返回true以指示您已使用該觸摸。這很可能是現在工作,因爲你是GestureDetector總是返回true。 – botteaap 2011-01-30 14:15:51

+0

@LoneWolfPR我正在使用它像這樣.......但它不工作....請看看...... \t http://pastebin.com/n9JPGrCn – 2015-12-31 07:24:33

+0

它不起作用'Dialog'。你在'Dialog'上測試過嗎? – zeeali 2017-03-06 11:48:34

1

這是不是需要什麼,你可能也做了,是什麼讓他爲你工作是你的活動覆蓋的onTouchEvent somtehing這樣的:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (myGestureDetector.onTouchEvent(event)) { 
    return true; 
    } else { 
    return false; 
    } 
} 

我找到了答案上this excellent site

+2

或只是'返回myGestureDetector.onTouchEvent(事件)' – 2016-11-10 02:55:38