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里面声明才能用相应的事件。比如 TappedDoubleTapped,RightTapped, 和Holding 对应的就是 IsTapEnabled,IsDoubleTapEnabledIsRightTapEnabled, 和 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. 步步详解近期大火的density_peak超赞聚类

    近期忙着在公司捣腾基于SOA的应急框架,还是前两周才在微博上看见了density_peak,被圈内好些人转载. 由于这个算法的名字起的实在惹眼,都没好意思怎么把这个算法名字翻译成中文,当然更惹眼的是, ...

  2. MEF框架在Silverlight中应用(15)

    原文:MEF框架在Silverlight中应用(15) MEF框架在Silverlight中应用 代码下载 MEF框架是微软提供的一个插件框架.应用概括为一句话:输入,输出,组合.下面是具体在Silv ...

  3. 理解iOS软件开发框架

    iOS软件开发框架理解 这个东西是硬伤,框架?自带的mvc? 自带的UIViewController UIView UINavigationController 这些算不算?当然算的,cocoa框架嘛 ...

  4. MVC模型部分验证

    ASP.NET MVC模型部分验证 在很多情况下,我们为了代码的复用可能会存在ViewModel共用的情形.比方说,web应用中常常会遇到的一个需求就是用户找回密码的功能.用户首先要验证通过验证邮箱( ...

  5. 微信应用号开发知识贮备之Webpack实战

    天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生.作为行业内人士,我们很应该去拥抱这个趋势.这段时间在忙完工作之余准备储备一下这方面的知识点,以免将来被微信应用号的浪潮所淹没 ...

  6. SVN:One or more files are in a conflicted state

    解决代码冲突 如果commit时出现"You have to update your work copy first."红色警告,说明版本库中的此文件已经被其他人修改了. 请先点& ...

  7. CSS知识总结之浏览器(持续更新)

    web页面浏览器渲染过程 1.解析html文件,并构建DOM树: 在DOM树中,每一个html标签都有一个对应的节点,并且每一个文本也有一个对应 的节点(js的textNode),DOM树的根节点就是 ...

  8. C语言字符串操作函数集

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...

  9. svn外网访登录不进去提示证书错误Authorization Required

    为了外网能访问内网svn.于是坐在外网端口映射.但是奇怪的是内网能访问,外网总也登录不进去.以为是浏览器版本低 但是其他浏览器也一样.最后客户端也登录不进去.提示报错:  Authorization  ...

  10. HBase Maven 工程模块梳理

    HBase Maven 工程各个 Model 功能说明: github 地址:git://git.apache.org/hbase.git 版本:2.0.0-SNAPSHOT hbase-annota ...