GestureRecognizer 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供手势和操作识别、事件侦听器和设置。
public ref class GestureRecognizer sealed
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
class GestureRecognizer final
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class GestureRecognizer final
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class GestureRecognizer final
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
public sealed class GestureRecognizer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class GestureRecognizer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class GestureRecognizer
function GestureRecognizer()
Public NotInheritable Class GestureRecognizer
- 继承
- 属性
Windows 要求
设备系列 |
Windows 10 (在 10.0.10240.0 中引入)
|
API contract |
Windows.Foundation.UniversalApiContract (在 v1.0 中引入)
|
示例
在这里,我们设置了一个 GestureRecognizer 对象,其中包含用于处理指针和笔势输入的输入事件处理程序的集合。 有关如何侦听和处理Windows 运行时事件的详细信息,请参阅事件和路由事件概述。 有关完整实现,请参阅 基本输入示例 。
class ManipulationInputProcessor
{
GestureRecognizer recognizer;
UIElement element;
UIElement reference;
TransformGroup cumulativeTransform;
MatrixTransform previousTransform;
CompositeTransform deltaTransform;
public ManipulationInputProcessor(GestureRecognizer gestureRecognizer, UIElement target, UIElement referenceFrame)
{
recognizer = gestureRecognizer;
element = target;
reference = referenceFrame;
// Initialize the transforms that will be used to manipulate the shape
InitializeTransforms();
// The GestureSettings property dictates what manipulation events the
// Gesture Recognizer will listen to. This will set it to a limited
// subset of these events.
recognizer.GestureSettings = GenerateDefaultSettings();
// Set up pointer event handlers. These receive input events that are used by the gesture recognizer.
element.PointerPressed += OnPointerPressed;
element.PointerMoved += OnPointerMoved;
element.PointerReleased += OnPointerReleased;
element.PointerCanceled += OnPointerCanceled;
// Set up event handlers to respond to gesture recognizer output
recognizer.ManipulationStarted += OnManipulationStarted;
recognizer.ManipulationUpdated += OnManipulationUpdated;
recognizer.ManipulationCompleted += OnManipulationCompleted;
recognizer.ManipulationInertiaStarting += OnManipulationInertiaStarting;
}
public void InitializeTransforms()
{
cumulativeTransform = new TransformGroup();
deltaTransform = new CompositeTransform();
previousTransform = new MatrixTransform() { Matrix = Matrix.Identity };
cumulativeTransform.Children.Add(previousTransform);
cumulativeTransform.Children.Add(deltaTransform);
element.RenderTransform = cumulativeTransform;
}
// Return the default GestureSettings for this sample
GestureSettings GenerateDefaultSettings()
{
return GestureSettings.ManipulationTranslateX |
GestureSettings.ManipulationTranslateY |
GestureSettings.ManipulationRotate |
GestureSettings.ManipulationTranslateInertia |
GestureSettings.ManipulationRotateInertia;
}
// Route the pointer pressed event to the gesture recognizer.
// The points are in the reference frame of the canvas that contains the rectangle element.
void OnPointerPressed(object sender, PointerRoutedEventArgs args)
{
// Set the pointer capture to the element being interacted with so that only it
// will fire pointer-related events
element.CapturePointer(args.Pointer);
// Feed the current point into the gesture recognizer as a down event
recognizer.ProcessDownEvent(args.GetCurrentPoint(reference));
}
// Route the pointer moved event to the gesture recognizer.
// The points are in the reference frame of the canvas that contains the rectangle element.
void OnPointerMoved(object sender, PointerRoutedEventArgs args)
{
// Feed the set of points into the gesture recognizer as a move event
recognizer.ProcessMoveEvents(args.GetIntermediatePoints(reference));
}
// Route the pointer released event to the gesture recognizer.
// The points are in the reference frame of the canvas that contains the rectangle element.
void OnPointerReleased(object sender, PointerRoutedEventArgs args)
{
// Feed the current point into the gesture recognizer as an up event
recognizer.ProcessUpEvent(args.GetCurrentPoint(reference));
// Release the pointer
element.ReleasePointerCapture(args.Pointer);
}
// Route the pointer canceled event to the gesture recognizer.
// The points are in the reference frame of the canvas that contains the rectangle element.
void OnPointerCanceled(object sender, PointerRoutedEventArgs args)
{
recognizer.CompleteGesture();
element.ReleasePointerCapture(args.Pointer);
}
// When a manipulation begins, change the color of the object to reflect
// that a manipulation is in progress
void OnManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
Border b = element as Border;
b.Background = new SolidColorBrush(Windows.UI.Colors.DeepSkyBlue);
}
// Process the change resulting from a manipulation
void OnManipulationUpdated(object sender, ManipulationUpdatedEventArgs e)
{
previousTransform.Matrix = cumulativeTransform.Value;
// Get the center point of the manipulation for rotation
Point center = new Point(e.Position.X, e.Position.Y);
deltaTransform.CenterX = center.X;
deltaTransform.CenterY = center.Y;
// Look at the Delta property of the ManipulationDeltaRoutedEventArgs to retrieve
// the rotation, X, and Y changes
deltaTransform.Rotation = e.Delta.Rotation;
deltaTransform.TranslateX = e.Delta.Translation.X;
deltaTransform.TranslateY = e.Delta.Translation.Y;
}
// When a manipulation that's a result of inertia begins, change the color of the
// the object to reflect that inertia has taken over
void OnManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
{
Border b = element as Border;
b.Background = new SolidColorBrush(Windows.UI.Colors.RoyalBlue);
}
// When a manipulation has finished, reset the color of the object
void OnManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
Border b = element as Border;
b.Background = new SolidColorBrush(Windows.UI.Colors.LightGray);
}
// Modify the GestureSettings property to only allow movement on the X axis
public void LockToXAxis()
{
recognizer.CompleteGesture();
recognizer.GestureSettings |= GestureSettings.ManipulationTranslateY | GestureSettings.ManipulationTranslateX;
recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateY;
}
// Modify the GestureSettings property to only allow movement on the Y axis
public void LockToYAxis()
{
recognizer.CompleteGesture();
recognizer.GestureSettings |= GestureSettings.ManipulationTranslateY | GestureSettings.ManipulationTranslateX;
recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateX;
}
// Modify the GestureSettings property to allow movement on both the X and Y axes
public void MoveOnXAndYAxes()
{
recognizer.CompleteGesture();
recognizer.GestureSettings |= GestureSettings.ManipulationTranslateX | GestureSettings.ManipulationTranslateY;
}
// Modify the GestureSettings property to enable or disable inertia based on the passed-in value
public void UseInertia(bool inertia)
{
if (!inertia)
{
recognizer.CompleteGesture();
recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateInertia | GestureSettings.ManipulationRotateInertia;
}
else
{
recognizer.GestureSettings |= GestureSettings.ManipulationTranslateInertia | GestureSettings.ManipulationRotateInertia;
}
}
public void Reset()
{
element.RenderTransform = null;
recognizer.CompleteGesture();
InitializeTransforms();
recognizer.GestureSettings = GenerateDefaultSettings();
}
}
示例
存档的示例
注解
可以在应用启动时为每个适当的元素创建手势对象。 但是,此方法可能无法很好地缩放,具体取决于需要创建的手势对象的数量 (例如,) 包含数百块的拼图。
在这种情况下,可以在 pointerdown 事件上动态创建手势对象,并在 MSGestureEnd 事件上销毁它们。 此方法可很好地缩放,但由于创建和释放这些对象,会产生一些开销。
或者,可以静态分配和动态管理可重用手势对象的池。
注意
此类不是敏捷类,这意味着需要考虑其线程模型和封送处理行为。 有关详细信息,请参阅线程处理和封送处理 (C++/CX) 和在多线程环境中使用 Windows 运行时 对象 (.NET) 。
有关如何使用跨幻灯片功能的更多详细信息,请参阅 交叉幻灯片指南。 下图中显示了横向滑动交互使用的阈值距离。
仅当检测到单个指针输入时,才会使用 PivotRadius 和 PivotCenter 属性。 它们对多个指针输入没有影响。 应在交互期间定期更新这些属性的值。
仅当通过 GestureSettings 属性设置 manipulationRotate 时,GestureRecognizer 才支持旋转。
如果 PivotRadius 的值设置为 0,则单指针输入不支持旋转。
版本历史记录
Windows 版本 | SDK 版本 | 已添加值 |
---|---|---|
2004 | 19041 | HoldMaxContactCount |
2004 | 19041 | HoldMinContactCount |
2004 | 19041 | HoldRadius |
2004 | 19041 | HoldStartDelay |
2004 | 19041 | TapMaxContactCount |
2004 | 19041 | TapMinContactCount |
2004 | 19041 | TranslationMaxContactCount |
2004 | 19041 | TranslationMinContactCount |
构造函数
GestureRecognizer() |
初始化 GestureRecognizer 对象的新实例。 |
属性
AutoProcessInertia |
获取或设置一个值,该值指示是否自动生成惯性期间的操作。 |
CrossSlideExact |
获取或设置一个值,该值指示是否报告从交叉滑动交互的初始接触到结束的确切距离。默认情况下,从系统报告的跨滑交互的第一个位置中减去小距离阈值。 如果设置了此标志,则不会从初始位置减去距离阈值。 注意 此距离阈值旨在说明在初始检测后接触点的任何轻微移动。 它可帮助系统区分交叉滑动和平移,并帮助确保点击手势也不会被解释为两者。 |
CrossSlideHorizontally |
获取或设置一个值,该值指示横滑轴是否为水平。 |
CrossSlideThresholds |
获取或设置指示 CrossSliding 交互的距离阈值的值。 |
GestureSettings |
获取或设置一个值,该值指示应用程序支持的手势和操作设置。 |
HoldMaxContactCount |
获取或设置识别 Windows.UI.Input.GestureRecognizer.Holding 事件所需的最大接触点数。 |
HoldMinContactCount |
获取或设置识别 Windows.UI.Input.GestureRecognizer.Holding 事件所需的最小接触点数。 |
HoldRadius |
获取或设置为 Windows.UI.Input.GestureRecognizer.Holding 事件识别的接触点的半径。 |
HoldStartDelay |
获取或设置 Windows.UI.Input.GestureRecognizer.Holding 事件识别联系人的时间阈值。 |
InertiaExpansion |
获取或设置一个值,该值指示在调整大小或缩放完成) 时,从惯性开始到惯性结束 (对象大小的相对变化。 |
InertiaExpansionDeceleration |
获取或设置一个值,该值指示在调整大小或扩展操作完成) 时,从惯性开始到惯性结束 (的减速速率。 |
InertiaRotationAngle |
获取或设置一个值,该值指示当旋转操作完成) 时,在惯性 (结束时对象的最终旋转角度。 |
InertiaRotationDeceleration |
获取或设置一个值,该值指示当旋转操作完成) 时,从惯性开始到惯性结束 (的减速率。 |
InertiaTranslationDeceleration |
获取或设置一个值,该值指示转换操作完成时从惯性开始到惯性结束 () 减速率。 |
InertiaTranslationDisplacement |
获取或设置一个值,该值指示当转换操作完成) 时,对象的屏幕位置从惯性开始到惯性结束 (的相对变化。 |
IsActive |
获取一个值,该值指示是否正在处理交互。 |
IsInertial |
获取一个值,该值指示在惯性期间是否仍在处理操作, (没有活动输入点) 。 |
ManipulationExact |
获取或设置一个值,该值指示是否报告从初始接触到交互结束的确切距离。 默认情况下,从系统报告的第一个增量中减去较小的距离阈值。 此距离阈值旨在考虑在处理点击手势时接触点的轻微移动。 如果设置了此标志,则不会从第一个增量中减去距离阈值。 |
MouseWheelParameters |
获取与鼠标设备的滚轮按钮关联的一组属性。 |
PivotCenter |
获取或设置当检测到单个指针输入时旋转交互的中心点。 |
PivotRadius |
获取或设置从 透视中心 到指针输入的半径,以便在检测到单个指针输入时进行旋转交互。 |
ShowGestureFeedback |
获取或设置一个值,该值指示在交互期间是否显示视觉反馈。 |
TapMaxContactCount |
获取或设置识别 Windows.UI.Input.GestureRecognizer.Tapped 事件所需的最大接触点数。 |
TapMinContactCount |
获取或设置识别 Windows.UI.Input.GestureRecognizer.Tapped 事件所需的最小接触点数。 |
TranslationMaxContactCount |
获取或设置识别翻译 (或平移) 事件所需的最大接触点数。 |
TranslationMinContactCount |
获取或设置识别翻译 (或平移) 事件所需的最小接触点数。 |
方法
CanBeDoubleTap(PointerPoint) |
标识是否仍可将点击解释为双击手势的第二次点击。 |
CompleteGesture() |
使手势识别器完成交互。 |
ProcessDownEvent(PointerPoint) |
处理指针输入,并引发适用于由 GestureSettings 属性指定的手势和操作的指针向下操作的 GestureRecognizer 事件。 |
ProcessInertia() |
执行惯性计算并引发各种惯性事件。 |
ProcessMouseWheelEvent(PointerPoint, Boolean, Boolean) |
处理指针输入,并引发适用于由 GestureSettings 属性指定的手势和操作的鼠标滚轮操作的 GestureRecognizer 事件。 |
ProcessMoveEvents(IVector<PointerPoint>) |
处理指针输入,并引发适用于由 GestureSettings 属性指定的笔势和操作的指针移动操作的 GestureRecognizer 事件。 |
ProcessUpEvent(PointerPoint) |
处理指针输入,并引发适用于由 GestureSettings 属性指定的手势和操作的指针向上操作的 GestureRecognizer 事件。 |
事件
CrossSliding |
当用户在仅支持沿单轴平移的内容区域内通过单个触摸接触) 执行 滑动 或 轻扫 手势 (时发生。 手势必须以垂直于此平移轴的方向发生。 注意 轻扫是一种短滑动手势,它会导致选择操作,而较长的滑动手势越过距离阈值并导致重新排列操作。 下图演示了轻扫和滑动手势。 |
Dragging | |
Holding |
当用户使用一次触摸、鼠标或笔/触笔接触) 执行按住手势 (时发生。 |
ManipulationCompleted |
当提升输入点并且通过惯性 (平移、扩展或旋转) 的所有后续运动已结束时发生。 |
ManipulationInertiaStarting |
当在操作过程中抬起所有接触点,并且操作速度足以启动惯性行为, (转换、扩展或旋转在) 提升输入指针后继续时发生。 |
ManipulationStarted |
当一个或多个输入点已启动并且随后的运动 (平移、扩展或旋转) 已开始时发生。 |
ManipulationUpdated |
在启动一个或多个输入点且后续运动 (平移、扩展或旋转) 进行之后发生。 |
RightTapped |
无论输入设备如何,指针输入都解释为右键单击手势时发生。
|
Tapped |
当指针输入被解释为点击手势时发生。 |