识别指针手势

.NET Multi-platform App UI (.NET MAUI) 指针手势识别器可以检测指针何时进入、退出视图以及在视图中的移动,它是使用 PointerGestureRecognizer 类实现的。 此类定义了以下属性:

这些属性由 BindableProperty 对象提供支持;也就是说,它们可以作为数据绑定的目标,并能进行样式设置。

PointerGestureRecognizer 类还定义以下事件:

  • PointerEntered,当指针进入视图的边界区域时引发。
  • PointerExited,当位于视图的边界区域中的指针离开该边界区域时引发。
  • PointerMoved,当指针在视图的边界区域内移动时引发。

PointerEventArgs 对象随附事件,并定义 GetPosition 方法,该方法会返回 Point? 对象,该对象表示检测到手势时指针的位置。 有关 GetPosition 方法的详细信息,请参阅获取手势位置

  • PointerEntered,当指针进入视图的边界区域时引发。
  • PointerExited,当位于视图的边界区域中的指针离开该边界区域时引发。
  • PointerMoved,当指针在视图的边界区域内移动时引发。
  • PointerPressed,当指针在视图中启动按下操作时引发。
  • PointerReleased,在视图内释放先前启动按下操作的指针时引发。

PointerEventArgs 对象随附事件,并定义 PlatformPointerEventArgs 类型的 PlatformArgs 属性,用于访问事件的平台特定参数。

在 Android 上,PlatformPointerEventArgs 类定义以下属性:

  • 类型为 ViewSender 表示附加到事件的本机视图。
  • MotionEvent,类型为 MotionEvent,指示附加到视图的本机事件或处理程序。

此外,PointerEventArgs 对象还定义了 GetPosition 方法,该方法会返回 Point? 对象,表示检测到手势时指针的位置。 有关 GetPosition 方法的详细信息,请参阅获取手势位置

重要

Android、iPadOS、Mac Catalyst 和 Windows 支持指针手势识别。

.NET MAUI 还定义 PointerOver 视觉状态。 当鼠标光标悬停在视图上但未按下时,此状态可能会更改视图的视觉外观。 有关详细信息,请参阅视觉状态

创建 PointerGestureRecognizer

要使 View 识别指针手势,请创建 PointerGestureRecognizer 对象,处理所需事件,并将手势识别器添加到视图上的 GestureRecognizers 集合中。 或者,创建 PointerGestureRecognizer 对象,将所需的命令绑定到 ICommand 实现,并将手势识别器添加到视图上的 GestureRecognizers 集合。

下面的代码示例显示附加到 Image 上的 PointerGestureRecognizerPointerGestureRecognizer 使用事件来响应指针手势的检测:

<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? 对象,该对象定义指针手势在窗口内的位置。