2011-04-19 114 views
24

我的問題很簡單,實現GestureListener時onUp事件是哪裏?手勢檢測器上的OnUp事件

我在gesturedetector上有很多事件,並且不能僅僅使用偵聽器的onUp事件,導致事件之一是需要它的onSingleTapConfirmed。

+0

我不是很確定你想在這裏做什麼,但有'onSingleTapUp'在'g^estureListener'這可能是你在找什麼。儘管如此,它還是被完全點燃了,而不是輕掃。爲此,您可以只處理視圖/活動的「原始」onTouchEvent而不傳遞給「GestureDetector」。 – Xion 2011-04-19 22:09:25

+1

點擊完成後,會觸發onSingleTapUp。我需要DOWN,然後MOVE,然後以UP結束。 – 2011-04-19 23:15:22

+0

這是'onFling',除了你沒有得到MOVE事件。如果你需要它們,我想你唯一的選擇就是直接處理'onTouchEvent'。 – Xion 2011-04-20 07:31:17

回答

23

嘗試使用onFling()。看起來像一個奇怪的名字,但對我來說,它的工作原理是onUp()方法將在邏輯上起作用。或者試試這個方法...

@Override 
public boolean onTouchEvent(MotionEvent me) { 

    Log.v("ADAM", "ontouch: " + me.getAction()); 

    if(me.getAction() == 0){ 
    Log.v("ADAM", "Down"); 
    } 
    else if (me.getAction() == 1) { 
    Log.v("ADAM", "Up"); 
    } 
    else if (me.getAction() == 2) { 
    Log.v("ADAM", "Scroll"); 
    } 
    boolean detectedUp = event.getAction() == MotionEvent.ACTION_UP; 
    if (!mGestureDetector.onTouchEvent(event) && detectedUp) { 
    return onUp(event); 
    } 
    return true; 
} 
+1

我在通過GestureListener之前閱讀通風口來解決這個問題(onFling絕對無用) – 2011-05-19 22:47:34

+0

很好的答案,只是想補充說onFling並不是完全沒用 - 它可以幫助您區分滾動和滑動。雖然當你認爲你只是舉起手指時,經常會發生一些事情,但你可以通過檢查onFling處理程序中的速度參數來篩選出不重要的。 – 2012-02-06 06:27:30

+15

當您執行滑動操作時,並不總是發生OnFling事件。最值得注意的是,如果你在刷完之前輕掃但停止移動你的手指一會兒,通常就沒有事件發生。 – 2012-11-08 00:59:38

4

我通過閱讀Action event固定它之前,我把它傳遞給GestureListener

img.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 
     if (arg1.getAction() == MotionEvent.ACTION_UP 
      && !getDocument().isScaled()) 
     img.notifyUp(); 
     return gestures.onTouchEvent(arg1); 
    } 
}); 
2

你從你在GestureDetector.OnGestureListener消耗其他事件返回真?我遇到了這個問題,事實證明如果你返回false,那麼系統假定你不感興趣並且不會傳遞你的事件,所以你錯過了!

2

其他答案可以解決這個問題,也許他們工作很好,但我不認爲這些問題是很好的解決方案。
因爲我們應該在單個模塊中處理事件,所以我們可以保持或擴展代碼。
(順便說一下,不要不使用onFilng(),如果你的手指在屏幕上緩慢移動,onFilng()將無法​​正常工作)
所以,我的解決辦法是改寫GestureDetector

public class ModifyGestureDetector extends GestureDetector { 

    MyGestureListener myGestureListener; 

    public ModifyGestureDetector(Context context, OnGestureListener listener) { 
     super(context, listener); 
     init(listener); 
    } 

    void init(OnGestureListener listener){ 
     if (listener instanceof MyGestureListener){ 
      myGestureListener = (MyGestureListener) listener; 
     } 
    } 

    //u can write something more complex as long as u need 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     if(ev.getAction() == MotionEvent.ACTION_UP 
      && myGestureListener != null){ 
      myGestureListener.onUp(ev); 
     } 
     return super.onTouchEvent(ev); 
    } 

    public interface MyGestureListener{ 
     public void onUp(MotionEvent ev); 
    } 
} 

與聽者:

public class MyGestureListener extends GestureDetector.SimpleOnGestureListener 
     implements ModifyGestureDetector.MyGestureListener { 


    @Override 
    public void onUp(MotionEvent ev) { 
     //do what u want 
    } 
} 

:)