private boolean onTouchMove(MotionEvent event) {

    switch (mState) {
      case FLING:
      case BOUNCE:
      case WAITING_LISTENERS:
        // should never happen
        Log.e(LOGTAG, "Received impossible touch move while in " + mState);
        // fall through
      case ANIMATED_ZOOM:
      case NOTHING:
        // may happen if user double-taps and drags without lifting after the
        // second tap. ignore the move if this happens.
        return false;

      case TOUCHING:
        if (panDistance(event) < PAN_THRESHOLD) {
          return false;
        }
        cancelTouch();
        startPanning(event.getX(0), event.getY(0), event.getEventTime());
        track(event);
        return true;

      case PANNING_HOLD_LOCKED:
        setState(PanZoomState.PANNING_LOCKED);
        // fall through
      case PANNING_LOCKED:
        track(event);
        return true;

      case PANNING_HOLD:
        setState(PanZoomState.PANNING);
        // fall through
      case PANNING:
        track(event);
        return true;

      case PINCHING:
        // scale gesture listener will handle this
        return false;
    }
    Log.e(LOGTAG, "Unhandled case " + mState + " in onTouchMove");
    return false;
  }