diff --git a/src/Droid/Renderers/CarouselLayoutRenderer.cs b/src/Droid/Renderers/CarouselLayoutRenderer.cs index 0da7f41..91b6c7f 100644 --- a/src/Droid/Renderers/CarouselLayoutRenderer.cs +++ b/src/Droid/Renderers/CarouselLayoutRenderer.cs @@ -56,6 +56,9 @@ void HScrollViewTouch (object sender, TouchEventArgs e) switch (e.Event.Action) { case MotionEventActions.Move: + /* MotionEventActions.Down will not fire if a child element is intercepting the event. + Down has to occur before move so we will ensure that happens. */ + OnMotionEventActionsDown(); _deltaXResetTimer.Stop (); _deltaX = _scrollView.ScrollX - _prevScrollX; _prevScrollX = _scrollView.ScrollX; @@ -65,8 +68,8 @@ void HScrollViewTouch (object sender, TouchEventArgs e) _deltaXResetTimer.Start (); break; case MotionEventActions.Down: - _motionDown = true; - _scrollStopTimer.Stop (); + // Note: This case block will never occur if a child element is consuming the down event. + OnMotionEventActionsDown(); break; case MotionEventActions.Up: _motionDown = false; @@ -74,9 +77,21 @@ void HScrollViewTouch (object sender, TouchEventArgs e) _scrollStopTimer.Start (); break; } - } - - void UpdateSelectedIndex () { + } + + /// + /// If motionDown is set to false set it to true and stop the scroll timer. + /// + void OnMotionEventActionsDown() + { + if (!_motionDown) + { + _motionDown = true; + _scrollStopTimer.Stop(); + } + } + + void UpdateSelectedIndex () { var center = _scrollView.ScrollX + (_scrollView.Width / 2); var carouselLayout = (CarouselLayout)this.Element; carouselLayout.SelectedIndex = (center / _scrollView.Width);