65.9K
CodeProject 正在变化。 阅读更多。
Home

Ultrabook™ 设备和平板电脑 Windows* 触控开发者指南

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013年4月24日

CPOL

20分钟阅读

viewsIcon

25732

本指南包含应用程序开发者在开发针对 Ultrabook™ 设备的应用程序时需要使用的 API 相关信息。

目录

摘要

本指南包含应用程序开发者在开发针对 Ultrabook™ 设备的应用程序时需要使用的 API 相关信息。它涵盖了针对 Windows* 7、Windows* 8 桌面、Windows* Modern UI 以及在 Web 浏览器中运行的应用程序的开发信息。

本指南还提供了常见手势用户期望的描述,并提供了一些开发令人满意的触控界面的指南。

引言

现在有许多支持触控的 Ultrabook™ 设备可用,软件开发者希望创建专为触控输入设计的软件。一个应用程序要完全支持触控,必须满足三个标准:

  • 最常用的控件至少为 40x40 像素,足够大以方便用指尖精确指示。
  • 支持相关手势(平移、缩放、旋转、两指点按、按压和点按),且效果发生在接触点。
  • 应用程序在平移、缩放和旋转时提供平滑、响应迅速的视觉反馈,以使其感觉高度交互。

无论开发者是编写新应用程序还是希望更新现有应用程序以包含触控支持,本指南都将帮助他们完成旅程。

有关编写支持触控的应用程序的更多信息,请参阅 MSDN 文章《触控交互设计》。

硬件要求

消费者有各种支持触控的设备可供选择。开发者在尝试开发在每个设备上感觉自然的应用程序时面临着挑战。通常,支持触控的应用程序应设计为在其任何目标设备上运行,同时充分利用每个设备的触控功能。Ultrabook 设备代表了触控能力的高端,应作为应用程序触控界面的设计点。

带触摸屏的 Ultrabook 设备自 2011 年开始上市

  • 第二代 Intel® 酷睿™ 处理器家族(代号 Sandy Bridge)。这些系统随 Windows 7 一起发布,有些带有触摸屏。
  • 第三代 Intel® 酷睿™ 处理器家族(代号 Ivy Bridge)。这些系统也首先随 Windows 7 发布,但现在正与 Windows 8 一起销售。我们将在 2013 年及以后看到更多具有触控功能的设备,特别是因为许多较新的设计都是变形本。

本开发者指南的其余部分假设目标平台是支持触控的 Ultrabook 系统。为该设备设计的软件可以适应运行相同操作系统的其他支持触控的设备。

Ultrabook 设备的运行环境

如今设计应用程序需要仔细考虑客户最常使用的环境以及应用程序最适合的环境。无论应用程序是针对 Windows 8 桌面还是作为 Windows 应用商店应用程序,开发者都需要了解哪些界面适用。

如果应用程序针对 Windows 8 UI(也称为 Windows 应用商店应用程序),则必须使用 WinRT API。如果应用程序要在 Windows 8 桌面环境中运行,则有更多选择:Windows 7 的旧版 API 和 Windows 8 的新触控 API。这些接口将在下面的部分中进一步讨论。还有其他开发 Web 应用程序的选项。Web 浏览器可用的触控界面也将在下面讨论。

触控交互:指针、手势和操作

触控输入有不同级别的解释。指针事件是最基本的,因为它们表示触控的单独接触点。手势和操作事件在此基础上构建。手势事件提供了一种捕获简单点按和按住手势的简单方法。操作事件用于使用物理手势模拟 UI 元素的物理操作的触控交互。当用户与屏幕上的 UI 元素交互时,操作事件提供更自然的体验。可用的触控界面对这三个解释级别有不同程度的支持。

阅读有关 MSDN 上的手势、操作和交互的更多信息

指针交互

指针事件是来自输入设备(例如鼠标、触控笔、单指或多指)的单个、唯一的输入或“接触”。当发生接触时,系统在首次检测到时创建一个指针,然后当指针离开检测范围或被取消时,它将被销毁。在多点触控输入的情况下,每个接触都是一个唯一的指针。表 1 显示了 Ultrabook 设备运行 Windows 7 和 Windows 8 时可用的用于检索基本指针事件的接口。

表 1. Ultrabook 设备可用的指针 API

操作系统兼容性触控界面备注

Windows* 7 (桌面)

WM_TOUCH

  • 也兼容 Windows 8 桌面环境。
  • 同时触控的最大数量受硬件限制。
  • 没有内置手势识别。
  • 必须调用 RegisterTouchWindow,因为 WM_TOUCH 消息默认不发送。

仅 Windows 8 (桌面)

WM_POINTER

  • 仅适用于 Windows 8 桌面环境。
  • 默认情况下,Windows 8 动画和交互反馈会生成并可用于进一步处理。

Windows Modern UI

PointerPoint

  • 仅适用于 Windows 应用商店应用程序。

Windows 7 和 Windows 8 可用的触控界面

请参阅 MSDN 上的常见用户交互指南

Windows 7 和 Windows 8 桌面触控界面:WM_TOUCH

WM_TOUCH 消息可用于指示一个或多个指针(例如手指或笔)已在屏幕上进行接触。

示例代码

指导

Windows 8 桌面触控界面:WM_POINTER

WM_POINTER 消息是 Direct Manipulation API 的一部分,专门用于 Windows 8 桌面。此接口可用于捕获单个触控指针以及手势和操作。WM_POINTER 消息将在操作和手势交互部分进一步讨论。

MSDN 上的参考资料: Direct Manipulation API

Windows Modern UI 触控界面:PointerPoint

PointerPoint 类是 Windows 运行时环境的一部分,仅兼容 Windows 应用商店应用程序。它为与单个鼠标、触控笔或触控接触相关的输入指针提供基本属性。MSDN 提供了示例代码,可以帮助开发者开始使用 PointerPoint 接口。

MSDN 上的示例代码: 输入:XAML 用户输入事件示例

操作和手势交互

手势事件用于处理静态手指交互,例如点按和按住。双击和右击是从这些基本手势派生出来的。

  • 手势:在输入设备上或由输入设备执行的物理动作或运动,可以是单指或多指、触控笔或鼠标。
  • 操作:对象对手势的即时、持续响应。例如,滑动手势会导致对象以某种方式移动。
  • 交互:如何解释操作以及操作产生的命令或动作。例如,滑动和轻扫手势相似,但结果根据是否超过距离阈值而不同。

表 2. 用于操作交互的基本手势

手势类型描述

按住

静态手势

检测到单个接触且不移动。按住会导致显示详细信息或教学视觉效果,而无需提交操作。

点按

静态手势

一根手指触摸屏幕并立即抬起。

转动

操作手势

两根或更多手指触摸屏幕并沿顺时针或逆时针方向移动。

滑动

操作手势

一根或多根手指触摸屏幕并沿相同方向移动(也称为平移)

轻扫

操作手势

一根或多根手指触摸屏幕并沿相同方向移动短距离。

捏合

操作手势

两根或更多手指触摸屏幕并相互靠近或远离移动。

拉伸

操作手势

两根或更多手指触摸屏幕并相互远离移动。

表 3. Ultrabook™ 设备可用的手势界面

操作系统兼容性手势界面备注

Windows 7

Windows 8 (桌面)

WM_TOUCH + IManipulationProcessor

  • 此组合为开发者提供了仅适用于 Windows 8 桌面的 WM_POINTER API 的功能。
  • 最大触控点由硬件决定。

Windows 7

Windows 8 (桌面)

WM_GESTURE + GESTUREINFO 结构

  • 最多两个同时触控点
  • 不支持同时手势
  • 如果应用程序需要比 WM_GESTURE 消息提供的更复杂的操作,则需要使用 WM_TOUCH 接口编写自定义手势识别器。

Windows 8 (桌面)

WM_POINTER

Windows Modern UI

PointerPoint

  • 手势交互是使用 GestureRecognizer 产生的,该 API 接收 PointerPoint 的输出。

MSDN 上的参考资料

表 4. 触控交互的标准预期交互和结果

交互描述

按住以学习

显示详细信息或教学视觉效果。

点按以执行主要操作

调用主要操作,例如启动应用程序或执行命令。

滑动以平移

主要用于平移交互,但也可用于移动、绘图或书写。也可通过擦洗(在相关对象(如单选按钮)上滑动手指)来定位小而密集排列的元素。

轻扫以选择、命令和移动

将手指滑动短距离,垂直于平移方向,可在列表或网格中选择对象。

捏合和拉伸以缩放

不仅用于调整大小,此交互还可通过语义缩放跳到内容的开头、结尾或任何位置。SemanticZoom 控件会产生缩小的视图,用于显示项目组并快速返回它们。

转动以旋转

用两根或更多手指旋转会导致对象旋转。

从边缘轻扫以获取应用程序命令

从屏幕底部或顶部边缘轻扫会显示应用程序命令。

从边缘轻扫以获取系统命令

从屏幕右边缘轻扫会显示用于系统命令的“超级按钮”。从左边缘轻扫会导致循环切换当前运行的应用程序,从屏幕顶部边缘向底部滑动会关闭应用程序。从顶部边缘向下滑动并向左或向右边缘贴靠会将当前应用程序贴靠到屏幕该侧。

解释 Windows 7 桌面的操作和手势交互

IManipulationProcessor 接口可以与 WM_TOUCH API 结合使用,提供一种向 UI 对象添加平移、旋转、缩放和惯性的方法。此组合提供了类似于 WM_POINTER 手势识别功能的功能。一旦启用操作处理器,操作就会在触控手势启动后立即开始。

示例代码

WM_GESTURE 消息有一个名为 GESTUREINFO 的结构,可用于解释手势和操作。WM_GESTURE 的 MSDN 网页展示了如何使用 GESTUREINFO 结构获取手势特定信息的示例。

请注意,WM_GESTURE 存在限制,例如同时触控输入的最大数量仅为两个,并且不支持同时手势。对于需要更多功能但仍需要支持 Windows 7 桌面的应用程序,请使用 WM_TOUCH 接口,并编写自定义手势识别器(如下面的自定义手势识别部分所述),或将操作处理器接口与 WM_TOUCH 结合使用。

Intel Developer Zone 上的示例代码 (WM_GESTURE API + GESTUREINFO: 示例应用程序:桌面触控

有关编写支持触控的应用程序的更多信息,请参阅 MSDN 文章:触控交互设计

处理 Windows 8 桌面应用程序的操作和手势交互

仅针对 Windows 8 桌面的应用程序可以使用 Direct Manipulation API (WM_POINTER 消息)。指针消息被传递给一个内部交互上下文对象,该对象在无需实现自定义手势识别器的情况下执行操作识别。存在一个回调基础设施,其中管理所有涉及跟踪联系人的交互。

Direct Manipulation 旨在处理操作和手势交互,并支持两种输入处理模型:

  1. 自动/独立:窗口消息由 Direct Manipulation 在委托线程上自动拦截并处理,无需运行应用程序代码,使其独立于应用程序。
  2. 手动/依赖:窗口消息由在 UI 线程中运行的窗口过程接收,然后该过程调用 Direct Manipulation 处理消息,使其依赖于应用程序。

可以通过初始化 Direct Manipulation 并准备系统进行输入处理来捕获手势。

请参阅 MSDN 上的快速入门:Direct Manipulation,了解在使用 Direct Manipulation 时执行典型任务所需的 API 调用概述。

处理 Windows 8 Modern UI 中的操作和手势交互

GestureRecognizer API 用于处理指针输入以处理操作和手势事件。PointerPoint 方法返回的每个对象都用于将指针数据提供给 GestureRecognizer。手势识别器侦听并处理指针输入并处理静态手势事件。有关如何创建 GestureRecognizer 对象然后在该对象上启用操作手势事件的示例,请参阅 MSDN GestureRecognizer 网页(下文引用)。

MSDN 上的参考资料

Intel Developer Zone 上的示例代码: 示例应用程序:Windows* 应用商店触控

自定义手势识别

在可能的情况下,请使用内置手势识别器(参见表 3)。如果提供的手势和操作接口不提供所需的功能,或者应用程序需要更快地消除点按和手势之间的歧义,则可能需要编写自定义手势识别软件。在这种情况下,客户期望的是涉及与应用程序中 UI 元素直接交互的直观体验。最好将自定义交互基于标准控件,以保持用户操作的一致性和可发现性。只有在有明确、定义明确的需求且基本交互不支持应用程序所需功能时,才应使用自定义交互。有关常见和预期交互以及触控交互后果的列表,请参见表 4。

Intel Developer Zone 上的代码示例(WM_TOUCH 与自定义手势识别):Windows 桌面触控

Web 浏览器中的触控支持

Web 浏览器中运行的应用程序也可以使用触控输入,支持程度因浏览器而异。由于 Web 浏览器功能变化迅速,通常最好检测支持的功能而不是特定的浏览器。一旦确定是 Internet Explorer (IE) 10、基于 Webkit* 构建的浏览器还是需要支持的其他浏览器,功能检测已被证明是一种更有效的技术。功能检测维护成本较低,原因如下:

  • 新浏览器发布,现有浏览器经常更新。现有代码可能未考虑新浏览器版本。更新后的浏览器可能支持在浏览器检测代码设计时不支持的标准和功能。
  • 新设备经常包含新版本的浏览器,因此必须不断审查浏览器检测代码以支持新浏览器。为每个浏览器创建自定义实现可能会变得极其复杂。
  • 许多浏览器支持修改用户代理字符串,这使得浏览器检测难以准确识别。

WebKit 驱动 Apple Safari* 和 Google Chrome*,Opera 也将很快将其浏览器转移到使用 WebKit。Internet Explorer 10 不使用 WebKit;但是,WebKit 和 IE 10 都建立在文档对象模型 (DOM) 级别 3 核心规范之上。要查看与触控事件相关的标准,请参阅 2013 年 1 月发布的标准“触控事件版本 1”。

参考文献

IE 10 有自己的触控接口,必须调用这些接口才能处理触控事件。使用带有 userAgent 属性的 navigator 对象来确定浏览器是否支持所需功能。以下示例表明浏览器是 Internet Explorer。

用法

<script type="text/JavaScript">
If (navigator.userAgent.indexOf(“MSIE”)>0)
    { 
         // Run custom code for Internet Explorer.
    }
</script>
图 1. 用于确定浏览器是否为 Internet Explorer* 的代码片段

使用 hasFeature 方法确定浏览器是否支持特定功能。例如,以下是如何确定浏览器是否支持触控事件(这也适用于 IE 10):

var touchSupported = document.implementation.hasFeature("touch-events","3.0");

其中“touch-events”是我们正在检查的功能,“3.0”是我们感兴趣的 DOM 规范级别。然后,应用程序可以监听以下触控事件touchstarttouchendtouchmovetouchcancel。 

参考hasFeature 方法

要使用基于 WebKit 的浏览器(Chrome、Safari 等)处理触控事件,只需设置以下三个事件以涵盖主要输入状态:

canvas.addEventListener( ‘touchstart’, onTouchStart, false );
canvas.addEventListener( ‘touchmove’, onTouchMove, false);
canvas.addEventListener( ‘touchend’, onTouchEnd, false);

对于 Internet Explorer,请改为参考 MSPointer 事件

canvas.addEventListener( ‘MSPointerDown’, onTouchStart, false );
canvas.addEventListener( ‘MSPointerMove’, onTouchMove, false);
canvas.addEventListener( ‘MSPointerUp’, onTouchEnd, false);

同样,还有手势事件监听器。它们是针对非 IE 10 浏览器的 gestureStartgestureChangegestureEnd

下载 MSDN 上处理 DOM 指针事件的示例代码:输入 DOM 指针事件处理示例

Internet Explorer 10 及其与 Windows 7 的兼容性

虽然 IE 10 不使用 WebKit,但它建立在 DOM 级别 3 事件、HTML5 和 Progress Event 标准之上。本节提供了有关 IE 10 以及它在 Windows 7 上如何交互的信息。

标准

Windows 7 上的 Internet Explorer 10 将触控和笔输入作为模拟鼠标输入处理以下文档对象模型 (DOM) 事件:

  • MSPointerCancel
  • MSPointerDown
  • MSPointerMove
  • MSPointerOver
  • MSPointerUp

Windows 7 上的 IE 10 不会触发以下任何 DOM 手势事件:

  • MSGestureChange
  • MSGestureEnd
  • MSGestureHold
  • MSGestureStart
  • MSGestureTap
  • MSManipulationStateChanged

表 5. Internet Explorer* 10 的触控界面

接口Windows* 7
MSVS 2010
Windows 8
MSVS 2012 (桌面)
Windows 8 Modern UI备注

MSGESTURE

  • 轻松获取高级手势,例如按住、平移和点按,而无需单独捕获每个指针事件

MSPOINTER

  • DOM 对象模型 (DOM) 核心的一部分
  • getCurrentPointgetIntermediatePoints 方法都检索 PointerPoint 对象的集合,并且仅在 Windows 8 上可用。

有关为 IE 10 开发支持触控的 Web 应用程序的更多信息 (MSDN):Internet Explorer 10 开发者指南

MSDN 上的示例代码:输入:操作和手势 (JavaScript)

识别触控能力

无论应用程序是原生应用程序还是 Web 应用程序,开发者都希望添加对硬件触控能力的检查,以便应用程序可以适当地配置其 UI。使用以下方法测试触控能力。

Windows 7 和 Windows 8 桌面

针对 Windows 7 或 Windows 8 桌面的应用程序可以调用 GetSystemMetrics 并以 SM_DIGITIZER 作为参数。以下代码片段是可从 Intel Developer Zone 下载的触控示例的一部分:Windows 桌面触控

void SDKSample::DeviceCaps::Touch::TouchGetSettings_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    Button^ b = safe_cast<Button^>(sender);
    if (b != nullptr)
    {
        TouchCapabilities^ pTouchCapabilities = ref new TouchCapabilities();
        Platform::String^ Buffer;

        Buffer = "There is " + (pTouchCapabilities->TouchPresent != 0 ? "a" : "no") + " 
              digitizer presentn";
        Buffer += "The digitizer supports " + pTouchCapabilities->Contacts.ToString() + " 
              contactsn";

        TouchOutputTextBlock->Text = Buffer;
    }
}
图 3. Windows* UI 识别触控能力的示例

Web 应用程序

对于 Internet Explorer,请使用如下所述的 msMaxTouchPoints 属性:

测试触控硬件能力


If (navigator.msMaxTouchPoints) {…}

测试多点触控硬件能力


If (navigator.msMaxTouchPoints >1) {…}

获取硬件支持的最大触控点数


Var touchPoints = navigator.msMaxTouchPoints;

对于 Chrome 和 Safari,请使用以下方法(与上面相同,但将 msMaxTouchPoints 替换为 maxTouchPoints

var result = navigator.maxTouchPoints;

从 Web 应用程序中通用地测试触控设备可能会有些棘手。虽然某些功能在某些浏览器上运行良好,但其他功能在没有触控时也指示存在触控,例如,如果浏览器本身支持触控,即使设备不支持触控,它也可能报告触控可用。

请注意,在 Windows 7 上运行的 IE 10(桌面)中,MaxTouchPoints 将返回 0。

参考文献

针对支持触控的 Ultrabook 设备的 UI 设计

为 Ultrabook 设备设计的应用程序可能需要处理点按、平移、缩放等手势。支持触控的应用程序很少处理原始指针数据,除了将其传递给手势检测。

新应用程序应以触控作为主要输入方式进行设计。鼠标和触控笔支持不需要额外的工作;但是,软件开发者在设计触控优化应用程序时应考虑其他几个因素。

表 6. 触控支持应用程序的注意事项

参考文献

    // Check for Touch support
    // Get the Touch Capabilities by calling GetSystemMetrics
    BYTE digitizerStatus = (BYTE)GetSystemMetrics(SM_DIGITIZER);
    // Hardware touch capability (0x80); readiness (0x40)
    if ((digitizerStatus & (0x80 + 0x40)) != 0) //Stack Ready + MultiTouch
    {
        RegisterTouchWindow(m_pWindow->GetHWnd(), TWF_WANTPALM);
    }
图 2. Windows* 7 识别触控能力的示例

请注意,GetSystemMetrics 可用于查找可用触控点的最大数量。

	BYTE nInputs = (BYTE)GetSystemMetrics(SM_MAXIMUMTOUCHES);

Windows 8 (Windows 应用商店应用程序)

通过使用 TouchCapabilities 类确定 Windows 应用商店应用程序的触控能力。以下代码片段可在 MSDN 上的代码示例中找到,该示例演示了其用法:输入:设备能力示例

参考文献

因素触摸鼠标/触控笔

精度

  • 指尖的接触区域比单个 x-y 坐标大得多。
  • 接触区域的形状随移动而变化
  • 没有鼠标光标帮助瞄准
  • 鼠标/触控笔提供精确的 x-y 坐标
  • 键盘焦点是显式的

人体解剖学

  • 指尖运动不精确
  • 触控表面某些区域可能难以触及
  • 对象可能被一个或多个指尖遮挡
  • 使用鼠标/触控笔进行直线运动更容易
  • 鼠标/触控笔可以触及屏幕的任何部分
  • 间接输入设备不会造成遮挡

对象状态

  • 触控使用两态模型。触控表面要么被触控,要么没有。没有可以触发额外视觉反馈的悬停状态。
  • 有三种状态可用:开启、关闭、悬停(焦点)

丰富的交互

  • 多点触控 – 提供多个输入点(指尖)。
  • 仅支持单个输入点。

软件开发者应在交互过程中提供适当的视觉反馈,以便用户能够识别、学习并适应应用程序和操作系统如何解释他们的交互。视觉反馈对用户很重要,可以让他们知道他们的交互是否成功,从而提高他们的控制感。这有助于减少错误并帮助用户理解系统和输入设备。

开发触控应用程序的资源

Intel Developer Zone 上的相关文章

  1. 比较触控编码技术 – Windows 8 桌面触控示例
  2. 探索 Windows* 8 应用程序的触控示例
  3. Windows* 8 应用商店触控代码示例
  4. Windows* 8 桌面触控代码示例
  5. 将 Win32 应用程序移植到 Windows 8 桌面
  6. 带触摸屏的实时战略游戏

MSDN 上的相关文章

  1. Windows 7 触控输入编程指南
  2. 架构概述 (Windows 7)
  3. 故障排除应用程序
  4. 在非托管代码中添加操作支持
  5. Windows 触控示例
  6. 在 Windows 8* 中构建高级触控应用程序 (视频)
  7. Windows 8 SDK
  8. 输入:触控命中测试示例
  9. 桌面应用程序开发文档 (Windows)
  10. Windows 触控手势概述 (Windows)
  11. Windows 触控消息入门 (Windows)
  12. Get PointerTouchInfo 函数 (Windows)
  13. (MSDN) Internet Explorer 10 开发者指南

总结

希望开发支持触控的应用程序的开发者,无论其应用程序将原生运行还是作为 Web 应用程序,都需要清楚地了解可用的 API。本指南涵盖了适用于以下环境的接口:Windows 7、Windows 8 桌面、Windows Modern UI 以及在 Web 浏览器中运行的应用程序。虽然 Windows 7 中可以实现手势和操作,但应用程序开发者可能会发现 Windows 8 API(针对桌面和/或 Modern UI 的那些)为自动手势识别提供了最佳选择。

编写支持触控的 Web 应用程序的开发者需要检查其代码是否兼容 IE 10,因为 IE 10 有其自己的接口,必须用于处理触控、手势和操作。其他基于 Webkit 的浏览器也基于 DOM 级别 3 标准,并支持触控和手势事件。

本指南还涵盖了常见手势和操作交互的描述,并提供了一些开发支持触控应用程序的指南。

本文由 Gael Hofemeier 撰写。Gael 是 Intel 公司的一名布道师应用工程师。她的重点是提供为 Intel® 架构编写软件的开发者所需的技术内容。除了撰写内容,她还主持 Intel Developer Zone 上的 Business Client 论坛。

查看 Gael 的博客作者页面

Intel、Intel 标识、Ultrabook 和 Core 是英特尔公司在美国和/或其他国家的商标。

版权所有 © 2013 英特尔公司。保留所有权利。

*其他名称和品牌可能被声明为他人的财产。

© . All rights reserved.