Windows Store 手势编程小结

最近完成了一个Windows Store上面的手势操作的页面。在这里总结了一下经验和心得,希望能和大家一起分享和讨论一下。

首先,要纠正一个误区,在Windows Store里面,手势和鼠标的操作事件是不区分的。比如简单的手指滑动事件,正常的写法还是在PointerPressed, PointerPressed和PointerReleased里面去处理。大家可能认为,手势的事件应该在,ManipulationStarted和ManipulationDelta等事件里面去处理。但是如果我们在Manipulation事件里面处理了,Pointer的事件依然会被触发,而且我们也并不能通过这样的方式区分是鼠标,还是手势触发了这个事件。

文档上是这样说的,Tapped,Pointer和Manipulation,是三个级别的输入相应事件。Tapped 最高,Pointer是中间,Manipulation是底层。如果高级别的事件被触发,底层的事件也会被触发,反之则不然。所以,如果能在高层处理的事件,尽量在高层处理,否则底层会写的很复杂。比如手指滑动的事件,应该在Pointer层面上解决,他比Manipulation的层次高。

Windows Store 列举了一些常用的手势。

Tap

一个手指的点击

Press and hold

一个手指点击并长按

Slide

一个或多个手指向同一方向滑动

Swipe

一个或多个手指向同一方向短距离滑动

Pinch

两个以上手指聚拢

Rotate

两个以上手指旋转

Stretch

两个以上手指分散

Tapped 的事件是最高级的,但是要在UIElement里面声明才能用相应的事件。比如 Tapped, DoubleTapped,RightTapped, 和Holding 对应的就是 IsTapEnabled,IsDoubleTapEnabled, IsRightTapEnabled, 和 IsHoldingEnabled。

Pointer的层面就可以处理类似于Slide或者Swipe之类的手势,但是这样的手势没有对应的事件,我们只能在Pointer里面处理,Pointer里面可以提供多点触摸的支持。我们可以通过

PointerRoutedEventArgs. GetCurrentPoint 函数获取PointerPoint,这个函数的坐标系选取可以根据传入的Element来确定。在这个类里面,我们可以用PointerId去区分不同手指的操作。PointerDevice可以帮我们区别鼠标和手势。

另外,在SelectionStates的VisualStateGroup里面,可以处理SelectedSwiping事件,这是在ListViewItem的template里面的,请参考http://msdn.microsoft.com/en-us/library/windows/apps/jj709921.aspx

Manipulation是最低层,他可以处理旋转,缩放,还有速度,这里我就不详细说明了,大家可以参考

http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.input.manipulationdeltaroutedeventargs.aspx

和这个例程

http://code.msdn.microsoft.com/windowsapps/Input-XAML-user-input-e61c8054

Tips 1:

我这次做的是播放器的页面,只是处理手指移动的事件,但在做的过程中,我发现区别鼠标和手势还是很麻烦的一件事情。我们可以通过Windows.Devices.Input.PointerDevice.GetPointerDevices API 去获得这个设备有哪些输入设备,但是我们不能确定用户当前使用的是鼠标或者是触摸的设备。

我的做法就是在PointerPressed事件里面判断当前使用的设备,并且设置一个标示符,在PointerMoved 事件里面通过标示符来区分手势和鼠标的操作。手势可以在播放器里面直接控制进度和音量,但是鼠标的移动事件并不需要这样。

Tip 2:

关于延时隐藏的问题,一开始我是用动画做的,但是后来发现,动画做完之后那个属性被锁定了。再去操作就很难,后来就改用ThreadPoolTimer,起一个UI线程来修改的。我之前的同事是用DispatcherTimer 去做的,我觉得这个做法需要timer.start和timer.stop函数去辅助,有些繁琐。

Tip 3:

Image 控件有个bug 就是用代码修改Image.Source 会失效,尤其是快速的切换这个Source。之前我做过一个用很多图片切换,形成一个动画的效果。这个实现的思路类似于双缓冲,通过设置Visibility来切换前后的Image,把后面的Image的Source修改,然后呈现到前端,再把前端的Image切换到后面换Source,这样的做法效果还不错。但是如果图片没有那么多,我们直接在一个Grid里面放所有的Image 然后修改Visibility好了。

 
 
 

Windows Store 手势编程小结的更多相关文章

  1. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  2. WCF 与 Windows Store Client App

    首先复习下WCF: WCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信.使得Developers和Architect在构建分布式系统中,无需在考虑如何去实现 ...

  3. GDI+编程小结

    GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...

  4. 微软通过.NET Native为Windows Store应用提速

    .NET Native是微软的一次尝试,旨在降低Windows Store应用的启动时间和内存占用. 自从去年11月份,有人发现Windows Store应用的启动速度有了大幅提高后,对该项目的猜测就 ...

  5. Windows store app[Part 4]:深入WinRT的异步机制

    接上篇Windows store app[Part 3]:认识WinRT的异步机制 WinRT异步机制回顾: IAsyncInfo接口:WinRT下异步功能的核心,该接口提供所有异步操作的基本功能,如 ...

  6. Windows store app[Part 3]:认识WinRT的异步机制

    WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...

  7. Windows下串口编程

     造冰箱的大熊猫@cnblogs 2019/1/27 将Windows下串口编程相关信息进行下简单小结,以备后用. 1.打开串口 打开串口使用CreateFile()函数.以打开COM6为例: HAN ...

  8. 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)

    这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...

  9. kiosk-mode,免密码登陆, sideload Windows Store apps 等

    MVVM带来的性能问题及其解决方案  MVVM 和语言性能提示:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/mt628050. ...

随机推荐

  1. 图数据库 Titan 高速入门

    尤其在互联网世界,图计算越来越受到人们的关注,而图计算相关的软件也越来越丰富.本文将高速展示 Titan这个open source 的图数据库. 注:本文的操作主要基于Titan 官方的两篇文档: - ...

  2. Facebook HHVM 和 Hack 手册 --- 2. HHVM能做什么

    HHWM简介: HHWM(HipHop VM) 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点. ...

  3. 初识EPC

    一.EPC定义 EPC=Event-driven Process Chain(事件驱动过程链) EPC建模方法最初由Keller, N¨uttgens和Scheer博士在1992年发表的Ereigni ...

  4. 浅谈javascript性能-管理内存

    上次说到,javascript脚本到底应该放在哪里?用什么用处? 以下2点: 在Html.Body部分中的JS会在页面加载的时候执行.即-用户触发一个事件的时候执行的脚本.eg:onload事件... ...

  5. iOS--Swift开发中的单例设计模式

    最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...

  6. HTML5实现涂鸦板

    原文:HTML5实现涂鸦板 最近闲的,看了看html5,强大的绘图功能让我惊奇,于是,写了个小玩意---涂鸦板,能实现功能有:画画,改色,调整画笔大小 html5的绘图可以分为点,线,面,圆,图片等, ...

  7. Backup and Recovery Strategies1

    2.1.Data Recovery Strategy Determines Backup Strategy 在设计备份策略.如若数据恢复需求和数据恢复战略启动.每种类型的数据恢复需要你采取相应的备份类 ...

  8. iPhone、iPad、iPadMini界面设计标准

    一个:iPhone 4.0' Display: iPhone 5.iPhone 5S.iPhone 5C. 解析度:1136 * 960 设计标准參照下图iPhone5 3.5' Display:   ...

  9. Plugin For KanColleViewer – Provissy Tools V1.0

    これはKanColleViewerためのプラグインです,KanColleViewerの機能を拡張する. #介绍 / Introduction / 紹介这是一个KanColleViewer(俗称”提督很 ...

  10. 通过js实现在页面中添加音乐

    代码如下!兼容IE // JavaScript Document function autoPlay(){//自动播放 var myAuto = document.getElementById('my ...