Search code examples
c#mauitouch-event

How can I get a touch event in .net Maui?


I can not find a touch event handler for my .net maui application. The built-in gesture recognizer has a TapGesture. Google searches for this returned nothing. I asked ChatGPT which recommended using Effects from the Microsoft.Maui.Essentials kit. However, I can not even installed it because the platform type DotnetPlatform is incompatible with my project, but looking at the Documentation it seems that this is useless LLVM advice.

How can I listen for a TouchBegin and TouchEnd event on a .net maui Frame?


Solution

  • In .NET MAUI, if you want to listen for specific touch events like TouchBegin and TouchEnd, you might need to go a bit lower-level than the built-in gesture recognizers like TapGesture.

    Here's a general approach to achieving this:

    1. Custom Renderer Approach: The custom renderer approach allows you to use native controls and their features. By writing custom renderers for the Frame, you can capture native touch events.

    Code snippets are untested

    For Android:

    using Android.Views;
    using Microsoft.Maui.Controls;
    using Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;
    using YourNamespace;
    using FrameRenderer = Microsoft.Maui.Controls.Compatibility.Platform.Android.FrameRenderer;
    
    [assembly: ExportRenderer(typeof(Frame), typeof(CustomFrameRenderer))]
    namespace YourNamespace
    {
        public class CustomFrameRenderer : FrameRenderer
        {
            public CustomFrameRenderer(Context context) : base(context) { }
    
            public override bool OnTouchEvent(MotionEvent e)
            {
                if (e.Action == MotionEventActions.Down)
                {
                    // TouchBegin
                }
                else if (e.Action == MotionEventActions.Up)
                {
                    // TouchEnd
                }
    
                return base.OnTouchEvent(e);
            }
        }
    }
    

    For iOS:

    using UIKit;
    using Microsoft.Maui.Controls;
    using YourNamespace;
    using FrameRenderer = Microsoft.Maui.Controls.Compatibility.Platform.iOS.FrameRenderer;
    
    [assembly: ExportRenderer(typeof(Frame), typeof(CustomFrameRenderer))]
    namespace YourNamespace
    {
        public class CustomFrameRenderer : FrameRenderer
        {
            public override void TouchesBegan(NSSet touches, UIEvent evt)
            {
                base.TouchesBegan(touches, evt);
                // TouchBegin
            }
    
            public override void TouchesEnded(NSSet touches, UIEvent evt)
            {
                base.TouchesEnded(touches, evt);
                // TouchEnd
            }
        }
    }
    
    1. Consider Using SkiaSharp: If your project uses or plans to use SkiaSharp for graphics, it also provides detailed touch event handlers.

    Perhaps it wont help directly but hopefully put you on the right track. I hope it helps.