代码之家  ›  专栏  ›  技术社区  ›  DirtyNative

手势先生-自定义视图

  •  0
  • DirtyNative  · 技术社区  · 8 年前

    我有一个SKCanvasView绘制一些图形,现在有一个需要得到水龙头的位置。在阅读了几篇文章之后,我决定通过手势先生. 因为包中没有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 回复  |  直到 8 年前
        1
  •  1
  •   Michał Å»ołnieruk    8 年前

    Microsoft's Touch Manipulations article regarding SkiaSharp . 它使用效果来支持触摸操作,有关效果的更多详细信息,请参见: Invoking Events from Effects

    基本上,您需要将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
    }