为什么SkiaSharp中的SKTouchAction.Moved事件无法正常工作?

4

摘要

Touch事件永远不会使用SKTouchAction.Moved ActionType触发,但会触发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从未被触发,但是我希望当我在控件上滑动手指时它会被触发。

我尝试过的方法


2
也许相关?https://github.com/mono/SkiaSharp/issues/334 - Jason
1
顺便提一下,TouchEffect在不同的示例中,链接在https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/effects/touch-tracking上。 - Conceptdev
1个回答

14

在SkiaSharp的Github上发现了一个类似的问题

尝试通过将事件参数中的Handled属性设置为true,告诉操作系统您想要“继续接收触摸事件”。

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接