Cheesebaron.HorizontalPager.HorizontalPager.OnTouchEvent C# (CSharp) Method

OnTouchEvent() public method

public OnTouchEvent ( Android.Views.MotionEvent e ) : bool
e Android.Views.MotionEvent
return bool
        public override bool OnTouchEvent(MotionEvent e)
        {
            if (mVelocityTracker == null)
                mVelocityTracker = VelocityTracker.Obtain();
            mVelocityTracker.AddMovement(e);

            MotionEventActions action = e.Action;
            float x = e.GetX();

            switch (action)
            {
                case MotionEventActions.Down:
                    if (!mScroller.IsFinished)
                        mScroller.AbortAnimation();

                    mLastMotionX = x;

                    if (mScroller.IsFinished)
                        mTouchState = TOUCH_STATE_REST;
                    else
                        mTouchState = TOUCH_STATE_HORIZONTAL_SCROLLING;
                    break;
                case MotionEventActions.Move:
                    int xDiff = (int)Math.Abs(x - mLastMotionX);
                    bool xMoved = xDiff > mTouchSlop;

                    if (xMoved)
                        mTouchState = TOUCH_STATE_HORIZONTAL_SCROLLING;

                    if (mTouchState == TOUCH_STATE_HORIZONTAL_SCROLLING)
                    {
                        int deltaX = (int)(mLastMotionX - x);
                        mLastMotionX = x;
                        int scrollX = this.ScrollX;

                        if (deltaX < 0)
                        {
                            if (scrollX > 0)
                                ScrollBy(Math.Max(-scrollX, deltaX), 0);
                        }
                        else if (deltaX > 0)
                        {
                            if (this.ChildCount >= 1)
                            {
                                int avalableToScroll = this.GetChildAt(this.ChildCount - 1).Right - scrollX - Width;

                                if (avalableToScroll > 0)
                                    ScrollBy(Math.Min(avalableToScroll, deltaX), 0);
                            }
                        }
                    }
                    break;
                case MotionEventActions.Up:
                    if (mTouchState == TOUCH_STATE_HORIZONTAL_SCROLLING)
                    {
                        VelocityTracker velocityTracker = mVelocityTracker;
                        velocityTracker.ComputeCurrentVelocity(VELOCITY_UNIT_PIXELS_PER_SECOND, mMaximumVelocity);
                        int velocityX = (int)velocityTracker.XVelocity;

                        if (velocityX > mDensityAdjustedSnapVelocity && mCurrentScreen > 0)
                            SnapToScreen(mCurrentScreen - 1);
                        else if (velocityX < -mDensityAdjustedSnapVelocity && mCurrentScreen < this.ChildCount - 1)
                            SnapToScreen(mCurrentScreen + 1);
                        else
                            SnapToDestination();

                        if (mVelocityTracker != null)
                        {
                            mVelocityTracker.Recycle();
                            mVelocityTracker = null;
                        }
                        mTouchState = TOUCH_STATE_REST;
                    }
                    break;
                case MotionEventActions.Cancel:
                    mTouchState = TOUCH_STATE_REST;
                    break;
                default:
                    break;
            }
            return true;
        }