2013-05-21 2 views
2

Я использую метод onTouch, чтобы поймать прикосновение ACTION_UP и GestureDetector, чтобы захватить двойной кран, моя проблема - двойное нажатие приводит к крану, затем к двойному нажатию, затем кран. Есть ли способ, чтобы блок двойного крана кран или что-то в этом роде? Я знаю логично, что это делает правильно, поэтому, если вы посоветуете, я нахожу другой способ просто комментировать, пожалуйста, не голосуйте. Благодаря!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, чтобы указать, что он распознал. Он реализует OnGestureListener и OnDoubleTapListener, чтобы всегда возвращать 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 
     } 
    } 
} 

Напомним линия mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT); от GestureDetector. Он задерживает уведомление о кране тайм-аутом для действительного двойного жестов. И линия if (hadTapMessage) mHandler.removeMessages(TAP); от GestureDetector удаляет это уведомление по действующему двойному нажатию. GestureHandler получает уведомление о разводе после задержки и использует обратный вызов для уведомления GestureListener с mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);. GestureHandler задержит этот обратный вызов до MotionEvent.ACTION_UP (обрабатывается GestureDetector) в том случае, если палец пользователя не работает, когда получено уведомление о подключении.

Смежные вопросы