写在前面的话:
从WP8.0开发转至Windows10开发还是需要花费一些时间的,虽然成本不大,但还是有。尤其是Xaml,虽然都是标记语言,但是框架结构已经从从Silverlight 转至 WinRT了,微软尽可能地保持了大部分的命名空间相同,但是有些控件的逻辑、状态、方法都发生了变化。今天会就在工作中遇到的手势问题做个初步的认识。
再吐槽一下,前两天听安卓组的分享,也是关于手势的,分享者从设备句柄、中断、android的epool模式,最后到framework,从底层到上层,android最新版本如何做了优化使现有的触摸响应那么快,那叫一个酣畅淋漓,面对不那么开放的Windows,我们就只能在上层看着它的API呵呵了。
言归正传
WP的手势开发与Win10手势开发都有一个共同点:分高级触摸手势、中级触摸手势、低级触摸手势。低级手势并不是说很低级,而是指它比较底层,可以获取比较底层的数据,然后自己根据这些数据组合出你需要的手势。
Windows Phone
WP的低级触摸:TouchFrame类,光看名字就知道他是跟触摸相关的,该类包含一个静态的Event:Touched,注册了该事件,在处理方法中,可以获取触摸点的相关信息,在项目中,需要比较跟手的操作,例如裁剪框,是使用这种方法
WP的中级触摸:Mainpulation类,该类有Started,Delta,Completed事件,因为Delta的触发时机不是那么准确,或者说,Delta事件有可能在你移动了一个像素时出发,也有可能在你移动了5个像素时触发,所以,该类事件就适用于不是那么精确的情况,我们在上滑显示个什么东西,下滑显示个什么动画时,或者滑动的速率超过某个阈值出发某个动画时使用该类触摸事件。
WP的高级触摸:Tapped,Clicked,MouseLeftDown等事件,该类事件我猜测是使用了TouchFrame或者Manipulation的Starte和Completed事件模拟出来的,所以,你如果有个自己的自定义控件,完全可以模拟出一个Clicked事件,不需要关心中间的过程,只是按下和离开时的反应,该类事件用的比较多,比如按钮的按下,Textblock的Tapped事件。
Windows 10
Win10的低级触摸: Manipulation类,多了很多东西,包含Starting, Started, Delta,Completed,还有跟惯性相关的事件,具体的东西,下章继续。给我的感觉,这个类还不是那么底层,因为Manipulation事件中暴露出来的参数都是封装好的,而我不能从这些事件中获取触摸点相关的信息,比如:当前有几个触摸点。为了寻找有几个触摸点还得用另外一种方案。总之,这个win10上的低级触摸的概念应该就是暴露了几个阶段,对比其他等级的触摸,你可以在这几个阶段中做不同的事情。
补充:从MSDN上面看到这段话,你可以使用这些事件使用户能够在屏幕上拖动元素,以及提供真实的惯性效果。各种事件参数类除了提供常见属性(如 PointerDeviceType、Handled 和 OriginalSource)的详细信息之外,还提供了有关指针位置、更改、速度的详细信息。<strong>即,越底层的操作事件,能提供的信息越多。</strong>
Win10的中级触摸:PointPointer类,这个类还是有点用处的,而且这个类提供了很多事件,包括PointerPressed,PointerMoved,PointerExit事件,根据等级的划分,这一层封装了一些类似于低级事件的Started和Delta事件从而形成自己的事件。
Win10的高级触摸:Tapped,Clicked事件,这类与WP类似,没有什么不一样。
另外,Win10提供了一个ManipulationMode的东西,默认值是System,如果你不指定它的值,那么它会使用系统自己的处理模式来处理手势。如果你想要自己控制手势,必须将该值设置为非None和非System值,并且你可以使用组合,限制只能有哪些类型的手势操作。
总结:
1. Win10的手势提供了更多的灵活度,比如说,可以限制只在X轴移动,Y轴被限制,不能缩放等,这些在WP8中只能在代码中自己判断,那个逻辑真是想起来就“呵呵”
2. Win10的手势多很很多内建的特性,比如说惯性,在WP8中你也只能在代码中得到速率,并且使用动画模拟惯性,那也只能“呵呵”
3. Win10的手势在手机上的表现还不是很好,估计还只是Preview版本,在PC上表现尚可
留个问题,这也是我最近遇到的问题,找了好久终于找到答案:
如何在Win10 的手势开始时判断是单点触摸还是多点触摸?