简介Windows Mobile 6.5 Gesture API

移动开发
在windows mobile 6.5中,微软终于添加进了对于Gesture(手势)的支持。同时,在Gesture的基础上,也具备了一些物理引擎的支持。在这个系列文章中,我将给大家介绍Windows Mobile 6.5的这一新特性。

所谓Gesture(手势)既用来描述用户使用手指或者触笔在控件上进行一个短的具有一定方向的移动操作。大多数的Gesture都是基于手指的落下和抬起(WM_LBUTTONDOWN & WM_LBUTTONUP)这个操作组合(当然双击的操作是个特例,它使用两次这个组合)。手势在这个手指的落下和抬起的操作组合之上加入了一些其他信息,例如方向,位置,角度等等。Windows Mobile支持如下的手势:Gesture描述

Tap 就像是鼠标的单击事件。

手指在特定的时间和距离间隔上落下和抬起后,应用程序会接收到一个GID_SELECT的Gesture消息。同时,有可能在WM_LBUTTONDOWN和GID_SELECT消息之间产生多个WM_MOUSEMOVE消息.

Double Tap 相当于鼠标的左键双击。

用户在特定的时间间隔和距离上进行双击操作,应用程序会获得GID_DOUBLESELECT消息。

Hold 用户可以按下并保持住。

用户按下并保持一定时间,同时手指在一个特定的距离范围内,应用程序将会收到GID_HOLD消息 。在手指抬起或者一个设定的时间间隔之后,将会伴随一个GID_END消息。

Flick 用户在屏幕上快速的滑动手指一段距离。

应用程序将会收到一个或者多个GID_PAN消息,然后是GID_SCROLL消息(手指抬起后),在最后 ,将收到GID_END消息。

Pan 用户按下并保持在屏幕上,然后拖动一顿距离。

应用程序将会收到一个或者多个GID_PAN消息。 当手指抬起后,将会收到一个GID_END消息。

在Hold之后也可以接着产生Pan的消息。

很遗憾,在这里我们没有看到多点触摸的支持。或许在不久的将来,在Windows Mobile 7中,我们期望能看到多点触摸的支持。

默认支持Gesture的控件

在上一小节中我们讲到了Windows Mobile 6.5已经支持的手势种类。那么如果我们要使用Gesture的话,哪些控件是支持手势的呢?主要有以下几种:

TabControl, Listbox, Listview, ComboBox, Treeview以及Webbrowser控件。

这六种控件是天然支持手势的,我们不需要编写一行的代码(WebBrowser控件除外),他们在必要的时候就可以自动支持手势。下面我附上的例子中,你可以看到,我用TabControl的tabPage来分别包含了一个Listbox, Listview, ComboBox和Treeview。然后给这些控件填充一些数据以便测试。您可以将该工程编译后分别部署到Windows Mobile 6以及Windows Mobile 6.5的真实设备/模拟器上(注意,该工程需要.NET Compact Framework 3.5的支持)。您会发现,同样的代码在Windows Mobile 6.5上已经天然支持手势了,不过在Windows Mobile 6.0上并不支持任何手势。

这里需要特别指出的是,对于WebBrowser控件来说,在.NET Compact Framework中无法直接支持手势。必须在C++中通过设定HS_NOSELECTION来建立DISPLAYCLASS。

GestureDemo1.zip(测试工程源代码) (31.51 kb)

下面是该工程在Windows Mobile 6.5上运行的状态:

使用Managed Gesture API

在前面我们提到了微软针对Windows Mobile的Gesture提供了5种不同的手势。他们分别是Tap, Double Tap, Hold, Flick, Pan。如果您使用C++来开发Windows Mobile 6.5上的应用程序,那么请参考MSDN上关于Windows Mobile上Gesture的参考文档 http://msdn.microsoft.com/en-us/library/ee220917.aspx。 如果您是使用托管代码,那么您可以使用由微软的两位工程师(Alex Yakhnin, Ron Buckton)所封装的针对托管代码的API(http://code.msdn.microsoft.com/gestureswm)。

在这套API中,分别针对这5种手势做了封装,不过名字略有改动:Tap改为Select; Double Tap改为DoubleSelect; Flick改为Scroll。 Hold和Pan没有改变。这套API的用法很简单,实例化一个他们封装好的手势识别器组件,然后给它指定要监控的对象。最后,加上针对这5种手势的事件处理函数即可。如下代码所示:

  1. private void InitGestureRecognizer() 
  2.  
  3.  
  4. gestureRecognizer1 = new GestureRecognizer(this.panel1); 
  5.  
  6. //You can also set the TargetControl property 
  7.  
  8. //gestureRecognizer1.TargetControl = this.panel1; 
  9.  
  10. gestureRecognizer1.Hold += new EventHandler(gestureRecognizer1_Hold); 
  11.  
  12. gestureRecognizer1.Select += new EventHandler(gestureRecognizer1_Select); 
  13.  
  14. gestureRecognizer1.DoubleSelect += new EventHandler(gestureRecognizer1_DoubleSelect); 
  15.  
  16. gestureRecognizer1.Pan += new EventHandler(gestureRecognizer1_Pan); 
  17.  
  18. gestureRecognizer1.Scroll += new EventHandler(gestureRecognizer1_Scroll); 
  19.  
  20.  
  21. void gestureRecognizer1_Scroll(object sender, GestureScrollEventArgs e) 
  22.  
  23.  
  24. label1.Text = e.Kind.ToString() + ": " + e.State + ", (" + e.X + ", " + e.Y + "), d=" + e.ScrollDirection + "a=" + e.Angle + "v=" + e.Velocity; 
  25.  
  26.  
  27. void gestureRecognizer1_Pan(object sender, GestureEventArgs e) 
  28.  
  29.  
  30. label1.Text = e.Kind.ToString() + ": " + e.State + ", (" + e.X + ", " + e.Y + ")"; 
  31.  
  32.  
  33. void gestureRecognizer1_DoubleSelect(object sender, GestureEventArgs e) 
  34.  
  35.  
  36. label1.Text = e.Kind.ToString() + ": " + e.State + ", (" + e.X + ", " + e.Y + ")"; 
  37.  
  38.  
  39. void gestureRecognizer1_Select(object sender, GestureEventArgs e) 
  40.  
  41.  
  42. label1.Text = e.Kind.ToString() + ": " + e.State + ", (" + e.X + ", " + e.Y + ")"; 
  43.  
  44.  
  45. void gestureRecognizer1_Hold(object sender, GestureEventArgs e) 
  46.  
  47.  
  48. label1.Text = e.Kind.ToString() + ": " + e.State + ", (" + e.X + ", " + e.Y + ")"; 
  49.  

该示例代码是在窗体上放了两个控件: Panel1用来捕获手势事件;label1用来显示当前手势的一些参数。 运行状况如下图所示:

 

 

最后一部分,是demo程序的源代码:GestureDemo2.zip (58.05 kb)

看到了吧,在Windows Mobile 6.5中,我们要给我们的程序加上手势的支持是如此的简单方便。好了,本小节就到这里,在下一节中我们将讨论手势和动画。

使用动画引擎

手势的意义

在前面我们学会了如何使用托管的Mobile Gesture API来捕获用户的手势:Tap, Double Tap, Hold, Flick, Pan.到这里就结束了么?没有,我们需要看到手势背后的意义。我们的程序应该通过这些通用的手势消息来判断用户的操作意图,来了解用户想要做什么事情,从而做出进一步的响应:

Tap:点击,即用户用手指敲击某一个控件。通常需要触发某一个操作(按钮类控件),或者是意味着在众多控件/内容中选中该控件。

Double Tap:双击,即用户快速的点击两次该控件。其实这是用户从PC时代带过来的一个操作,在电脑上我们经常会双击鼠标来打开某个文件夹或者选中某些内容等等。所以大家很自然的把它延伸到了Windows phone的操作习惯上。我们应该尽量减少用户的双击操作,而是用单次点击来代替。

Hold:即长时间的按在某个控件/内容上。例如用户在玩游戏的时候按住某个按钮,这表示某种持续性操作;而有时候长时间按住用户则希望系统能够给出一个上下文菜单。

Flick:即手指快速的滑动,通常用户做这个操作的时候是希望窗体上的内容按照滑动的方向进行滚动。同时,手指滑动的速度快慢则体现了用户希望该内容滑动滚动的速度快慢。

Pan:即手指按在屏幕上然后平移一段距离。通常这种操作的时候,用户是希望将当前屏幕上的内容按照手指的方向同步平移。这有点像电脑上鼠标的点击并拖拽的操作。

动画引擎

对于Tap,Double Tap,Hold和Pan来说,我们看到都比较容易处理。无在乎就是根据用户的操作来进行提示或者界面绘制或者弹出菜单等等。但是对于Flick来说,要让窗体滚动起来就相对麻烦一些。

而且,窗体的滚动不能单纯的只是一个匀速的移动过程。大家希望能够看到滚动的内容更加符合现实世界中的一些感官,这也就是物理引擎。例如这个内容的滚动,他应该是从速度慢,然后加速,最后在减速。而最终停止的时候,不应该是直接突然停下来。用户更加希望他是一个减速过程,同时能够有阻尼震荡。庆幸的是,Windwos Mobile 6.5的SDK中,给我们提供了这样的物理引擎。我们可以很方便的使用它来制作一个窗体滚动的动画效果。

在这套托管的Gesture API中,提供了一个physicsAnimation对象,他就是我们所利用的物理引擎。要使用这套物理引擎,我们只需要在当前窗体添加这个

physicsAnimation对象,然后设置其ExtentControl和ViewportControl。什么是ExtentControl呢,他就是你想要在窗体上滚动的那块内容;而ViewportControl,就是用户当前可以看到的那一部分。如下图所示:

 

 

我们始终只能看到屏幕中间显示的地图的一小块,但是整个图片控件其实非常大,已经超出了窗体的范围。在这里我们需要注意的是,ViewportControl他的实际大小通常比ExtentControl要小,但是它是ExtentControl的父级对象。即 ExtentControl在ViewportControl内部。

当我们需要它进行滚动的时候,我们只需要简单的设置physicsAnimation对象的运动角度(确切说,是弧度),力度,然后调用其Start方法就可以。而要停止某一个运动,只需要调用其Stop方法,正在滚动的动作就会停止。

  1. private void gestureRecognizer1_Scroll(object sender, GestureScrollEventArgs e) 
  2.  
  3.  
  4. label1.Text = e.Kind.ToString() + ": " + e.State + ", (" + e.X + ", " + e.Y + "), d=" + e.ScrollDirection + "a=" + e.Angle + "v=" + e.Velocity; 
  5.  
  6. this.physicsAnimation1.Stop(); 
  7.  
  8. this.physicsAnimation1.Angle = e.Angle; 
  9.  
  10. this.physicsAnimation1.Velocity = e.Velocity; 
  11.  
  12. this.physicsAnimation1.Start(); 
  13.  

上面这段代码就演示了physicsAnimation组件的使用方式。这是利用的上一小节中咱们用到的Gesture API来捕获Flick动作,也就是滚动。

首先我们使用Stop方法停止当前的动画;然后设置运动的方向的弧度,这里是通过Gesture来判定运动方向;然后是力度,同样也是从 Gesture中获得;最后调用Start方法,则指定的ExtentControl就在ViewportControl对象的可视区域内滚动起来。

【编辑推荐】

  1. Windows Mobile 6.5定于10月6日发布
  2. Windows Mobile 6.5 Widgets开发初体验
  3. Windows Mobile 6.5开发环境搭建以及变化
  4. Windows Mobile 6.5 SDK发布(附下载)

 

责任编辑:佚名 来源: cnmsdn
相关推荐

2009-05-19 10:44:23

微软Windows mob移动OS

2009-02-17 10:41:38

Windows Mob操作高清照片

2010-03-26 09:13:00

Windows Mob系统更新

2010-02-02 17:04:38

Windows MobWindows Mob下载

2009-04-28 09:47:44

WM6.5Windows Mob智能手机

2009-06-01 08:48:44

微软Windows Mob移动OS

2009-03-12 08:34:54

2010-05-23 10:29:29

Widget开发

2011-09-08 10:18:09

Windows MobWidgets

2011-04-25 16:40:21

开发环境搭建Windows Mob

2011-09-08 10:04:07

Windows MobWidget

2009-02-17 09:54:34

2009-06-23 10:06:03

2009-05-18 09:06:37

微软WMWindows Mob

2009-02-09 17:18:46

WindowsMobile 6.5 泄露

2009-09-02 10:16:06

Windows Mob

2009-02-17 09:08:48

Windows MobMy Phone截图

2009-04-20 08:43:49

Windows Mob微软移动OS

2009-02-22 09:04:51

WM 6.5SoftKey改进

2013-01-25 14:48:57

Series 40S40
点赞
收藏

51CTO技术栈公众号