为什么 SkiaSharp Touch SKTouchAction.Moved 事件不起作用?

Why does SkiaSharp Touch SKTouchAction.Moved event not work?

总结

从未使用 SKTouchAction.Moved 的 ActionType 引发 Touch 事件,但引发了 SKTouchAction.Pressed。为什么 .Moved 事件永远不会引发?

详情

我正在尝试在 SkiaSharp 中创建一个滑块。当用户触摸滑块或拖动时,此控件将需要更新 thumb(可移动的小圆圈)。这是托管在 Xamarin Forms 应用程序中,我创建了一个 SKCanvasView 来绘制滑块并响应触摸事件。

我已经成功响应了触摸事件,所以我知道 SKCanvasView 正在接收一些 UI 事件,但是 SKTouchAction.Moved 从未被触发。

示例代码

private SKCanvasView CreateSliderControl()
{
    var control = new SKCanvasView();
    control.PaintSurface += HandlePaintHeightControl;
    control.EnableTouchEvents = true;
    control.Touch += (sender, args) =>
    {
        var pt = args.Location;

        switch (args.ActionType)
        {
            case SKTouchAction.Pressed:
                // 1. This code gets hit whenever I touch the canvas
                control.InvalidateSurface();
                break;
            case SKTouchAction.Moved:
                // 2. This code never gets hit, even if I push, touch, slide, etc
                control.InvalidateSurface();
                break;
        }
    };
    control.InputTransparent = false;

    return control;
}

如上所示 #1 被击中(我可以在那里放置一个断点,并且我的控制面无效)。 #2 永远不会被击中,但我希望当我在控件上滑动手指时它会被击中。

我尝试过的

在 SkiaSharp 的 Github 上找到 similar issue

尝试通过将事件参数中的 Handled 属性 设置为 true 来告诉 OS 您想要 "continue receiving touch events"。

private SKCanvasView CreateSliderControl()
{
    var control = new SKCanvasView();
    control.PaintSurface += HandlePaintHeightControl;
    control.EnableTouchEvents = true;
    control.Touch += (sender, args) =>
    {
        var pt = args.Location;

        switch (args.ActionType)
        {
            case SKTouchAction.Pressed:
                control.InvalidateSurface();
                break;
            case SKTouchAction.Moved:
                control.InvalidateSurface();
                break;
        }
        // Let the OS know that we want to receive more touch events
        args.Handled = true;
    };
    control.InputTransparent = false;

    return control;
}