2013-05-21 125 views
2

我正在使用onTouch方法与水龙头ACTION_UPGestureDetector捕捉双击,我的问题是双击水龙头,然后是双击,然后是水龙头。有没有办法让双击水龙头或水龙头?我在逻辑上知道它做的是正确的,所以如果你建议我找到另一种方式评论,请不要投票。谢谢!Android区分水龙头和双击水龙头

+0

很难从描述中分辨出你可能做错了什么。请显示你的代码。 –

+0

它不是一个代码问题,水龙头工作的方式是一个ACTION_DOWN和一个ACTION_UP,所以在双击时你会得到两个动作起伏,所以它的工作正常,但我想知道是否有另一种方法来区分单一和双击不会导致两次敲击和双击同时 – Osman

回答

5

我建议您切换到SimpleGestureListener并使用onDoubleTap()onSingleTapConfirmed()方法。

+0

这就是我正在寻找的,好的,我现在就来看看!谢谢!我看着虽然文件不能相信我没有看到! – Osman

+0

准确地说,它是执行所有工作的GestureDetector,SimpleGestureListener只是GestureListener的一个实现,它总是返回false。 –

0

除了britzl建议你可能想要检查一下你的逻辑。

我不认为双击会导致多重,它只会导致4个事件,就像你有点提到。虽然手势库(我认为)是最好的选择,你应该考虑的是:

  • 商店Motionevent的时间戳(这是其方法之一)上ACTION_UP,那么下一个行动起来进行比较。提供超时时,您会知道它是水龙头还是双击。

那是什么手势听众做

1

比什么是britzl说更确切地说,GestureDetector做决定时的东西是一个单一的轻击,双击,长按等实际工作。SimpleGestureListener只是GestureDetector用来表示它识别的“听众”。它实现了OnGestureListenerOnDoubleTapListener只是为了总是返回false。看看从onTouchEvent(MotionEvent)片段在GestureDetector

case MotionEvent.ACTION_DOWN: 
     if (mDoubleTapListener != null) { 
      boolean hadTapMessage = mHandler.hasMessages(TAP); 
      if (hadTapMessage) mHandler.removeMessages(TAP); 
      if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage && 
        isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) { 
       // This is a second tap 
       mIsDoubleTapping = true; 
       // Give a callback with the first tap of the double-tap 
       handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent); 
       // Give a callback with down event of the double-tap 
       handled |= mDoubleTapListener.onDoubleTapEvent(ev); 
      } else { 
       // This is a first tap 
       mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT); 
      } 
     } 

     mDownFocusX = mLastFocusX = focusX; 
     mDownFocusY = mLastFocusY = focusY; 
     if (mCurrentDownEvent != null) { 
      mCurrentDownEvent.recycle(); 
     } 
     mCurrentDownEvent = MotionEvent.obtain(ev); 
     mAlwaysInTapRegion = true; 
     mAlwaysInBiggerTapRegion = true; 
     mStillDown = true; 
     mInLongPress = false; 
     mDeferConfirmSingleTap = false; 

     if (mIsLongpressEnabled) { 
      mHandler.removeMessages(LONG_PRESS); 
      mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime() 
        + TAP_TIMEOUT + LONGPRESS_TIMEOUT); 
     } 
     mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + TAP_TIMEOUT); 
     handled |= mListener.onDown(ev); 
     break; 

然后期望的结果可以通过适当的听众创造一个GestureDetector获得:

final View.OnTouchListener touch_listener = new View.OnTouchListener() { 

      @Override public boolean onTouch(View view, MotionEvent event) { 
       return _gesture_detector.onTouchEvent(event); 
      } 

      private final GestureDetector _gesture_detector = new GestureDetector(getContext() 
        , new GestureDetector.SimpleOnGestureListener() { 

       @Override public boolean onSingleTapConfirmed(MotionEvent event) { 
        // TODO: implement single tap behavior 
        // NOTE: returning true indicates that the gesture was handled 
        return true; 
       } 

       @Override public boolean onDoubleTap(MotionEvent event) { 
        // TODO: implement double tap behavior 
        // NOTE: returning true indicates that the gesture was handled 
        return true; 
       } 
      }); 
     }; 

从那里,这OnTouchListener可设置为想要行为的View

它通过使用默认GestureHandler(这是一个Handler):

private class GestureHandler extends Handler { 
    GestureHandler() { 
     super(); 
    } 

    GestureHandler(Handler handler) { 
     super(handler.getLooper()); 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case SHOW_PRESS: 
      mListener.onShowPress(mCurrentDownEvent); 
      break; 

     case LONG_PRESS: 
      dispatchLongPress(); 
      break; 

     case TAP: 
      // If the user's finger is still down, do not count it as a tap 
      if (mDoubleTapListener != null) { 
       if (!mStillDown) { 
        mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent); 
       } else { 
        mDeferConfirmSingleTap = true; 
       } 
      } 
      break; 

     default: 
      throw new RuntimeException("Unknown message " + msg); //never 
     } 
    } 
} 

回想一下GestureDetector线mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);。它会延迟通过有效双击手势的超时时间段的通知。 GestureDetector的行if (hadTapMessage) mHandler.removeMessages(TAP);会在有效的双击后删除该通知。 GestureHandler在延迟后收到轻击通知,并使用回调通知GestureListener使用mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);GestureHandler将在收到轻击通知时用户的手指停止时将该回调延迟至MotionEvent.ACTION_UP(由GestureDetector处理)。