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. 将程序添加到右键菜单和图标(以记事本、UltraEdit为例)

    原文:将程序添加到右键菜单(以记事本.UltraEdit为例) 如何将程序加入右键菜单,这里分别以记事本.UltraEdit为例! 以记事本程序为例: 1. 在运行中输入regedit,打开注册表,找 ...

  2. 微信公众平台接口,asp.net实现

    原文:微信公众平台接口,asp.net实现 我为自己的笑话网开发了一个微信公众平台的接口,在这里分享给大家,希望能对朋友们有帮助,如果有什么地方写的不好,好请大家指点! 首先是要进行认证,认证的时候, ...

  3. 初识EPC

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

  4. hibernate的orphanRemoval

    在@OneToMany与@OneToOne中使用orphanRemoval = true时候 改动保存时候setXXX org.springframework.orm.hibernate3.Hiber ...

  5. Net Framework中的提供的常用委托类型

    .Net Framework中的提供的常用委托类型   .Net Framework中提供有一些常用的预定义委托:Action.Func.Predicate.用到委托的时候建议尽量使用这些委托类型,而 ...

  6. appium之java API(2)

    TouchAction AppiumDriver的辅助类,主要针对手势操作,比方滑动.长按.拖动等.TouchAction的原理是讲一系列的动作放在一个链条中,然后将该链条传递给server.serv ...

  7. Django查询的琐碎记录

    我的需求是这样的,获取指定用户的获“赞”总数. 用户 models.py class UserProfile(models.Model): user = models.OneToOneField(Us ...

  8. SqlServer-COMPUTE BY

    原文:SqlServer-COMPUTE BY COMPUTE BY子句可以通过同一个select语句即查看明细行,又查看汇总行.可以计算子组的汇总值,也可以计算整个结果集的汇总值 COMPUTE 子 ...

  9. Tomcat7.0更改默认的路径来访问自己的项目

    如何使自己的项目没有输入:localhost:8080/项目名称/index.html 能够访问. 步骤,如下面的 : 找到tomcat ---  config----server.xml 选中右键编 ...

  10. WIN7远程桌面重启、关机

    在使用远程桌面访问Win7系统时会发现一个小问题,在xp远程桌面中存在的重启和关机菜单在win7远程桌面中不见了,如图: 这也给我们的使用带来了一些小小的麻烦,但实际上微软依然保留了命令行的方式来实现 ...