Почему не работает событие SkiaSharp Touch SKTouchAction.Moved? - PullRequest
0 голосов
/ 18 марта 2019

Резюме

Событие Touch никогда не вызывается с ActionType SKTouchAction.Moved, но SKTouchAction.Pressed вызывается. Почему событие .Moved никогда не поднимается?

Деталь

Я пытаюсь создать слайдер в SkiaSharp. Этот элемент управления должен будет обновлять thumb (маленький подвижный круг), когда пользователь либо касается ползунка, либо перетаскивает. Он размещен в приложении Xamarin Forms, и я создал SKCanvasView для рисования ползунка и реагирования на сенсорные события.

Я успешно ответил на события касания, поэтому я знаю, что SKCanvasView получает некоторые события пользовательского интерфейса, но 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 1.60.3 до 1.68.0
  • Все безумные движения пальцев, которые я мог придумать
  • Прочитайте https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/graphics/skiasharp/transforms/touch, но он использует XAML для назначения эффекта (с которым я не знаком), и я не вижу класс TouchEffect, доступный где-либо в моем коде, чтобы добавить его в родительскую сетку это содержит мой SkiaCanvasView.

1 Ответ

1 голос
/ 18 марта 2019

Найдена похожая проблема на Github в SkiaSharp.

Попробуйте сообщить ОС, что вы хотите «продолжать получать сенсорные события», установив для свойства 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;
}
...