手势检测器上的OnUp事件

问题描述:

我的问题很简单,实现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

尝试使用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

我通过阅读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); 
    } 
}); 

你从你在GestureDetector.OnGestureListener消耗其他事件返回真?我遇到了这个问题,事实证明如果你返回false,那么系统假定你不感兴趣并且不会传递你的事件,所以你错过了!

其他答案可以解决这个问题,也许他们工作很好,但我不认为这些问题是很好的解决方案。
因为我们应该在单个模块中处理事件,所以我们可以保持或扩展代码。
(顺便说一下,不要不使用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 
    } 
} 

:)