在 .NET MAUI 中实现 TouchTracking

Mr *_*ery 3 c# xamarin.forms skiasharp maui .net-6.0

我一直致力于将我们的应用程序从 Xamarin.Forms 迁移到 .NET MAUI。我们的应用程序几乎没有绘图功能,用户可以用手指进行绘图。我们在 Xamarin.Forms 中使用TouchTrackingnuget 包,但它与 .NET MAUI 不兼容。

以下是TouchTracking我们经常使用的软件包中的一些 API:

绘制页面.xaml

<Grid BackgroundColor="White">
   <skia:SKCanvasView x:Name="canvasView" PaintSurface="PaintingCanvasEnvent" />

   <Grid.Effects>
      <tt1:TouchEffect Capture="True" TouchAction="OnTouchEffectAction"/>
   </Grid.Effects>
</Grid>
Run Code Online (Sandbox Code Playgroud)

DrawPage.cs

void OnTouchEffectAction(object sender, TouchActionEventArgs args)
{
    SKPoint current = args.Location;
    
    switch (args.Type)
    {
        case TouchActionType.Pressed:
            //codes here ...
            break;

        case TouchActionType.Moved:
            //codes here
            break;

        case TouchActionType.Released:
            //codes here
            break;

        case TouchActionType.Cancelled:
            //codes here
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

在Xamarin.Forms中,该TouchTracking包允许我们检测触摸事件,并且我们可以获得所有触摸ID(因为TouchTracking可以检测多个手指)及其坐标。

那么我如何实现TouchTrackingnuget包或某种可以实现上述要求的代码呢?

Fre*_*Ali 7

您需要的所有元素可能都在那里,您可能需要的大多数代码只需要从 XF 到 MAUI 的命名空间更改

所以基本上 TouchEvent 来自这里:https://github.com/OndrejKunc/SkiaScene/tree/master/source/TouchTracking/TouchTracking

namespace TouchTracking.Forms
{
    public class TouchEffect : RoutingEffect
    {
        public event TouchActionEventHandler TouchAction;

        public TouchEffect() : base("TouchTracking.TouchEffect")
        {
        }

        public bool Capture { set; get; }

        public void OnTouchAction(object element, TouchActionEventArgs args)
        {
            TouchAction?.Invoke(element, args);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的本机平台中:

[assembly: ResolutionGroupName("TouchTracking")]
[assembly: ExportEffect(typeof(TouchTracking.Forms.Droid.TouchEffect), "TouchEffect")]
namespace TouchTracking.Forms.Droid
{
    public class TouchEffect : PlatformEffect
    {
        private TouchHandler _touchHandler;
        private Android.Views.View _view;
        private TouchTracking.Forms.TouchEffect _touchEffect;

        protected override void OnAttached()
        {
            _view = Control == null ? Container : Control;

            // Get access to the TouchEffect class in the PCL
            _touchEffect =
                (TouchTracking.Forms.TouchEffect)Element.Effects.FirstOrDefault(e => e is TouchTracking.Forms.TouchEffect);

            if (_touchEffect == null)
            {
                return;
            }

            _touchHandler = new TouchHandler();
            _touchHandler.TouchAction += TouchHandlerOnTouch;
            _touchHandler.Capture = _touchEffect.Capture;
            _touchHandler.RegisterEvents(_view);

        }

        private void TouchHandlerOnTouch(object sender, TouchActionEventArgs args)
        {
            _touchEffect.OnTouchAction(sender, args);
        }

        protected override void OnDetached()
        {
            if (_touchHandler == null)
            {
                return;
            }
            _touchHandler.TouchAction -= TouchHandlerOnTouch;
            _touchHandler.UnregisterEvents(_view);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

整个源代码在这里:https://github.com/OndrejKunc/SkiaScene/tree/master/source/TouchTracking

更新

由于我对 TouchTracking 的使用太多,我决定自己将其移植到毛伊岛,结账:https: //github.com/FreakyAli/Maui.FreakyEffects