source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Platform/Tizen/SKTouchHandler.cs (65 lines of code) (raw):
#nullable enable
using System;
using Tizen.NUI;
using NView = Tizen.NUI.BaseComponents.View;
namespace SkiaSharp.Views.Maui.Platform
{
internal class SKTouchHandler
{
private Action<SKTouchEventArgs>? onTouchAction;
private Func<double, double, SKPoint>? scalePixels;
private bool touchEnabled;
private int currentId = 0;
public SKTouchHandler(Action<SKTouchEventArgs> onTouchAction, Func<double, double, SKPoint> scalePixels)
{
this.onTouchAction = onTouchAction;
this.scalePixels = scalePixels;
}
public void SetEnabled(NView view, bool enableTouchEvents)
{
if (view != null)
{
if (touchEnabled != enableTouchEvents)
{
if (enableTouchEvents)
{
view.TouchEvent += OnTouchEvent;
}
else
{
view.TouchEvent -= OnTouchEvent;
}
touchEnabled = enableTouchEvents;
}
}
}
bool OnTouchEvent(object source, NView.TouchEventArgs e)
{
var pos = e.Touch.GetLocalPosition(0);
var action = ToTouchAction(e.Touch.GetState(0));
if (action == SKTouchAction.Pressed)
{
currentId++;
}
var coords = scalePixels?.Invoke(pos.X, pos.Y) ?? new SKPoint(pos.X, pos.Y);
var inContact = (action == SKTouchAction.Pressed || action == SKTouchAction.Moved) ? true : false;
onTouchAction?.Invoke(new SKTouchEventArgs(currentId, action, coords, inContact));
return true;
}
public void Detach(NView view)
{
// clean the view
SetEnabled(view, false);
// remove references
onTouchAction = null;
scalePixels = null;
}
private static SKTouchAction ToTouchAction(PointStateType state) => state switch
{
PointStateType.Down => SKTouchAction.Pressed,
PointStateType.Up => SKTouchAction.Released,
PointStateType.Motion => SKTouchAction.Moved,
PointStateType.Leave => SKTouchAction.Exited,
PointStateType.Interrupted => SKTouchAction.Cancelled,
_ => SKTouchAction.Cancelled,
};
}
}