diff --git a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Android/SKTouchHandler.cs b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Android/SKTouchHandler.cs index fcfd4861b8..bdab58933b 100644 --- a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Android/SKTouchHandler.cs +++ b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Android/SKTouchHandler.cs @@ -41,6 +41,9 @@ private void OnTouch(object sender, View.TouchEventArgs e) if (onTouchAction == null || scalePixels == null) return; + if (!(sender is View view)) + return; + var evt = e.Event; var pointer = evt.ActionIndex; @@ -54,6 +57,11 @@ private void OnTouch(object sender, View.TouchEventArgs e) { var args = new SKTouchEventArgs(id, SKTouchAction.Pressed, coords, true); onTouchAction(args); + + // if we are taking control, prevent the parents from scrolling + if (args.Handled) + view.Parent?.RequestDisallowInterceptTouchEvent(true); + e.Handled = args.Handled; break; } @@ -78,6 +86,11 @@ private void OnTouch(object sender, View.TouchEventArgs e) { var args = new SKTouchEventArgs(id, SKTouchAction.Released, coords, false); onTouchAction(args); + + // if the last pointer is up, then restore + if (evt.ActionMasked == MotionEventActions.Up) + view.Parent?.RequestDisallowInterceptTouchEvent(false); + e.Handled = args.Handled; break; } @@ -86,6 +99,10 @@ private void OnTouch(object sender, View.TouchEventArgs e) { var args = new SKTouchEventArgs(id, SKTouchAction.Cancelled, coords, false); onTouchAction(args); + + // if the gesture was cancelled, then restore + view.Parent?.RequestDisallowInterceptTouchEvent(false); + e.Handled = args.Handled; break; }