/*
   * Determines if we should change the touch state to start dragging after the
   * user moves their touch point far enough.
   */
  protected void determineDraggingStart(MotionEvent ev) {
    /*
     * Locally do absolute value. mLastMotionX is set to the y value
     * of the down event.
     */
    final int pointerIndex = ev.findPointerIndex(mActivePointerId);
    final float x = ev.getX(pointerIndex);
    final float y = ev.getY(pointerIndex);
    final int xDiff = (int) Math.abs(x - mLastMotionX);
    final int yDiff = (int) Math.abs(y - mLastMotionY);

    final int touchSlop = mTouchSlop;
    boolean yMoved = yDiff > touchSlop;
    boolean isUpwardMotion = (yDiff / (float) xDiff) > mDragSlopeThreshold;

    if (isUpwardMotion && yMoved && mLastTouchedItem != null) {
      // Drag if the user moved far enough along the Y axis
      beginDragging(mLastTouchedItem);

      // Cancel any pending long press
      if (mAllowLongPress) {
        mAllowLongPress = false;
        // Try canceling the long press. It could also have been scheduled
        // by a distant descendant, so use the mAllowLongPress flag to block
        // everything
        final View currentPage = getPageAt(mCurrentPage);
        if (currentPage != null) {
          currentPage.cancelLongPress();
        }
      }
    }
  }
  private void checkStartScroll(float x, float y) {
    /*
     * Locally do absolute value. mLastMotionX is set to the y value
     * of the down event.
     */
    final int xDiff = (int) Math.abs(x - mLastMotionX);
    final int yDiff = (int) Math.abs(y - mLastMotionY);

    boolean xMoved = xDiff > mTouchSlop;
    boolean yMoved = yDiff > mTouchSlop;

    if (xMoved || yMoved) {

      if (yMoved) {
        // Scroll if the user moved far enough along the X axis
        mTouchState = TOUCH_STATE_SCROLLING;
        enableChildrenCache();
      }
      // Either way, cancel any pending longpress
      if (mAllowLongPress) {
        mAllowLongPress = false;
        // Try canceling the long press. It could also have been scheduled
        // by a distant descendant, so use the mAllowLongPress flag to block
        // everything
        final View currentScreen = getChildAt(mCurrentPage);
        currentScreen.cancelLongPress();
      }
    }
  }
 @Override
 public void cancelLongPress() {
   super.cancelLongPress();
   final int count = getChildCount();
   for (int i = 0; i < count; i++) {
     final View child = getChildAt(i);
     child.cancelLongPress();
   }
 }
Exemple #4
0
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {

    if (mLocked) {
      return true;
    }

    final int action = ev.getAction();
    if ((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST)) {
      return true;
    }

    final float x = ev.getX();
    final float y = ev.getY();

    switch (action) {
      case MotionEvent.ACTION_MOVE:
        final int xDiff = (int) Math.abs(x - mLastMotionX);
        final int yDiff = (int) Math.abs(y - mLastMotionY);

        final int touchSlop = mTouchSlop;
        boolean xMoved = xDiff > touchSlop;
        boolean yMoved = yDiff > touchSlop;

        if (xMoved || yMoved) {

          if (xMoved) {
            // Scroll if the user moved far enough along the X axis
            mTouchState = TOUCH_STATE_SCROLLING;
            enableChildrenCache();
          }
          // Either way, cancel any pending longpress
          if (mAllowLongPress) {
            mAllowLongPress = false;
            // Try canceling the long press. It could also have been scheduled
            // by a distant descendant, so use the mAllowLongPress flag to block
            // everything
            final View currentScreen = getChildAt(mCurrentScreen);
            currentScreen.cancelLongPress();
          }
        }
        break;

      case MotionEvent.ACTION_DOWN:
        // Remember location of down touch
        mLastMotionX = x;
        mLastMotionY = y;
        mAllowLongPress = true;

        mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;

        break;

      case MotionEvent.ACTION_CANCEL:
      case MotionEvent.ACTION_UP:
        // Release the drag
        clearChildrenCache();
        mTouchState = TOUCH_STATE_REST;
        mAllowLongPress = false;
        break;
    }

    /*
     * The only time we want to intercept motion events is if we are in the
     * drag mode.
     */
    return mTouchState != TOUCH_STATE_REST;
  }