zoukankan      html  css  js  c++  java
  • 2019-7-15-win10-uwp-在笔迹开始书写拿到书写移动事件

    title author date CreateTime categories
    win10 uwp 在笔迹开始书写拿到书写移动事件
    lindexi
    2019-7-15 8:58:5 +0800
    2019-05-22 10:42:22 +0800
    Win10 UWP

    在使用 InkCanvas 的过程,无法直接通过 Pointer 消息拿到书写移动,需要使用 StrokeInput 才能获取到

    在 InkCanvas.InkPresenter.StrokeInput 提供了 StrokeStartedStrokeContinuedStrokeEnded 这些看名字就知道是干什么用的事件,通过这些事件可以在书写的过程拿到触摸事件或鼠标事件

    使用 StrokeContinued 作为例子,先在 XAML 界面放一个 InkCanvas 控件,同时修改他的属性名是 InkCanvas 在后台代码可以这样写

                InkCanvas.InkPresenter.StrokeInput.StrokeContinued += StrokeContinued;
    

    拿到的StrokeContinued是PointerEventArgs可以拿到很多信息

            public void StrokeContinued(InkStrokeInput sender, PointerEventArgs args)
            {
               
            }

    在 Win10 的 Anniversary Update 1607 提供了 CoreWetStrokeUpdateSource 可以在湿笔迹的时候触发事件

    CoreWetStrokeUpdateSource 同样提供了开始书写和书写过程中的事件

    先通过 Create 方法创建 CoreWetStrokeUpdateSource 请看代码

     var coreWetStrokeUpdateSource = CoreWetStrokeUpdateSource.Create(inkCanvas.InkPresenter);

    这个事件有一点坑的是有加入的时机问题,请确保在所有的 InkCanvas 包括他的容器都 Loaded 完成之后才可以使用这个事件,不然是不会有触发的

    通过 coreWetStrokeUpdateSource 可以拿到触摸按下和移动等事件

    coreWetStrokeUpdateSource.WetStrokeStarting += CoreWetStrokeUpdateSource_WetStrokeStarting;
    coreWetStrokeUpdateSource.WetStrokeContinuing += CoreWetStrokeUpdateSource_WetStrokeContinuing;
    coreWetStrokeUpdateSource.WetStrokeStopping += CoreWetStrokeUpdateSource_WetStrokeStopping;
    coreWetStrokeUpdateSource.WetStrokeCompleted += CoreWetStrokeUpdateSource_WetStrokeCompleted;

    我在这些事件里面做输出,这样可以知道在多指触摸下的事件是如何触发的

            private void CoreWetStrokeUpdateSource_WetStrokeCompleted(CoreWetStrokeUpdateSource sender,
                CoreWetStrokeUpdateEventArgs args)
            {
                Debug.WriteLine($"CoreWetStrokeUpdateSource_WetStrokeCompleted{args.PointerId}");
            }
    
            private void CoreWetStrokeUpdateSource_WetStrokeStopping(CoreWetStrokeUpdateSource sender,
                CoreWetStrokeUpdateEventArgs args)
            {
                Debug.WriteLine($"WetStrokeStopping{args.PointerId}");
            }
    
            private void CoreWetStrokeUpdateSource_WetStrokeContinuing(CoreWetStrokeUpdateSource sender,
                CoreWetStrokeUpdateEventArgs args)
            {
                Debug.WriteLine($"CoreWetStrokeUpdateSource_WetStrokeContinuing {args.PointerId}");
            }
    
            private void CoreWetStrokeUpdateSource_WetStrokeStarting(CoreWetStrokeUpdateSource sender,
                CoreWetStrokeUpdateEventArgs args)
            {
                Debug.WriteLine($"CoreWetStrokeUpdateSource_WetStrokeStarting{args.PointerId}");
            }

    运行代码可以看到下面的输出

    CoreWetStrokeUpdateSource_WetStrokeStarting 1
    CoreWetStrokeUpdateSource_WetStrokeContinuing 1
    CoreWetStrokeUpdateSource_WetStrokeContinuing 1
    ……
    CoreWetStrokeUpdateSource_WetStrokeStarting 2
    CoreWetStrokeUpdateSource_WetStrokeStarting 3
    CoreWetStrokeUpdateSource_WetStrokeContinuing 1
    CoreWetStrokeUpdateSource_WetStrokeContinuing 2
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    CoreWetStrokeUpdateSource_WetStrokeContinuing 1
    CoreWetStrokeUpdateSource_WetStrokeContinuing 2
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    CoreWetStrokeUpdateSource_WetStrokeContinuing 1
    CoreWetStrokeUpdateSource_WetStrokeContinuing 2
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    CoreWetStrokeUpdateSource_WetStrokeContinuing 1
    CoreWetStrokeUpdateSource_WetStrokeContinuing 2
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    ……
    
    CoreWetStrokeUpdateSource_WetStrokeCompleted  1
    CoreWetStrokeUpdateSource_WetStrokeContinuing 2
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    CoreWetStrokeUpdateSource_WetStrokeContinuing 2
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    CoreWetStrokeUpdateSource_WetStrokeCompleted2
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    CoreWetStrokeUpdateSource_WetStrokeContinuing 3
    CoreWetStrokeUpdateSource_WetStrokeCompleted  3

    可以从输出看到在多指触摸的时候,对每个手指都会触发一次完整的 Starting-Continuing-Completed 事件

    那么 CoreWetStrokeUpdateSource 和 StrokeContinued 的区别在哪?就是在于触发的先后问题,在笔迹开始书写之前先触发 CoreWetStrokeUpdateSource 事件,然后在书写完成之后触发 StrokeContinued 事件,我同时输出 WetStrokeContinuing 和 StrokeContinued 事件,请看下面

    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    StrokeContinued
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    StrokeContinued
    StrokeContinued
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    StrokeContinued
    StrokeContinued
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    StrokeContinued
    StrokeContinued
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    CoreWetStrokeUpdateSource_WetStrokeContinuing 9
    StrokeContinued
    StrokeContinued

    可以看到 WetStrokeContinuing 的输出时机和频率都会比 StrokeContinued 更高

    另外推荐开放的是 StrokeContinued 的事件,因为在使用 UWP 笔迹就是为了做高性能的笔,在 WetStrokeContinuing 的事件里面如果添加了业务代码,那么将会影响笔迹的书写速度

    在 UWP 的笔迹书写过程,需要等待 WetStrokeContinuing 事件完成之后才能进行笔迹渲染,而调用 StrokeContinued 事件是在笔迹书写完成之后调用同时不对这个事件做任何的等待

    在框架里面建议开放的是 StrokeContinued 触发的事件,减少有逗比开发者在事件里面写了不清真代码降低了笔迹的性能

    背水一战 Windows 10 (61) - 控件(媒体类): InkCanvas 涂鸦编辑 - webabcd - 博客园

    InkStrokeInput Class (Windows.UI.Input.Inking) - Windows UWP applications

    win10 uwp 通过 win2d 画出笔迹

    mtaulty/GraphPaperControl: Simple user control that uses Win2D to display a tiled grid design.

    Creating a Custom Ruler with DirectInk - Windows Developer Blog

    Windows-universal-samples/Samples/SimpleInk at master · microsoft/Windows-universal-samples

  • 相关阅读:
    2016.2.17文件夹选择框及文件选择框
    2016.1.22 利用LINQ实现DataSet内多张DataTable关联查询操作(目前未发现太大价值)
    2016.1.23 通过cmd在程序中执行sql脚本
    2016.1.19 DEV Express控件GirdControl使用
    2016.1.1 VS中宏的使用技巧点滴
    2015.12.24(圣诞节) 解决Oralce数据库将具有相同属性的多行合并为一行的简单方法多年想要wmsys.wm_concat
    2015.12.12 DataGridveiw中添加checkbox列
    2015.11.3 RichBox改变若干文本颜色
    2015.12.10 如何将一个工程彻底改名
    2015.9.2 文本框中获取当前位置的所在行和列
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085723.html
Copyright © 2011-2022 走看看