注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

MSDN Blog:现代化 Windows 8 中的输入  

2012-07-31 11:02:13|  分类: Windows 8 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在 Windows 8 中,我们开始着手实现输入平台的现代化。我们想要确保这种平台的开发更加直观,同时还要构建一种基础,随着 Windows 和应用的演进而不断发展并支持新的输入形式。

为了实现目的,我们回到基础,重点把握指导设计的核心原则。在本博客中,我们将与你们分享这些原则的重要意义,以及在 Windows 8 中如何利用平台来构建优秀的应用。

平台原则

Windows 从来都是构建在系统之上的应用的反映。通过全世界的应用,不计其数的用户体验了 Windows,而在 Windows 8 中,用户群将会更加庞大。在 Windows 8 中,绝大多数的操作系统功能都能通过应用体验来提供。因而,应用需要以更加可预见的方式与用户进行交互,从而增强用户的信心。同样,开发流程和平台也需要具有一致性而可预见性。我们在博客在 Windows 7 硬件上体验 Windows 8 触摸功能触控硬件和 Windows 8 中讲述了硬件方面的进展,同时还讨论了一些方面的反馈。我们知道,一个成功的平台必须具备易于开发、风格一致和激发信心的特性,同时还要有广泛的应用范围,这样才能让您淋漓尽致地发挥自己的创造力。我们一开始就制定了下列原则:

广泛的应用范围

您要能够轻松地定位到尽可能多的设备。从输入平台的角度看,这意味着我们需要支持广泛的输入类型(鼠标、触控、手写笔、触摸板)和设备(平板电脑、一体机、台式计算机、笔记本电脑、双用型计算机)。Windows 就是这样一款广泛而成功的平台,因为它支持多不胜数的外形因素和设备。反之而言,其他设备必须能够轻松地定位到这种平台。

一致性和信心

我们希望给您带来一致且自信的体验。作为一名应用开发人员,您不应教导用户如何使用新的交互或输入范例。您应能够利用一致的 Windows 范围内体验,相信您的用户已经知道如何与您的应用进行交互。这样可以增进用户对应用和生态系统的信心,让您的生活变得更加轻松惬意。

易于开发

不管是什么平台,如果过于复杂、不一致,或者存在开发难题,都不能称之为成功平台。我们将易于开发作为我们的指导原则之一。

输入平台简介

输入平台内建于各层之中。最底层是 Windows 运行时输入 API,提供大多数功能和灵活性。在底层之上构建的是 HTML 和 XAML 框架中的手势和指针事件,用于为应用提供常用手势和原始数据事件。最后,应用模板和控件提供了可在许多情况下使用的基本功能。

MSDN Blog:现代化 Windows 8 中的输入 - 乂乂 - 一个人,一支烟  ·~~
图 1:输入平台。顶层层面重点关注主要情形,底下的层面逐渐增加灵活性和功能。

大多数时候,您只需使用应用模板和我们的 HTML 以及 XAML 控件,如 ListView 或 SemanticZoom。这为开发人员提供了基本的功能,同时还实现了对常见交互模式(如触控语言)、触摸定位、可访问性、工具集成等内容的支持。

特别是,最常见的触控情形之一是平移和缩放,在 Windows 8 中,HTML 和 XAML 的滚动视图控件与行为(如惯性)一起实现了内容边界的反弹特性,以及您可以控制的吸附点。这些行为还为您提供了“粘在手指上”的特性,该特性内建于称为 DirectManipulation 的底层组件中。例如,Windows 8 中的开始菜单即利用此支持构建而成。

比如说您要构建一款游戏、一个自定义控件、执行自定义虚拟化、为 3D 操作创建手势,或者执行需要原始数据的操作或在 Windows 8 手势的顶层构建的其他任务,则要从指针和手势框架事件(HTML 和 XAML)开始。手势既包括点击之类的简单交互,也包括同时进行缩放、平移和旋转之类的复杂交互。在 Windows 8 中,指针 API(我们随后会详细讨论)实现了一种获取鼠标、触控和手写笔数据的简单途径。对这些事件的访问简化了在应用中使用 Windows 8 交互语言的工作。

最后,Windows 运行时输入 API 位于堆栈的底层。这些 API(GestureRecognizerPointerPointPointerDevice)提供了全面的灵活性和控制能力,从而让您获得对原始输入数据及其相关属性、全部手势及手势配置、指针设备 API 等的完整访问权限。输入的 WinRT API 表面是在所有其他层面提供的内容的超集,因此,丰富了内容并增强了功能。全面发挥您的创造力!

输入平台背后的概念是跨所有 Metro 应用框架进行共享,同时 API 表面非常相似。这是因为,我们希望简化在框架之间传递知识的过程。完成编写一款 Metro 风格 HTML 应用后,您可以像在 Metro 风格 XAML 应用中处理输入一样进行处理,或者直接在 CoreWindow 的顶层进行构建。

在接下来几个部分中,我们将主要讲述输入平台的两个底层,并引入平台底层的一些概念以及必须做出改变的重要原因。

指针 – 统一输入

鼠标是一种简单的输入设备,特别是与触控相比。它具有位置和几个按钮状态。触控的处理更加自然,另一方面,开始增加对鼠标来说不存在的复杂性。用户可以同时使用多个手指,而您需要一些方式来区分不同手指的输入流。鼠标具有一种悬停状态,但是当今市面上的大多数触控设备不支持悬停。触控也具有一些非常有意思的应用属性,比如说触控的接触几何。与鼠标相比,手指更加粗笨,精确度也更低。在我们研究鼠标、触控和手写笔的过程中,我们发现现有的 API 和方法显然不能满足需求。

我们很快就认识到,考虑现有的输入方法很有意义,包括“指针输入”,如鼠标、触控和手写笔;还有“文本输入”,如键盘和手写或语音识别等。我们还将其他有趣的输入设备(如 Surface 和 Kinect)纳入了考虑范围,逐渐发现了这些设备和形式之间的一些共同点。我们将指针输入的方法整合到一个一致的 API 表面(我们称为指针)。这成为了我们的一个范式转换,为鼠标、触控和手写笔创造了一致、简单的体验,同时遵循我们的平台原则。

以非常简单的绘图应用为例,该应用要处理多个输入的向下、移动和向上事件。如果要对触控、手写笔和鼠标做出响应,一个简捷的平台可能强制让您编写 9 个不同的多余事件处理程序。下面是您在这种简捷平台中可能会编写的示例开头:

// BAD! Don’t do this in your code.
class NaivePlatform
{
Dictionary<uint, Polyline> strokes = new Dictionary <uint, Polyline>();
Canvas PaintArea = new Canvas();

void OnMouseDown(MouseEventArgs e) { CommonDownHandler(e.Id, e.Position); }
void OnMouseMove(MouseEventArgs e) { CommonMoveHandler(e.Id, e.Position); }
void OnMouseUp(MouseEventArgs e) { CommonUpHandler(e.Id, e.Position); }

void OnPenDown(PenEventArgs e) { CommonDownHandler(e.Id, e.Position); }
void OnPenMove(PenEventArgs e) { CommonMoveHandler(e.Id, e.Position); }
void OnPenUp(PenEventArgs e) { CommonUpHandler(e.Id, e.Position); }

void OnTouchDown(TouchEventArgs e) { CommonDownHandler(e.Id, e.Position); }
void OnTouchMove(TouchEventArgs e) { CommonMoveHandler(e.Id, e.Position); }
void OnTouchUp(TouchEventArgs e) { CommonUpHandler(e.Id, e.Position); }

void CommonDownHandler(uint pointerId, Point position)
{
// Create a new stroke for this pointer and set its basic properties
var stroke = new Polyline();
stroke.Points.Add(position);
stroke.Stroke = new SolidColorBrush(Colors.Red);
stroke.StrokeThickness = 3;

// Add the stroke to dictionary so we can update it in CommonMoveHandler
strokes[pointerId] = stroke;

// Add the stroke to the canvas so that it is rendered
PaintArea.Children.Add(stroke);
}

void CommonMoveHandler(uint pointerId, Point position)
{
try
{
// Update the stroke associated to this pointer with the new point
strokes[pointerId].Points.Add(position);
}
catch (KeyNotFoundException)
{
// this pointer is not painting - ignore it
}
}

void CommonUpHandler(uint pointerId, Point position)
{
// This stroke is completed, so remove it from the dictionary.
// It will still be rendered because we are not removing it from the canvas.
strokes.Remove(pointerId);
}
}

很显然,这种代码质量低劣,而且易于产生复制粘贴错误。还要注意,这只是一个极其简化的示例。一个真实的绘图应用还要处理诸如取消事件和回滚笔划等。如果要使用笔压或触控接触几何来影响墨迹,则会很难使用常用的事件处理程序。这可能导致您要在原始输入数据上创建某些抽象内容,并且可能发现自己要构建像指针一样的对象。

在绘图应用的指针版本中,您反而有一组简单的向下、移动和向上处理程序:

// GOOD! Do this instead of the previous code.
void OnPointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
// Retrieve current point, in the coordinate system of the painting area
var currentPoint = e.GetCurrentPoint(PaintArea);

// Create new stroke for this pointer and set its basic properties
var stroke = new Windows.UI.Xaml.Shapes.Polyline();
stroke.Points.Add(currentPoint.Position);
stroke.Stroke = new Windows.UI.Xaml.Media.SolidColorBrush(Windows.UI.Colors.Red);
stroke.StrokeThickness = 3;

// Add the stroke to dictionary so we can update it in PointerMoved event handler
strokes[currentPoint.PointerId] = stroke;

// Add the stroke to the painting area so that it is rendered
PaintArea.Children.Add(stroke);
}

void OnPointerMoved(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
// Retrieve current point, in the coordinate system of the painting area
var currentPoint = e.GetCurrentPoint(PaintArea);

try
{
// Update the stroke associated to this pointer with the new point
strokes[currentPoint.PointerId].Points.Add(currentPoint.Position);
}
catch (System.Collections.Generic.KeyNotFoundException)
{
// this pointer is not painting - ignore it
}
}

void OnPointerReleased(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
// Retrieve current point, in the coordinate system of the painting area
var currentPoint = e.GetCurrentPoint(PaintArea);

// This stroke is completed, remove it from the dictionary.
// It will still be rendered because we are not removing it from PaintArea.
strokes.Remove(currentPoint.PointerId);
}

代表触控、手写笔和鼠标输入的指针事件具有基本的常用属性,如输入的位置、类型以及相关的 ID。每种形式都有需要与其指针事件相关联的独特数据。例如,手写笔可能具有压力或倾斜信息,鼠标通常具有更多按钮状态,而像 Surface 之类的设备则可以嵌入标记或视觉数据。我们添加了可使这些唯一数据与指针一起公开的功能。如果有触控输入产生的指针数据,则其中包含如位置和指针 ID 之类的属性,以及如触控的接触矩形之类的触控数据。

这一组合开始开发一组更一致的 API,从而让大部分指针输入代码保持通用和简单,同时还能带来具有输入差异的体验。一个典型的示例是笔记应用。笔具有墨迹,触控可以平移和缩放,而鼠标可能具有传统的选择模型。每种形式都会表现出各自的独特性,但是代码始终简单直观。

考虑一下 Web,指针对 Metro 风格 HTML 应用和浏览器(Metro 风格和桌面)来说都是公开的。这些环境仍然支持 W3C 标准(如典型的鼠标事件),但是与指针相比,这些环境提供的功能有限。指针显然对以后的输入类型来说是可扩展的,同时避免了由于为各种新输入方法添加新对象(例如,TouchEvent、TouchList 和 Touch)的潮流所引发的膨胀问题。我们对指针在此处必须提供的功能感到非常兴奋。

在 Win8 中,一个促进工作的原则是快速流畅。如果输入堆栈缓慢拖沓,则无法完成其他操作。我们竭尽全力地消除触控输入处理产生的任何缓冲或延迟,同时,我们还投入了大量的资金来全面提升触控相关堆栈的性能。这些努力很快就带来了回报,即 Windows 8 中的无延迟输入。在 Windows 8 硬件上,端到端的延迟(从与数字化转换器接触的手指到显示器变化响应)介于 60-70 毫秒之间。输入堆栈需要占用其中的 1-2 毫秒!

MSDN Blog:现代化 Windows 8 中的输入 - 乂乂 - 一个人,一支烟  ·~~
图 2:Windows 8 中的平均触控性能投资领域

指针及其与手势系统的交互对性能提升的帮助非常大。它本身就与我们的平台原则相符,同时还能简化对大量输入发送自动触及的处理,减少要编写的代码量,而且有助于缓解开发困境。

手势 – 让触控语言成为应用的一部分

我们都对手势很熟悉;许多用户想都不想就知道在 Web 浏览器上平移和通过点击来启动应用。对于我们来说,手势是 Windows 8 交互语言的一种表达形式。通过手势可以获取用户输入,并将输入映射到应用和系统中的自然操作。

手势输入显然是构建在指针之上。许多应用都是使用手势的对象,处理点击、平移和缩放,而与相关的原始指针数据关系不大,只是传递这些数据进行手势检测。

再考虑一下输入平台的层次,每一个级别都支持一组一致的手势,这些手势正好反映了 Windows 8 交互语言。在大多数情况下,您不需要教导用户学习新的概念,他们就会使用您的应用。

MSDN Blog:现代化 Windows 8 中的输入 - 乂乂 - 一个人,一支烟  ·~~
图 3:Windows 8 交互语言。注意它如何映射到支持的手势集。

在 Windows 8 中,我们的模型是默认为所有应用提供指针输入,并让其选择要馈送到手势检测的数据集,如何配置该手势检测,以及如何处理输出。这种灵活性让您更容易准确地构建设想的体验。

我们的交互语言注重直接操作的原则,内容应“粘在手指上”。操作可实现这一点。从平台的角度而言,手势是指我们认识并为其提供通知的任何交互。操作就是这些类型的手势之一,与其他手势(如长按)相对应。操作是转换、缩放和旋转变化(线性代数思想的 2D 仿射转换)的组合。对于新“开始”体验的示例,如果您平移,实际上就是一种操作。如果您放下第二根手指饼开始缩放,则也是操作。不仅如此,我们很容易表达从一根手指交互到两根手指的交互,以及平移与缩放之间的转换(或两者相结合)。

HTML 和 XAML 框架为您提供了手势事件,这些事件可以满足大多数需求。如果您需要更多控件,例如额外的配置选项,请使用 Windows 运行时 GestureRecognizer。首先,您可以按照如下进行配置:

C#
// C#
public GestureManager(Windows.UI.Xaml.Shapes.Rectangle target, Windows.UI.Xaml.UIElement parent)
{
// Configure gesture recognizer
gestureRecognizer = new Windows.UI.Input.GestureRecognizer();
gestureRecognizer.GestureSettings =
Windows.UI.Input.GestureSettings.Hold |
Windows.UI.Input.GestureSettings.ManipulationRotate |
Windows.UI.Input.GestureSettings.ManipulationRotateInertia |
Windows.UI.Input.GestureSettings.ManipulationScale |
Windows.UI.Input.GestureSettings.ManipulationScaleInertia |
Windows.UI.Input.GestureSettings.ManipulationTranslateInertia |
Windows.UI.Input.GestureSettings.ManipulationTranslateX |
Windows.UI.Input.GestureSettings.ManipulationTranslateY |
Windows.UI.Input.GestureSettings.RightTap |
Windows.UI.Input.GestureSettings.Tap;

// Register event handlers for gestures
gestureRecognizer.ManipulationStarted += OnManipulationStarted;
gestureRecognizer.ManipulationUpdated += OnManipulationUpdated;
gestureRecognizer.ManipulationInertiaStarting += OnManipulationInertiaStarting;
gestureRecognizer.ManipulationCompleted += OnManipulationCompleted;
gestureRecognizer.Holding += OnHolding;
gestureRecognizer.RightTapped += OnRightTapped;
gestureRecognizer.Tapped += OnTapped;
}

JavaScript
// JS
function GestureManager(target, parent) {
var gestureRecognizer = new Windows.UI.Input.GestureRecognizer;

// Configure GestureRecognizer
gestureRecognizer.gestureSettings =
Windows.UI.Input.GestureSettings.hold |
Windows.UI.Input.GestureSettings.manipulationRotate |
Windows.UI.Input.GestureSettings.manipulationRotateInertia |
Windows.UI.Input.GestureSettings.manipulationScale |
Windows.UI.Input.GestureSettings.manipulationScaleInertia |
Windows.UI.Input.GestureSettings.manipulationTranslateInertia |
Windows.UI.Input.GestureSettings.manipulationTranslateX |
Windows.UI.Input.GestureSettings.manipulationTranslateY |
Windows.UI.Input.GestureSettings.rightTap |
Windows.UI.Input.GestureSettings.tap;

// Register event handlers for gestures
gestureRecognizer.addEventListener('manipulationstarted', onManipulationStarted);
gestureRecognizer.addEventListener('manipulationupdated', onManipulationUpdated);
gestureRecognizer.addEventListener('manipulationcompleted', onManipulationCompleted);
gestureRecognizer.addEventListener('manipulationinertiastarting',
onManipulationInertiaStarting);
gestureRecognizer.addEventListener('manipulationinertiacompleted',
onManipulationInertiaCompleted);
gestureRecognizer.addEventListener('holding', onHolding);
gestureRecognizer.addEventListener('tapped', onTapped);
gestureRecognizer.addEventListener('righttapped', onRightTapped);
}

在其核心中,交互应用最感兴趣的是手势。对于大多数应用,流程是声明应用寻找的手势,获取应用所见的指针数据,通过手势检测运行,并处理这些手势。

在此代码段中,可以看到所有指针数据是如何馈送到手势检测的,而不需要检查输入类型或执行任何特定类型的处理:

C#

// C#
void OnPointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
var currentPoint = e.GetCurrentPoint(parent);

// Make target capture the pointer associated to this event
target.CapturePointer(e.Pointer);

// Route the event to the gesture recognizer
gestureRecognizer.ProcessDownEvent(currentPoint);
}

void OnPointerMoved(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
// Route the event to the gesture recognizer
// We pass all intermediate points that might have been coalesced
// in a single PointerMove event.
gestureRecognizer.ProcessMoveEvents(e.GetIntermediatePoints(parent));
}

void OnPointerReleased(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
var currentPoint = e.GetCurrentPoint(parent);

// Route the event to the gesture recognizer
gestureRecognizer.ProcessUpEvent(currentPoint);

// Release pointer capture on the pointer associated to this event
target.ReleasePointerCapture(e.Pointer);
}

void OnPointerWheelChanged(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
var currentPoint = e.GetCurrentPoint(parent);
bool shift = (e.KeyModifiers & Windows.System.VirtualKeyModifiers.Shift) ==
Windows.System.VirtualKeyModifiers.Shift;
bool ctrl = (e.KeyModifiers & Windows.System.VirtualKeyModifiers.Control) ==
Windows.System.VirtualKeyModifiers.Control;

// Route the event to the gesture recognizer
gestureRecognizer.ProcessMouseWheelEvent(currentPoint, shift, ctrl);
}

JavaScript

// JS
function onPointerDown(evt) {
// Make target capture the pointer associated to this event
target.msSetPointerCapture(evt.pointerId);

// Route the event to the gesture recognizer
gestureRecognizer.processDownEvent(evt.getCurrentPoint(parent));
}

function onPointerMove(evt) {
// Route the event to the gesture recognizer
// We pass all intermediate points that might have been coalesced
// in a single PointerMove event.
gestureRecognizer.processMoveEvents(evt.getIntermediatePoints(parent));
}

function onPointerUp(evt) {
// Route the event to the gesture recognizer
gestureRecognizer.processUpEvent(evt.getCurrentPoint(parent));
}

function onWheel(evt) {
// Route the event to the gesture recognizer
gestureRecognizer.processMouseWheelEvent(evt.getCurrentPoint(parent), evt.shiftKey,
evt.ctrlKey);
}

对于文档查看应用(如 Word),您主要对平移和缩放感兴趣。可以为这两个操作组件配置手势识别(忽略旋转)。当主视图上的指针数据传入时,应用将其传递给手势识别,然后手势识别返回操作已启动的事件指示,即继续(可能转换为中间状态)或已结束。

编写代码以跨形式和设备扩大应用范围

指针的概念让我们对输入编程有了不同的想法。指针有助于通过减少需要的代码量来实现易于开发性,它可以让您的应用更快地进入应用商店,此外,它还通过让您的应用轻松地定位到多种输入设备而扩大覆盖面。同时,它还让您可以采用更简单的视图来处理输入。我们把其中一种表现形式亲切地称为“代码处理触控,让系统来处理其他任务”。

代码处理触控(或称 CFT)是我们重新思考输入的结果,并且已经成为了我们的主要指导思想。也许更准确的表达是“代码处理指针,轻松获得触控和默认的鼠标以及手写笔行为”,CFT 可让您编写简单的代码来处理统一的指针事件,并且不必担心多余的处理程序来处理所有三种主要指针输入。如果您有特定的输入行为,或者想要除操作系统默认提供的行为之外的行为,也可以实现。

我们在前文中讲述的每种指针事件都证明了实际的 CFT。对于输入类型而言,所有手势示例的指针处理程序都是不可知的。它们通常获取指针数据、设置捕获、执行点击测试或其他状态管理,然后将指针输入传递给手势识别。

C#

// C#
void OnPointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
var currentPoint = e.GetCurrentPoint(parent);

// Make target capture the pointer associated to this event
target.CapturePointer(e.Pointer);

// Route the event to the gesture recognizer
gestureRecognizer.ProcessDownEvent(currentPoint);
}

JavaScript

// JS
function onPointerDown(evt) {
// Make target capture the pointer associated to this event
target.msSetPointerCapture(evt.pointerId);

// Route the event to the gesture recognizer
gestureRecognizer.processDownEvent(evt.getCurrentPoint(parent));
}

CFT 不仅可以扩大覆盖面和简化开发工作。它还对一致性和信心有直接的影响。例如,如果您为点击配置手势检测,则可以实现通过所有三种输入形式发起的点击。SecondaryTap 的配置将鼠标(单击右键)、触控(长按)和手写笔(长按或筒状按钮点击)的“类似单击右键的手势”映射到统一的事件。

下面是从手势示例中摘录的一个片段,显示了 Tap 和 RightTap 手势处理程序:

C#

// C#
void OnTapped(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.TappedEventArgs
args)
{
byte[] rgb = new byte[3];

// Randomly change the color of target
randomGenerator.NextBytes(rgb);
target.Fill = new
Windows.UI.Xaml.Media.SolidColorBrush(Windows.UI.ColorHelper.FromArgb(255,
rgb[0], rgb[1], rgb[2]));
}

void OnRightTapped(Windows.UI.Input.GestureRecognizer sender,
Windows.UI.Input.RightTappedEventArgs args)
{
// Restore original values
target.Fill = initialBrush;
InitManipulationTransforms();
}

JavaScript

// JS
function onTapped(evt) {
target.style.backgroundColor = getNextColorFromColor(target.style.backgroundColor);
}

function onRightTapped(evt) {
// Reset target to its initial state (transform, color)
target.style.backgroundColor = target.initialColor;
target.style.msTransform = target.initialTransform;
}

在这些事件处理程序中都没有指针类型的检查。这样让您无需执行额外的工作即可触发来自各种输入类型的相应输入。

结束语

探索平台时,我们希望您轻松地发现您需要的内容,输入经过了精心设计,因此,这种最简单的方式同时也是可以在应用中利用一致 Windows 体验的方式。

输入平台利用一种原则性方法进行设计,目标是简化开发、保持一致性和信心,同时扩大覆盖面。指针和 CFT 之类的概念可以节省您的时间和编写代码的工作量。手势检测可以让您在应用中轻松地使用 Windows 8 交互语言,并为用户提供一致性和信心。平台和框架中的类似概念可以为开发人员提供一致性。CFT 及其在指针中的表现形式和手势 API 让您可以轻松地覆盖设备。

我们对我们在 Windows 8 中付诸的努力感到兴奋不已,希望您能够喜欢!

要了解输入平台的详细信息,请阅读我们的文档、下载示例,或者在论坛上提问。

谢谢!

-- Windows 高级项目经理 Reed Townsend

其他资源

链接

类型

要点

快速入门:触控输入

快速入门

在应用中处理触控和手势的概述

输入:DOM 指针和手势事件处理示例

示例

指针的 HTML 支持、使用 HTML5 Canvas 元素、实现绘图功能、处理指针事件

XAML 用户输入事件示例

示例

指针和手势的 XAML 支持、实现绘图功能、指针事件和捕获、手势事件、操作

输入:使用 C++ 的操作和手势

示例

使用 Windows 运行时 GestureRecognizer、PointerPointer 和 PointerDevice 类,在 CoreWindow 上构建

输入:使用 JavaScript 的操作和手势

示例

在一个简单的 HTML 游戏中使用 Winndows 运行时 GestureRecognizer 和 PointerPoint

HTML 框架指针和手势事件

文档

诸如 onmspointerdown、onmsgesturetap、onmsgesturestart 和 onmsgestureend 事件

XAML 框架指针和手势事件

文档

诸如 PointerPressed、Tapped 和 ManipulationStarted 事件

GestureRecognizerPointerPointPointerDevice

文档

关于指针和手势的 Windows 运行时类的完整文档

【from  http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/07/11/windows-8-modernizing-input.aspx 】
  评论这张
 
阅读(1196)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017