识别指针手势
.NET Multi-platform App UI (.NET MAUI) 指针手势识别器可以检测指针何时进入、退出视图以及在视图中的移动,它是使用 PointerGestureRecognizer 类实现的。 此类定义了以下属性:
- PointerEnteredCommand,类型为 ICommand,是当指针进入视图的边界区域时要调用的命令。
- PointerEnteredCommandParameter,类型为
object
,是传递给 PointerEnteredCommand 的参数。 - PointerExitedCommand,类型为 ICommand,是当视图边界区域中的指针离开该边界区域时要调用的命令。
- PointerExitedCommandParameter,类型为
object
,是传递给 PointerExitedCommand 的参数。 - PointerMovedCommand,类型为 ICommand,是指针在视图边界区域内移动时要调用的命令。
- PointerMovedCommandParameter,类型为
object
,是传递给 PointerMovedCommand 的参数。 - PointerPressedCommand,类型为 ICommand,是当指针启动视图内的按下操作时要调用的命令。
- PointerPressedCommandParameter 属于
object
类型,是传递给 PointerPressedCommand 的参数。 - PointerReleasedCommand,类型为 ICommand,是在视图内释放先前启动按下操作的指针时要调用的命令。
- PointerReleasedCommandParameter 属于
object
类型,是传递给 PointerReleasedCommand 的参数。
这些属性由 BindableProperty 对象提供支持,表示它们可以是数据绑定的目标,并可以设置样式。
PointerGestureRecognizer 类还定义以下事件:
- PointerEntered,当指针进入视图的边界区域时引发。
- PointerExited,当位于视图的边界区域中的指针离开该边界区域时引发。
- PointerMoved,当指针在视图的边界区域内移动时引发。
- PointerPressed,当指针在视图中启动按下操作时引发。
- PointerReleased,在视图内释放先前启动按下操作的指针时引发。
PointerEventArgs 对象随附事件,并定义 PlatformPointerEventArgs 类型的 PlatformArgs 属性,用于访问事件的平台特定参数。
在 Android 上,PlatformPointerEventArgs 类定义以下属性:
- 类型为 View 的
Sender
表示附加到事件的本机视图。 MotionEvent
,类型为 MotionEvent,指示附加到视图的本机事件或处理程序。
此外,PointerEventArgs 对象还定义了 GetPosition 方法,该方法会返回 Point?
对象,表示检测到手势时指针的位置。 有关 GetPosition 方法的详细信息,请参阅获取手势位置。
重要说明
Android、iPadOS、Mac Catalyst 和 Windows 支持指针手势识别。
.NET MAUI 还定义 PointerOver
视觉状态。 当鼠标光标悬停在视图上但未按下时,此状态可能会更改视图的视觉外观。 有关详细信息,请参阅视觉状态。
创建 PointerGestureRecognizer
要使 View 识别指针手势,请创建 PointerGestureRecognizer 对象,处理所需事件,并将手势识别器添加到视图上的 GestureRecognizers 集合中。 或者,创建 PointerGestureRecognizer 对象,将所需的命令绑定到 ICommand 实现,并将手势识别器添加到视图上的 GestureRecognizers 集合。
下面的代码示例显示附加到 Image 上的 PointerGestureRecognizer。 PointerGestureRecognizer 使用事件来响应指针手势的检测:
<Image Source="dotnet_bot.png">
<Image.GestureRecognizers>
<PointerGestureRecognizer PointerEntered="OnPointerEntered"
PointerExited="OnPointerExited"
PointerMoved="OnPointerMoved" />
</Image.GestureRecognizers>
</Image>
应将事件处理程序的代码添加到代码隐藏文件中:
void OnPointerEntered(object sender, PointerEventArgs e)
{
// Handle the pointer entered event
}
void OnPointerExited(object sender, PointerEventArgs e)
{
// Handle the pointer exited event
}
void OnPointerMoved(object sender, PointerEventArgs e)
{
// Handle the pointer moved event
}
等效 C# 代码如下:
PointerGestureRecognizer pointerGestureRecognizer = new PointerGestureRecognizer();
pointerGestureRecognizer.PointerEntered += (s, e) =>
{
// Handle the pointer entered event
};
pointerGestureRecognizer.PointerExited += (s, e) =>
{
// Handle the pointer exited event
};
pointerGestureRecognizer.PointerMoved += (s, e) =>
{
// Handle the pointer moved event
};
Image image = new Image();
image.GestureRecognizers.Add(pointerGestureRecognizer);
获取手势位置
可以通过在 PointerEventArgs 对象上调用 GetPosition 方法来获取指针手势发生的位置。 GetPosition 方法接受 Element?
参数,并将位置返回为 Point?
对象:
void OnPointerExited(object sender, PointerEventArgs e)
{
// Position inside window
Point? windowPosition = e.GetPosition(null);
// Position relative to an Image
Point? relativeToImagePosition = e.GetPosition(image);
// Position relative to the container view
Point? relativeToContainerPosition = e.GetPosition((View)sender);
}
Element?
参数定义获取位置应相对于的元素。 提供 null
值作为此参数意味着 GetPosition 方法将返回 Point?
对象,该对象定义指针手势在窗口内的位置。