public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: mLastY = ev.getY(); mDragging = false; View view = mCallback.getChildAtPosition(ev); if (view instanceof SwipeableItemView) { mCurrView = (SwipeableItemView) view; } else { // If the touched item is not a swipeable one, clean the cache in // mCurrView to make sure nothing will be swiped for this action mCurrView = null; } mVelocityTracker.clear(); if (mCurrView != null) { mCurrAnimView = mCurrView.getSwipeableView().getView(); mCanCurrViewBeDimissed = mCallback.canChildBeDismissed(mCurrView); mVelocityTracker.addMovement(ev); mInitialTouchPosX = ev.getX(); mInitialTouchPosY = ev.getY(); } mCallback.cancelDismissCounter(); break; case MotionEvent.ACTION_MOVE: if (mCurrView != null) { // Check the movement direction. if (mLastY >= 0 && !mDragging) { float currY = ev.getY(); float currX = ev.getX(); float deltaY = Math.abs(currY - mInitialTouchPosY); float deltaX = Math.abs(currX - mInitialTouchPosX); if (deltaY > mCurrView.getMinAllowScrollDistance() && deltaY > (FACTOR * deltaX)) { mLastY = ev.getY(); mCallback.onScroll(); return false; } } mVelocityTracker.addMovement(ev); float pos = ev.getX(); float delta = pos - mInitialTouchPosX; if (Math.abs(delta) > mPagingTouchSlop) { mCallback.onBeginDrag(mCurrView.getSwipeableView().getView()); mPrevView = mCallback.getLastSwipedItem(); mDragging = true; mInitialTouchPosX = ev.getX() - mCurrAnimView.getTranslationX(); mInitialTouchPosY = ev.getY(); } } mLastY = ev.getY(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mDragging = false; mCurrView = null; mCurrAnimView = null; mLastY = -1; break; } return mDragging; }