From 6de48775d70a3f0b31d4f0be12affcb9ba7c0bcf Mon Sep 17 00:00:00 2001 From: FoggyFinder Date: Sat, 7 Sep 2019 00:23:33 +0300 Subject: [PATCH 1/2] fix --- .../SkiaSharp.Views.Forms.Android/SKTouchHandler.cs | 6 ++++++ 1 file changed, 6 insertions(+) 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..8ca52c30f9 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; @@ -52,6 +55,7 @@ private void OnTouch(object sender, View.TouchEventArgs e) case MotionEventActions.Down: case MotionEventActions.PointerDown: { + view.Parent.RequestDisallowInterceptTouchEvent(true); var args = new SKTouchEventArgs(id, SKTouchAction.Pressed, coords, true); onTouchAction(args); e.Handled = args.Handled; @@ -76,6 +80,7 @@ private void OnTouch(object sender, View.TouchEventArgs e) case MotionEventActions.Up: case MotionEventActions.PointerUp: { + view.Parent.RequestDisallowInterceptTouchEvent(false); var args = new SKTouchEventArgs(id, SKTouchAction.Released, coords, false); onTouchAction(args); e.Handled = args.Handled; @@ -84,6 +89,7 @@ private void OnTouch(object sender, View.TouchEventArgs e) case MotionEventActions.Cancel: { + view.Parent.RequestDisallowInterceptTouchEvent(false); var args = new SKTouchEventArgs(id, SKTouchAction.Cancelled, coords, false); onTouchAction(args); e.Handled = args.Handled; From 2d88391fae4d38f6d242dfb12ce7b3efc48c43bf Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Tue, 12 Nov 2019 03:28:44 +0200 Subject: [PATCH 2/2] First check to see if the user wants to intercept --- .../SKTouchHandler.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) 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 8ca52c30f9..bdab58933b 100644 --- a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Android/SKTouchHandler.cs +++ b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Android/SKTouchHandler.cs @@ -55,9 +55,13 @@ private void OnTouch(object sender, View.TouchEventArgs e) case MotionEventActions.Down: case MotionEventActions.PointerDown: { - view.Parent.RequestDisallowInterceptTouchEvent(true); 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; } @@ -80,18 +84,25 @@ private void OnTouch(object sender, View.TouchEventArgs e) case MotionEventActions.Up: case MotionEventActions.PointerUp: { - view.Parent.RequestDisallowInterceptTouchEvent(false); 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; } case MotionEventActions.Cancel: { - view.Parent.RequestDisallowInterceptTouchEvent(false); 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; }