Пример #1
0
        /*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 bool ConsumesActivityTouch(MotionEvent ev)
 {
     //TODO work out if it's our view in here, then update the coordinates
     var offset = GetOffsetInNativeView (ev.GetX (), ev.GetY ());
     Console.WriteLine ("location " + ev.GetX () + ", " + ev.GetY () + " offset " + offset);
     ev.OffsetLocation (-offset.X, -offset.Y);
     Console.WriteLine ("ofseeted " + ev.GetX () + ", " + ev.GetY ());
     if (ev.GetX () < 0 || ev.GetY () < 0 || ev.GetX () > NativeView.Width || ev.GetY () > NativeView.Height) {
         return false;
     } else {
         //next check children
     //				var isConsumedByChild = IsTouchConsumedByChildren (NativeView as ViewGroup, ev);
         //we need to check all views to see if they ate the touch
         OnTouch (this.NativeView, ev);
     }
     return false;
 }