SensiGator 为 Windows* 8 平板电脑上的 Bing* 地图开辟新航线





0/5 (0投票)
SensiGator 专为运行 Windows* 8.1 的联想 ThinkPad* 平板电脑 2 和 Ultrabook™ 二合一设备打造,充分利用了平板电脑平台的各种传感器和输入方式。平台
倾斜平板电脑已取代旋转地球仪成为学习地理的方式。SensiGator 是“教育类”类别的英特尔® 应用创新大赛 (AIC 2013) 的获胜者,其部分设计宗旨是拓展学生学习基础地理知识的想象力。SensiGator 专为联想 ThinkPad* 平板电脑 2 和运行 Windows* 8.1 的 Ultrabook™ 二合一设备而打造,充分利用了平板电脑平台的各种传感器和输入方式——包括生动的 10.1 英寸高清触摸显示屏,以及用于连接键盘和显示器等外围设备的多种选项(蓝牙*、USB 和 mini-HDMI*)。这些外围设备的作用非常重要,因为 SensiGator 应用开发者 Bryan Brown 在平板电脑本身上完成了所有的开发和测试工作——这是他作为程序员的第一次尝试。得益于英特尔® Atom™ 处理器(双核四线程,高达 1.80 GHz),他报告说,构建速度并不比高端 PC 慢多少。
对于 Brown 来说,他的BlinkTalk 应用在 2012 年赢得了类似的英特尔应用创新大赛,SensiGator 带来了新的编程挑战,包括如何为 Windows 8 桌面应用使用 Windows Runtime (也称为 WinRT) API,如何在触摸屏上模拟键盘和鼠标操作,以及为了提供流畅的用户体验,如何仅通过内置传感器,特别是倾角计和陀螺仪来导航地图。
充分利用平板电脑的屏幕和传感器
ThinkPad Tablet 2 的 10.1 英寸高清屏幕精美地呈现了必应*地图。其理念是呈现用户从飞机窗户向下俯瞰地球时可能看到的图像,当然,还增强了如今预期的公路网和城镇标签,在本例中由必应提供。当用户向下倾斜平板电脑的右侧,倾角计检测到倾斜时,用户似乎正在向东飞行。景观平稳滚动,这在很大程度上是因为平板电脑的处理能力能够快速渲染图像。(微软的必应地图瓦片系统,该系统在多个不同的细节级别预先渲染地图,然后将每张地图分割成瓦片以供快速检索和显示,也是实现这种流畅响应的关键因素。)
放大地图只需快速顺时针扭转平板电脑即可。一旦陀螺仪检测到角速度超过每秒 150 度,地图上的小特征就会在屏幕上突然放大(参见图 1)。向相反方向轻拨几次即可缩小图像,直到屏幕仅显示大陆级细节(参见图 2)。
轻触屏幕上的按钮即可将地图定位到用户在地球上的位置;使用地理定位传感器的数据(参见图 3)。SensiGator 具有半透明的抬头显示器,提供屏幕上的触摸导航按钮,并显示屏幕地图中点和用户实际位置的精确纬度和经度信息(参见图 4)。平板电脑的触控笔可用于插入虚拟图钉。考虑到联想平板电脑上的许多端口,可以通过 USB 或 mini-HDMI 连接到外部显示器、键盘和鼠标。Brown 认为——除了快速旋转教室地球仪并想象上面的居民拼命抓住的乐趣之外——就用户体验而言,SensiGator 完胜了老式的地球仪,后者可能可以追溯到公元前三世纪。
调整默认多点触控功能以确保良好的用户体验
当然,要创造出连孩子都能轻松使用的东西非常困难。比赛规则也很有挑战性,因为参赛者必须创建 Windows 8 桌面应用程序,所以 Brown 使用必应地图 Windows Presentation Foundation (WPF) SDK 而不是必应地图 for Windows Store Apps 更为合适。
“这带来了一些挑战,主要是因为 WPF SDK 在 Windows 8 桌面应用程序中使用时会表现出一些奇怪的行为。当尝试进行缩放等多点触控操作时,这种行为尤其明显。Brown 在 2013 年 8 月为 CodeProject* 发布的一篇介绍 SensiGator 的文章中写道:“在尝试进行缩放等诸如捏合手势的多点触控操作时,这种行为尤其明显。”
在浏览了微软开发者网络 (MSDN) 论坛上关于该问题的详细讨论后,Brown 决定覆盖必应地图的默认行为,通过 TouchDown 事件禁止多点触控和捏合缩放控件。代码段 1 中的代码片段展示了他如何做到这一点。
private void Map_TouchDown(object sender, TouchEventArgs e)
{
e.Handled = true;
}
Brown 使用 Visual Studio* 2012 和第一个支持 .NET 4.5 的版本构建了 SensiGator,这是一个 C#/WPF 应用程序。在英特尔® 开发者区的一篇关于文章中阅读了 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 毫秒更新一次,而 GeoThread 每五秒更新一次。
“我最初打算在主应用程序级别实例化一个 GeoLocator 对象并订阅位置更改事件的处理程序,但我最终决定使用 GetGeopositionAsync() 并将其包装在我的 SensorClass 中的公共方法中,”Brown 说。“这就是为什么地理位置信息是作为线程轮询而不是事件驱动的,但开销很小,因为相对于五秒的轮询率,用户可辨识的地理位置变化并不快。”
模拟键盘和鼠标操作
对于缩放和导航按钮,Brown 希望复制键盘的操作,因此他使用了 Windows Input Simulator DLL,这是一个 C# SendInput 包装器,用于模拟键盘和鼠标操作。
Brown 使用开源的第三方InputSimulator DLL 来实现一些导航例程,从而方便地访问 Win32* SendInput 方法。在引用了 InputSimulator DLL 并将 WindowsInput 命名空间添加到项目中后,他能够调用其 SimulateKeyPress 方法,该方法接受各种虚拟键码(ADD、SUBTRACT、LEFT、RIGHT 等)作为参数。在地图缩放的情况下,他创建了一个 ZoomIn() 方法,当平板电脑的角速度超过 Z 轴每秒 150 度时,以及当用户点击“*Zoom In*”导航按钮时(参见代码段 2)会调用该方法。
private void btnZoomIn_Click(object sender, RoutedEventArgs e)
{
if (myMap.ZoomLevel < ZOOM_MAX)
{
myMap.Focus();
ZoomIn();
}
}
.
.
.
public void ZoomIn()
{
InputSimulator.SimulateKeyPress(VirtualKeyCode.ADD);
}
作为一名永不满足的创新者,Brown 在 AIC 2013 之前就已经从事过必应地图相关的工作。他的NuiMaps 应用是他参加的英特尔® 感知计算挑战赛(于 2013 年底结束)的四个参赛作品之一。在早期使用必应地图控件的工作中,他调用了 InputSimulator 的 SimulateKeyPress 方法来导航东西南北(例如,“InputSimulator.SimulateKeyPress(VirtualKeyCode.RIGHT)”)。这种方法的优点是,当通过键盘的箭头键进行导航时,必应地图控件会自动调整缩放级别分辨率。(有关缩放级别分辨率的更多信息,请参见 MSDN 文章理解比例和分辨率。)
“缺点是,当您模拟多个快速按键时,运动会显得 choppy,”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);
Sensor Nav 面板包含一个灵敏度滑块,可用于增加或减少通过传感器数据导航时地图的行进速度。中心功能(cf)(如图 8 所示)使用滑块的值(即 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;
}
Brown 在平板电脑本身上完成了所有编码工作,这使得功能测试更加容易;“平板电脑最适合消费内容而非创作内容”的传统观念并不完全准确。他说,不必为了测试目的将应用程序下载到平板电脑上,这可能使他在短短六周内完成了应用程序的开发。但这并非没有缺点:例如,构建速度比在开发类机器上要慢。
Brown 说,如果他开发另一个不是非常依赖代码的应用程序,他可能会再次尝试在平板电脑上开发,尽管他会寻找替代的集成开发环境,以便也能够离线工作。他说,关键是找到一个能够处理所有传感器并在桌面运行的良好 Windows 平板电脑模拟器,就像为构建平板电脑和手机 Android* 和 iOS* 应用的开发者提供的模拟器一样。
Brown 是一位拥有多年经验的专业人士,他承认:“我目前不确定 Visual Studio 的工具在哪里,也不知道是否有合适的模拟器环境。”仅凭这句话就暗示了 Windows 8 平板电脑和触摸屏的开发前景多么广阔。
像所有开发者一样,特别是那些面临紧张比赛截止日期的开发者,Brown 可以列出一些如果有更多时间他想尝试实现的功能。目前,SensiGator 仅限于必应地图的航拍视图;他希望将来能尝试路况和鸟瞰视图。在今年的世界移动大会上,Brown 在英特尔的展位上作为嘉宾演示了 SensiGator,一位路人建议,平板电脑倾斜角度越大,用户在地图上飞行的速度应该越快。
关于 Bryan Brown
二十多年来,Bryan Brown 一直在洛杉矶地区的多家公司担任软件工程师。他目前在一间制造光谱和色谱分析仪器的公司工作。他利用晚上和周末的时间免费编写代码,经常从事与人类健康相关的软件。这项工作足够严肃,以至于他于 2012 年创立了一个名为Human-Machine Technologies 的非营利组织。
AIC 2013 的 casual follower 可能会认为 Brown 突然出现在业余编程界,也许是凭借SensiGator 运气不错。然而,Brown 绝非昙花一现。他早期的BlinkTalk 应用为患有眼部以下自主肌肉瘫痪的闭锁综合征患者提供了一种口头交流的方式。Brown 还凭借其NuiLogix 项目在 2013 年英特尔感知计算挑战赛第一阶段获得了二等奖,该项目是用于网络设备控制的感知计算的一个例子。
他的另一个项目——PerC Robot Arm Controller——在英特尔感知计算挑战赛第二阶段荣获了先锋奖。(Brown 的视频展示了机械臂如何响应语音命令来拾取、移动和放置国际象棋棋子;能够混合一杯您最喜欢的鸡尾酒,或者至少收拾孩子们的残局的机器人,想必也指日可待。)令人印象深刻的是,英特尔主动邀请 Brown 成为今年世界移动大会 2014 的参展者,他在英特尔的展位上展示了 SensiGator。
与 Brown 交谈,让人联想到马尔科姆·格莱德威尔 (Malcolm Gladwell) 在其 2008 年著作《异类》(Outliers) 中强调的“10,000 小时法则”,该书于 2008 年 10 月节选在《纽约客》(The New Yorker) 上发表。该法则的核心思想是:在任何领域取得精通都需要大约 10,000 小时的练习。Gladwell 指出,大多数看似横空出世的天才,在被发现之前都已默默耕耘多年。
尽管 Gladwell 关于积累时间的观察很重要,但在任何事业中,拥抱变化可能与此同样重要,包括编写代码。Brown 在他告别其他开发者时所说的话也印证了这一点,他希望其他人能从他的经验中学习:
“我的建议是,永远不要将自己局限于某种特定的语言、平台或工具,并试图用相同的技能集解决所有问题。这场比赛中最有趣的部分在于,它强制要求开发一个 Windows 桌面应用程序来针对 Windows 8 平板电脑。这可能会让那些原本会倾向于原生 Windows 8 应用开发方法的开发者感到不适,但这正是走出舒适区的一部分乐趣和回报。”
资源
英特尔帮助开发者解决 Brown 所面临的挑战,以构建创新的、灵活的应用程序,充分利用最新 Windows 8 和英特尔技术跨多个设备。英特尔开发者区 (Intel Developer Zone) 为 Windows 8 应用(包括跨平台和桌面应用)提供了世界一流的知识、工具和支持,Brown 在工作期间也从中汲取了信息。英特尔开发者区可以帮助那些像 Brown 一样对创建支持多种输入类型(触摸/触控笔以及键盘/鼠标)的二合一应用程序感兴趣的开发者。
Brown 还使用了以下资源:
- Windows Input Simulator,用于模拟键盘和鼠标的开源C# SendInput 包装器
- “多点触控时的奇怪跳跃行为 (WPF)”,MSDN 论坛讨论,关于处理必应地图桌面版的有 bug 的捏合和缩放多点触控手势
相关文章
《超便携设备触摸开发者指南》:https://software.intel.com/en-us/articles/ultrabook-device-and-tablet-windows-touch-developer-guide
《Ultrabook 和平板电脑 Windows* 8 传感器开发指南》:http://software.intel.com/en-us/articles/ultrabook-and-tablet-windows-8-sensors-development-guide
《触摸和传感器》:http://software.intel.com/en-us/touch-and-sensors
英特尔® 开发者区提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专家经验,帮助开发者创新并取得成功。加入我们的物联网、Android*、英特尔® 实感™ 技术和Windows* 社区,下载工具、获取开发套件、与志同道合的开发者交流想法,并参与黑客马拉松、竞赛、路演和本地活动。