Analyzes the given motion event and if applicable triggers the appropriate callbacks on the OnGestureListener supplied.
  103  {
  104    boolean handled = false;
  105    final int action = ev.getAction();
  106    
  107 
  108    switch (action & MotionEvent.ACTION_MASK)
  109    {
  110      case MotionEvent.ACTION_DOWN:
  111        if (mCurrentDownEvent != null)
  112          mCurrentDownEvent.recycle();
  113 
  114        mCurrentMode = MODE_UNKNOWN;
  115        mCurrentDownEvent = MotionEvent.obtain(ev);
  116        mCancelDetection = false;
  117        mDoubleInProgress = false;
  118        mScrollDetectionScore = 0;
  119        handled = true;
  120        break;
  121 
  122      case MotionEvent.ACTION_POINTER_UP:
  123        if (mPreviousPointerUpEvent != null)
  124          mPreviousPointerUpEvent.recycle();
  125        mPreviousPointerUpEvent = MotionEvent.obtain(ev);
  126        break;
  127 
  128      case MotionEvent.ACTION_POINTER_DOWN:
  129        
  130        
  131        if (ev.getPointerCount() > 2 ||
  132            (ev.getEventTime() - mCurrentDownEvent.getEventTime()) > DOUBLE_TOUCH_TIMEOUT)
  133        {
  134          cancel();
  135          break;
  136        }
  137 
  138        
  139        if (mCancelDetection)
  140          break;
  141 
  142        
  143        mDoubleInProgress = true;
  144        if (mCurrentDoubleDownEvent != null)
  145          mCurrentDoubleDownEvent.recycle();
  146        mCurrentDoubleDownEvent = MotionEvent.obtain(ev);
  147 
  148        
  149        
  150        mCurrentMode = MODE_UNKNOWN;
  151        mHandler.sendEmptyMessageDelayed(TAP, SINGLE_DOUBLE_TOUCH_TIMEOUT);
  152 
  154        break;
  155 
  156      case MotionEvent.ACTION_MOVE:
  157 
  158        
  159        if (mCancelDetection || !mDoubleInProgress || ev.getPointerCount() != 2)
  160          break;
  161 
  162        
  163        if (mCurrentMode == MODE_UNKNOWN)
  164        {
  165          
  166          if (pointerDistanceChanged(mCurrentDoubleDownEvent, ev))
  167          {
  168            handled |= scaleGestureDetector.onTouchEvent(mCurrentDownEvent);
  169            MotionEvent e = MotionEvent.obtain(ev);
  170            e.setAction(mCurrentDoubleDownEvent.getAction());
  171            handled |= scaleGestureDetector.onTouchEvent(e);
  172            mCurrentMode = MODE_PINCH_ZOOM;
  173            break;
  174          }
  175          else
  176          {
  177            mScrollDetectionScore++;
  178            if (mScrollDetectionScore >= SCROLL_SCORE_TO_REACH)
  179              mCurrentMode = MODE_SCROLL;
  180          }
  181        }
  182 
  183        switch (mCurrentMode)
  184        {
  185          case MODE_PINCH_ZOOM:
  186            if (scaleGestureDetector != null)
  187              handled |= scaleGestureDetector.onTouchEvent(ev);
  188            break;
  189 
  190          case MODE_SCROLL:
  192            break;
  193 
  194          default:
  195            handled = true;
  196            break;
  197        }
  198 
  199        break;
  200 
  201      case MotionEvent.ACTION_UP:
  202        
  203        if (mPreviousPointerUpEvent != null &&
  204            (ev.getEventTime() - mPreviousPointerUpEvent.getEventTime()) >
  205                DOUBLE_TOUCH_TIMEOUT)
  206        {
  207          mPreviousPointerUpEvent.recycle();
  208          mPreviousPointerUpEvent = null;
  209          cancel();
  210          break;
  211        }
  212 
  213        
  214        if (mCancelDetection || !mDoubleInProgress)
  215          break;
  216 
  217        boolean hasTapEvent = mHandler.hasMessages(TAP);
  218        MotionEvent currentUpEvent = MotionEvent.obtain(ev);
  219        if (mCurrentMode == MODE_UNKNOWN && hasTapEvent)
  221        else if (mCurrentMode == MODE_PINCH_ZOOM)
  222          handled = scaleGestureDetector.onTouchEvent(ev);
  223 
  224        if (mPreviousUpEvent != null)
  225          mPreviousUpEvent.recycle();
  226 
  227        
  228        mPreviousUpEvent = currentUpEvent;
  230        break;
  231 
  232      case MotionEvent.ACTION_CANCEL:
  233        cancel();
  234        break;
  235    }
  236 
  237    if ((action == MotionEvent.ACTION_MOVE) && !handled)
  238      handled = true;
  239 
  240    return handled;
  241  }
boolean onDoubleTouchScroll(MotionEvent e1, MotionEvent e2)
boolean onDoubleTouchUp(MotionEvent e)
boolean onDoubleTouchDown(MotionEvent e)
boolean onDoubleTouchSingleTap(MotionEvent e)