GESTURE_STATE PinchDetector::Detect()

in PlayAssetDelivery/NativeSample/common/ndk_helper/gestureDetector.cpp [136:197]


GESTURE_STATE PinchDetector::Detect(const AInputEvent* event) {
  GESTURE_STATE ret = GESTURE_STATE_NONE;
  int32_t action = AMotionEvent_getAction(event);
  uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
  event_ = event;

  int32_t count = AMotionEvent_getPointerCount(event);
  switch (flags) {
    case AMOTION_EVENT_ACTION_DOWN:
      vec_pointers_.push_back(AMotionEvent_getPointerId(event, 0));
      break;
    case AMOTION_EVENT_ACTION_POINTER_DOWN: {
      int32_t iIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>
                       AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
      vec_pointers_.push_back(AMotionEvent_getPointerId(event, iIndex));
      if (count == 2) {
        // Start new pinch
        ret = GESTURE_STATE_START;
      }
    } break;
    case AMOTION_EVENT_ACTION_UP:
      vec_pointers_.pop_back();
      break;
    case AMOTION_EVENT_ACTION_POINTER_UP: {
      int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>
                      AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
      int32_t released_pointer_id = AMotionEvent_getPointerId(event, index);

      std::vector<int32_t>::iterator it = vec_pointers_.begin();
      std::vector<int32_t>::iterator it_end = vec_pointers_.end();
      int32_t i = 0;
      for (; it != it_end; ++it, ++i) {
        if (*it == released_pointer_id) {
          vec_pointers_.erase(it);
          break;
        }
      }

      if (i <= 1) {
        // Reset pinch or drag
        if (count != 2) {
          // Start new pinch
          ret = GESTURE_STATE_START | GESTURE_STATE_END;
        }
      }
    } break;
    case AMOTION_EVENT_ACTION_MOVE:
      switch (count) {
        case 1:
          break;
        default:
          // Multi touch
          ret = GESTURE_STATE_MOVE;
          break;
      }
      break;
    case AMOTION_EVENT_ACTION_CANCEL:
      break;
  }

  return ret;
}