猿问

MR.Gestures - 自定义视图

我有一个绘制一些图形的 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; }

我不确定这是否是要走的路,但它看起来是一个很好的起点,但现在我被卡住了,不知道如何走得更远。有没有人做过类似的事情或知道解决方案?



慕仙森
浏览 183回答 1
1回答

忽然笑

请查看Microsoft 关于 SkiaSharp 的触控操作文章。它使用一个 Effect 来支持触摸操作,更多关于效果的细节在这里:Invoking Events from Effects基本上,您需要在添加 CanvasView 的容器中添加一个 TouchEffect(或者甚至将效果添加到您的 CanvasView,上面链接的文章中有一个这样的示例):<Grid BackgroundColor="White" Grid.Row="1">&nbsp; &nbsp; <skia:SKCanvasView x:Name="canvasView" PaintSurface="OnCanvasViewPaintSurface" />&nbsp; &nbsp; <Grid.Effects>&nbsp; &nbsp; &nbsp; &nbsp; <tt:TouchEffect Capture="True" TouchAction="OnTouchEffectAction" />&nbsp; &nbsp; </Grid.Effects></Grid>然后为 TouchAction 事件添加一个处理程序,如下所示。您需要先将触摸点转换为像素,然后检查是否void OnTouchEffectAction(object sender, TouchActionEventArgs args){&nbsp; &nbsp; &nbsp; &nbsp; if (args.Type != TouchActionType.Pressed)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; var pointLocation = args.Location;&nbsp; &nbsp; &nbsp; &nbsp; var point =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new SKPoint((float)(canvasView.CanvasSize.Width * pointLocation.X / canvasView.Width),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (float)(canvasView.CanvasSize.Height * pointLocation.Y / canvasView.Height));&nbsp; &nbsp; &nbsp; &nbsp; // TODO: Handle your touch here}
随时随地看视频慕课网APP
我要回答