/*public override bool OnInterceptTouchEvent (MotionEvent ev) { // Only accept single touch if (ev.PointerCount != 1) return false; ev.OffsetLocation (0, TranslationY); return CaptureMovementCheck (ev); }*/ public override bool OnTouchEvent(MotionEvent e) { if (paneGestureDetector == null) { var l = new DoubleTapListener (() => SetState (Opened && FullyOpened ? State.Opened : State.FullyOpened)); paneGestureDetector = new GestureDetector (Context, l); } paneGestureDetector.OnTouchEvent (e); e.OffsetLocation (0, TranslationY); if (e.Action == MotionEventActions.Down) { CaptureMovementCheck (e); return true; } if (!isTracking && !CaptureMovementCheck (e)) return true; if (e.Action != MotionEventActions.Move || MoveDirectionTest (e)) velocityTracker.AddMovement (e); if (e.Action == MotionEventActions.Move) { var y = e.GetY (); // We don't want to go beyond startY if (state == State.Opened && y > startY || state == State.FullyOpened && y < startY) return true; // We reset the velocity tracker in case a movement goes back to its origin if (state == State.Opened && y > oldY || state == State.FullyOpened && y < oldY) velocityTracker.Clear (); var traveledDistance = (int)Math.Round (Math.Abs (y - startY)); if (state == State.Opened) traveledDistance = OffsetForState (State.Opened) - traveledDistance; SetNewOffset (traveledDistance); oldY = y; } else if (e.Action == MotionEventActions.Up) { velocityTracker.ComputeCurrentVelocity (1000, maxFlingVelocity); if (Math.Abs (velocityTracker.YVelocity) > minFlingVelocity && Math.Abs (velocityTracker.YVelocity) < maxFlingVelocity) SetState (state == State.FullyOpened ? State.Opened : State.FullyOpened); else if (state == State.FullyOpened && contentOffsetY > Height / 2) SetState (State.Opened); else if (state == State.Opened && contentOffsetY < Height / 2) SetState (State.FullyOpened); else SetState (state); preTracking = isTracking = false; velocityTracker.Clear (); velocityTracker.Recycle (); } return true; }
/*public override bool OnInterceptTouchEvent (MotionEvent ev) * { * // Only accept single touch * if (ev.PointerCount != 1) * return false; * ev.OffsetLocation (0, TranslationY); * return CaptureMovementCheck (ev); * }*/ public override bool OnTouchEvent(MotionEvent e) { if (paneGestureDetector == null) { var l = new DoubleTapListener(() => SetState(Opened && FullyOpened ? State.Opened : State.FullyOpened)); paneGestureDetector = new GestureDetector(Context, l); } paneGestureDetector.OnTouchEvent(e); e.OffsetLocation(0, TranslationY); if (e.Action == MotionEventActions.Down) { CaptureMovementCheck(e); return(true); } if (!isTracking && !CaptureMovementCheck(e)) { return(true); } if (e.Action != MotionEventActions.Move || MoveDirectionTest(e)) { velocityTracker.AddMovement(e); } if (e.Action == MotionEventActions.Move) { var y = e.GetY(); // We don't want to go beyond startY if (state == State.Opened && y > startY || state == State.FullyOpened && y < startY) { return(true); } // We reset the velocity tracker in case a movement goes back to its origin if (state == State.Opened && y > oldY || state == State.FullyOpened && y < oldY) { velocityTracker.Clear(); } var traveledDistance = (int)Math.Round(Math.Abs(y - startY)); if (state == State.Opened) { traveledDistance = OffsetForState(State.Opened) - traveledDistance; } SetNewOffset(traveledDistance); oldY = y; } else if (e.Action == MotionEventActions.Up) { velocityTracker.ComputeCurrentVelocity(1000, maxFlingVelocity); if (Math.Abs(velocityTracker.YVelocity) > minFlingVelocity && Math.Abs(velocityTracker.YVelocity) < maxFlingVelocity) { SetState(state == State.FullyOpened ? State.Opened : State.FullyOpened); } else if (state == State.FullyOpened && contentOffsetY > Height / 2) { SetState(State.Opened); } else if (state == State.Opened && contentOffsetY < Height / 2) { SetState(State.FullyOpened); } else { SetState(state); } preTracking = isTracking = false; velocityTracker.Clear(); velocityTracker.Recycle(); } return(true); }