作者:Geoff Arnold
倾斜平板电脑已经取代旋转的地球仪,成为学习地理的一种途径。SensiGator是 英特尔® 应用创新大赛 (AIC 2013)的教育类别冠军,其设计在一定程度上拓展了基础地理学生的想象力。SensiGator 适用于 联想 ThinkPad* Tablet 2和 2 合 1 超极本™(运行 Windows* 8.1),充分利用了平板电脑平台的各种传感器和输入模式的优势,包括 10.1 英寸高清触摸屏和用于连接键盘和显示器等外设的多种选项(蓝牙*、USB 和 mini-HDMI*)。这些外设很重要,因为 SensiGator 应用的开发者 Bryan Brown 在他的程序员生涯中,首次完全在平板上完成了开发和测试工作。他在报告中表示正因为英特尔® 凌动™ 处理器(双核 4 线程,高达 1.80 GHZ)的支持,构建工作的速度与在高端电脑上相差无几。
Brown 以他的 BlinkTalk应用赢得了 2012 年度英特尔应用创新大赛的冠军。对他而言,SensiGator 带来了全新的编程挑战,包括如何将 Windows 运行时(又称 WinRT) API 应用于 Windows 8 桌面应用,如何在触摸屏上模拟键盘和鼠标操作,以及为了提供流畅的用户体验,如何仅使用机载传感器(尤其是测斜仪和陀螺测试仪)导航地图。
视频 1:SensiGator 提交的 2013 年度英特尔应用创新大赛视频,
说明了 SensiGator 通过传感器实现的必应地图导航。
充分利用平板电脑的屏幕和传感器
ThinkPad Tablet 2 的 10.1 英寸高清屏幕能够完美呈现必应* 地图。该设想是为用户呈现从飞机窗口俯瞰地球的图像,增强内容包括带有预期标签的高速公路网络、干道和城镇(本例中由必应提供)。当用户将平板电脑右侧向下倾斜时,倾斜仪检测到该倾斜,他/她似乎正在向东飞行。景象能够平滑滚动,这很大程度上是因为平板电脑的处理能力支持快速渲染图像。(Microsoft 的必应地图倾斜系统能够支持多种不同级别的地图细节预渲染,然后将每一张地图切割成贴片,以便快速提取和显示,因此也是实现平滑响应的重要因素。)
放大只需沿顺时针方向快速扭转平板电脑。 一旦陀螺仪检测到大于 150 度/秒的角速度,地图上的小项目便会随着图像放大在屏幕上清晰呈现(见图 1)。 轻敲相反方向即可缩小图像,直到屏幕仅显示大洲级别的细节(见图 2)。
图 1:使用 SensiGator 放大必应地图
图 2:使用 SensiGator 呈现大洲级别解析度的必应地图
轻触屏幕上的按钮即可在地图上居中显示用户在地球上的位置;这一功能使用来自地理定位传感器的数据(见图 3)。SensiGator 具有半透明的平视显示器,在屏幕上提供了用于触摸导航的按钮,并显示屏幕上地图的中央点和用户实际位置的精确经纬度信息(见图 4)。平板电脑的手写笔可以用于插入虚拟图钉。联想平板电脑具备多个端口,可以通过 USB 或 mini-HDMI 连接外部显示器、键盘和鼠标。Brown 认为,除了在教室里快速旋转地球仪和想象地球上的居民抱着可爱小生命的乐趣,从用户体验的角度而言,SensiGator 可以完胜历史可以追溯到公元前三世纪的老式地球仪。
图 3:现在的洛杉矶地区的 SensiGator 屏幕截图
图 4: SensiGator 平视显示器
调整默认的多点触控功能,确保良好的用户体验
创作儿童能够轻松使用的东西本身就非常困难。比赛规则也非常棘手,参赛者必须创作 Windows 8 桌面应用,因此对 Brown 而言,使用 Bing Maps Windows Presentation Foundation (WPF) SDK比使用 Windows 商店应用的必应地图更加明智。
“这个过程存在一些挑战,主要是因为在 Windows 8 桌面应用中使用 WPF SDK 时发现一些异常行为。 这种行为在使用按压手势执行缩放等多点触控操作时尤为明显”, Brown 在 2013 年 8 月向大赛评委介绍 SensiGator 的 CodeProject* 文章中写道。
在详细浏览 Microsoft 开发人员网络 (MSDN) 论坛中关于这个问题的讨论后,Brown 决定改写必应地图的默认行为,使用 TouchDown 事件禁用多点触控和触控缩放控制。片段 1 中的代码片段显示了工作原理:
private void Map_TouchDown(object sender, TouchEventArgs e) { e.Handled = true; }
片段 1:改写必应地图默认的多点触控功能
Brown 将 SensiGator 构建为 C#/WPF 应用,使用了 Visual Studio* 2012。这也是首个支持 .NET 4.5 的 Visual Studio 版本。他在英特尔® 开发人员专区中阅读到一篇有关 Windows 8 WinRT API 的文章,了解到 Visual Studio 2012 在默认情况下无法从常规桌面 C# 项目访问 WinRT;开发人员首先需要声明他/她的项目针对 Windows 8。Brown 指出:“完成这一步后,就可以引用访问传感器数据所需的 Windows.Devices.Sensors和 Windows.Devices.Geolocation程序集。”
SensiGator 应用引用了 SensorHub 类库,Brown 创建这个库的目的是用于包装 Windows.Devices.Sensors 和 Windows.Devices.Geolocation 命名空间 API。SensorClass 对象在主应用中实例化,用于访问平板电脑传感器数据并生成三个连续线程,用于数据处理、用户界面互动(使用 Dispatcher.BeginInvoke)和获取地理位置信息。数据处理和 UI 线程的更新间隔为 50 毫秒,地理位置线程的更新间隔为 5 秒。
Brown 表示:“我最初想在主应用层实例化 GeoLocator 对象,并订阅用于处理位置变化事件的事件处理程序,但我最终决定使用 GetGeopositionAsync(),并采用公共方法将其包装在我的 SensorClass 对象中。这就是为什么在一个线程中轮询地理位置信息而不采用事件驱动的原因,但是,由于轮询率是五秒钟,用户的可辨别地理位置没有迅速改变,因此开销最小。”
图 5: SensiGator 架构概述
模拟键盘和鼠标操作
对于缩放和导航按钮,Brown 想复制键盘操作,因此他使用了 Windows Input Simulator DLL,这是一款用于模拟键盘和鼠标操作的 C# SendInput 包装程序。
Brown 使用了第三方开源 InputSimulator DLL执行一些常规导航,从而提供一种轻松访问 Win32* SendInput 方法的途径。 引用 InputSimulator DLL 并将 WindowsInput 命名空间添加到项目后,他就能够调用需要使用各种虚拟键码(ADD、SUBTRACT、LEFT、RIGHT 等)作为参数的 SimulateKeyPress 方法。针对地图缩放,他创建了一个 ZoomIn() 方法,当平板电脑在 Z 轴上的角速度超过 150 度/秒以及用户轻触放大导航按钮时将调用此方法(见片段 2)。
private void btnZoomIn_Click(object sender, RoutedEventArgs e) { if (myMap.ZoomLevel < ZOOM_MAX) { myMap.Focus(); ZoomIn(); } } . . . public void ZoomIn() { InputSimulator.SimulateKeyPress(VirtualKeyCode.ADD); }
片段 2:通过屏幕上的按钮启用放大功能的代码
Brown 早在 2013 年度应用创新大赛之前就在研究必应地图。他的 NuiMaps应用是他参加英特尔® 感知计算挑战赛的四款应用之一,于 2013 年底完成。在对必应地图控件的早期研究工作中,他调用了 InputSimulator 的 SimulateKeyPress 方法,用于导航东西南北方向(例如:"InputSimulator.SimulateKeyPress(VirtualKeyCode.RIGHT)")。这种方法的优势是,通过键盘的方向键执行导航时必应地图控件能够自动调节缩放级别分辨率。(请参阅 MSDN 文章“了解缩放和分辨率”,了解有关缩放级别分辨率的详细信息。)
Brown 说道:“这个方法的缺点是当模拟多次快速按键时出现运动震荡。在 SensiGator 中,我想让动态更加流畅,因此没有模拟击键,而是推导出一个非线性方程,用于控制不同地图缩放级别的转换速度,并通过在屏幕上重新将地图居中实现导航。”片段 3 中显示了工作原理。
cf = Sensefactor / Math.Pow(10, (myMap.ZoomLevel * 0.25 + 0.5)); . . myMap.Center = new Location(myMap.Center.Latitude + cf, myMap.Center.Longitude);
片段 3:控制不同地图缩放级别的转换速度
传感器导航面板包含一个通过传感器数据导航时可用于增减地图行进速度的灵敏度滑块。图 8 中显示的居中函数 (cf) 使用该滑块的值(即:Sensefactor = sliderSense.Value)。Brown 在注释中说明,他的方程并未采用上文提及的 MSDN 文章中的信息,而是从经验数据推导得出。
哪一端朝上?(解决朝向问题)
另一个挑战是检测平板电脑是横向还是纵向,然后相应地处理地图导航。SensiGator 用于在平板电脑横向正面朝上时操作,但在纵向上也能正常工作。然而,当平板电脑的方向改变时,应用需要重新定义如何使用平板电脑的倾斜仪数据执行地图导航。片段 4 中的代码片段表明了 Brown 的应用如何首先检测平板电脑的朝向,然后再重新定义 X 轴和 Y 轴。
LocationRect bounds = myMap.BoundingRectangle; MapWidth = bounds.Width; MapHeight = bounds.Height; . . . if (MapHeight > MapWidth) { lblOrientation.Content = "Portrait Orientation"; XAxis = -Pitch; YAxis = Roll; } else { lblOrientation.Content = "Landscape Orientation"; XAxis = Roll; YAxis = Pitch; }
片段 4:如果平板电脑的朝向发生了变化,重新定义 X 轴和 Y 轴
Brown 在平板电脑上完成了所有代码编辑工作,能够更加轻松地测试各种功能,“平板电脑是消费的最佳选择,但不适合创作内容”的传统观点并不完全正确。他说,不必为了测试将应用下载到平板电脑上,这可能促进了他能够在六周内完成该应用。这种体验也不是没有缺点:例如,构建过程比在开发级别的计算机上消耗更多时间。
Brown 说道,如果他要开发另一款代码不是太多的应用,将再次尝试在平板电脑上开发,虽然他也会考虑可能支持脱离平板电脑工作的集成开发环境。他说,重点在于寻找到一款包含所有传感器、并且能够在桌面运行的优秀的 Windows 平板电脑模拟器,就像用于构建平板电脑、手机 Android* 和 iOS* 应用的模拟器一样。
Brown 是一名拥有多年经验的专业人员,他承认:“涉及到 Visual Studio,我并不确定目前在哪能找到工具,也不知道是否存在适当的模拟器环境。”这一言论本身暗示了在 Windows 8 平板电脑和触摸屏上进行开发的广泛可能性。
像所有开发人员一样,尤其是那些受到紧迫的比赛日程限制的开发人员,Brown 能够列出几个如果有更多时间他想尝试实施的功能。目前,SensiGator 仍局限于必应地图的航测视图;他将来想试验道路和鸟瞰视图。在今年的世界移动通信大会上,Brown 在英特尔的展位上作为嘉宾演示了 SensiGator,一名观众建议平板电脑的倾角越大,地图滑过的速度应越快。
关于 Bryan Brown
20 多年来,Bryan Brown曾在多家位于洛杉矶地区的公司担任软件工程师。他目前在一家制造光谱和色谱设备的公司就职。他利用晚上和周末免费编写代码,经常研究关乎人类福祉的软件。他的工作非常重要,为他在 2012 年创立的“人机技术”非营利组织提供着支持。
2013 年度应用创新大赛的关注者可能会认为 Brown 在业余编码爱好者之间一鸣惊人,也许 SensiGator的成功是凭借几分幸运。 然而,Brown 的成功并非昙花一现。 他早期的BlinkTalk应用为患有眼部下方随意肌麻痹的闭锁综合征患者提供了语言交流的途径。 Brown 还凭借他的 NuiLogix 项目(用于网络设备控制的感知计算实例)在 2013 年度英特尔感知计算挑战赛第一轮中获得了二等奖。
他的另一个项目 PerC 机器人手臂控制器获得了英特尔感知计算挑战赛第二轮的先锋奖。(Brown 的视频机器人手臂响应语音命令执行拾取、移动、并将棋子投入玻璃杯;能够调出美味鸡尾酒或照顾孩子的机器人将为期不远。)由于对 Brown 和他的应用印象深刻,英特尔为 Brown 提供了 2014 世界移动通信大会的参展证,让他在英特尔的展位上演示 SensiGator。
与 Brown 的谈话让人想起 10,000 小时定律(Malcolm Gladwell 在他的书《异类》(Outliers)中着重强调了这一定律,引用自 2008 年 10 月出版的《纽约客》)。该规则的要点:要成为某个领域的专家,需要大约 10,000 小时的练习。Gladwell 指出,大多数看似一鸣惊人的天才都在出名之前经过多年努力。
Gladwell 的观察指出除了投入时间的重要性外,积极应对变化的能力对于在任意领域取得成功同样非常重要,包括编写代码。Brown 对想向他学习的开发人员提出了以下赠言:
“我建议,永远不要把自己锁定在一个特定的语言、平台或工具,不要试图使用相同的技能组合解决每一个问题。这项大赛中最有趣的部分就是要求开发一款在 Windows 8 平板电脑上使用的 Windows 桌面应用。这可能会让倾向于原生 Windows 8 应用开发方法的开发人员措手不及,但其中的乐趣就是超越你的舒适区,并终将获得回报。”
资料来源
英特尔能够帮助开发人员解决像 Brown 一样的问题,充分利用最新版 Windows 8 和英特尔技术的优势,构建跨多种设备的灵活创新的应用。英特尔开发人员专区提供了适用于跨平台和桌面的世界一流的知识、工具和 Windows 8 应用支持。Brown 在工作过程中便从这里获得了丰富信息英特尔开发人员专区能够为像 Brown 一样有志于创作支持多种输入方式(触摸/手写笔以及键盘/鼠标)的二合一应用的开发人员,提供重要帮助。
Brown 还利用了以下资源:
- Windows Input Simulator,用于模拟键盘和鼠标的开源 C# SendInput 包装程序
- “多点触控产生的异常跳跃行为 (WPF)”,有关处理桌面必应地图的多点触控收缩和缩放手势漏洞的 MSDN 论坛讨论
相关文章
面向超便携设备的触控开发人员指南:https://software.intel.com/zh-cn/articles/ultrabook-device-and-tablet-windows-touch-developer-guide
超极本和平板电脑 Windows* 8 传感器开发指南: https://software.intel.com/zh-cn/articles/ultrabook-and-tablet-windows-8-sensors-development-guide