MR.Gestures - Пользовательский вид - PullRequest
0 голосов
/ 13 сентября 2018

У меня SKCanvasView, который рисует некоторую графику, и теперь есть необходимость получить позицию нажатия. Прочитав несколько постов, я решил реализовать это через MR.Gestures. Поскольку внутри пакета нет стандартной реализации SKCanvasView, мне нужно было бы реализовать ее самостоятельно.

Мое предположение было наследовать от IGestureAwareControl

public class AudioWaveView : SKCanvasView, IGestureAwareControl

Для этого нужно реализовать несколько событий и команду:

    public GestureHandler GestureHandler { get; }
    public ICommand DownCommand { get; set; }
    public object DownCommandParameter { get; set; }
    public ICommand UpCommand { get; set; }
    public object UpCommandParameter { get; set; }
    public ICommand TappingCommand { get; set; }
    public object TappingCommandParameter { get; set; }
    public ICommand TappedCommand { get; set; }
    public object TappedCommandParameter { get; set; }
    public ICommand DoubleTappedCommand { get; set; }
    public object DoubleTappedCommandParameter { get; set; }
    public ICommand LongPressingCommand { get; set; }
    public object LongPressingCommandParameter { get; set; }
    public ICommand LongPressedCommand { get; set; }
    public object LongPressedCommandParameter { get; set; }
    public ICommand PinchingCommand { get; set; }
    public object PinchingCommandParameter { get; set; }
    public ICommand PinchedCommand { get; set; }
    public object PinchedCommandParameter { get; set; }
    public ICommand PanningCommand { get; set; }
    public object PanningCommandParameter { get; set; }
    public ICommand PannedCommand { get; set; }
    public object PannedCommandParameter { get; set; }
    public ICommand SwipedCommand { get; set; }
    public object SwipedCommandParameter { get; set; }
    public ICommand RotatingCommand { get; set; }
    public object RotatingCommandParameter { get; set; }
    public ICommand RotatedCommand { get; set; }
    public object RotatedCommandParameter { get; set; }
    public event EventHandler<DownUpEventArgs> Down;
    public event EventHandler<DownUpEventArgs> Up;
    public event EventHandler<TapEventArgs> Tapping;
    public event EventHandler<TapEventArgs> Tapped;
    public event EventHandler<TapEventArgs> DoubleTapped;
    public event EventHandler<LongPressEventArgs> LongPressing;
    public event EventHandler<LongPressEventArgs> LongPressed;
    public event EventHandler<PinchEventArgs> Pinching;
    public event EventHandler<PinchEventArgs> Pinched;
    public event EventHandler<PanEventArgs> Panning;
    public event EventHandler<PanEventArgs> Panned;
    public event EventHandler<SwipeEventArgs> Swiped;
    public event EventHandler<RotateEventArgs> Rotating;
    public event EventHandler<RotateEventArgs> Rotated;

Я не уверен, стоит ли идти этим путем, но это выглядит как хорошая отправная точка, но теперь я застрял и не знаю, как идти дальше. Кто-нибудь делал такую ​​похожую вещь или знает решение?

Большое спасибо

1 Ответ

0 голосов
/ 13 сентября 2018

Пожалуйста, ознакомьтесь с статьей Microsoft Touch Manipulations, касающейся SkiaSharp . Он использует эффект для поддержки сенсорных операций, подробнее об эффектах здесь: Вызов событий из эффектов

По сути, вам нужно добавить TouchEffect в контейнер, в который добавлен ваш CanvasView (или даже добавить эффект к вашему CanvasView, например, в приведенной выше статье есть пример):

<Grid BackgroundColor="White" Grid.Row="1">
    <skia:SKCanvasView x:Name="canvasView" PaintSurface="OnCanvasViewPaintSurface" />
    <Grid.Effects>
        <tt:TouchEffect Capture="True" TouchAction="OnTouchEffectAction" />
    </Grid.Effects>
</Grid>

А затем добавьте обработчик для события TouchAction, как показано ниже. Вам нужно сначала преобразовать точку касания в пиксели, а затем проверить, если

void OnTouchEffectAction(object sender, TouchActionEventArgs args)
{
        if (args.Type != TouchActionType.Pressed)
        {
            return;
        }

        var pointLocation = args.Location;
        var point =
            new SKPoint((float)(canvasView.CanvasSize.Width * pointLocation.X / canvasView.Width),
                        (float)(canvasView.CanvasSize.Height * pointLocation.Y / canvasView.Height));

        // TODO: Handle your touch here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...