识别平移手势

.NET Multi-platform App UI (.NET MAUI) 平移手势识别器可检测屏幕周围的手指移动,并可用于将该移动应用于内容。 平移手势的常见使用场景是水平和垂直平移图像,以便在小于图像尺寸的视区中显示图像内容时,可以查看所有图像内容。 这可通过在视区内移动图像来完成。

在 .NET MAUI 中,平移手势识别由 PanGestureRecognizer 类提供。 此类定义 TouchPoints 属性,类型为 int,表示手势中的触摸点数。 此属性的默认值为 1。 此属性由 BindableProperty 对象提供支持,这意味着它可以作为数据绑定的目标,并进行样式设置。

PanGestureRecognizer 类还定义了在检测到的平移手势发生更改时引发的 PanUpdated 事件。 此事件附带的 PanUpdatedEventArgs 对象定义以下属性:

  • GestureId,类型为 int,表示引发事件的手势的 ID。
  • StatusType,类型为 GestureStatus,指示是否已为新启动的手势、正在运行的手势、已完成的手势或已取消的手势引发事件。
  • TotalX,类型为 double,指示手势开始后 X 方向上的总体变化。
  • TotalY,类型为 double,指示手势开始后 Y 方向上的总体变化。

创建 PanGestureRecognizer

若要使 View 识别平移手势,请创建一个 PanGestureRecognizer 对象,处理 PanUpdated 事件,并将新的手势识别器添加到视图上的 GestureRecognizers 集合。 下面的代码示例展示了附加到 Image 上的 PanGestureRecognizer

<Image Source="monkey.jpg">
    <Image.GestureRecognizers>
        <PanGestureRecognizer PanUpdated="OnPanUpdated" />
    </Image.GestureRecognizers>
</Image>

OnPanUpdated 事件处理程序的代码应添加到代码隐藏文件中:

void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
    // Handle the pan
}

等效 C# 代码如下:

PanGestureRecognizer panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += (s, e) =>
{
    // Handle the pan
};
image.GestureRecognizers.Add(panGesture);

创建平移容器

任意形式的平移通常适用于在图像或地图内导航。 以下示例所示的 PanContainer 类是执行任意形式的平移的通用帮助程序类:

public class PanContainer : ContentView
{
    double panX, panY;

    public PanContainer()
    {
        // Set PanGestureRecognizer.TouchPoints to control the
        // number of touch points needed to pan
        PanGestureRecognizer panGesture = new PanGestureRecognizer();
        panGesture.PanUpdated += OnPanUpdated;
        GestureRecognizers.Add(panGesture);
    }

    void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {
        switch (e.StatusType)
        {
            case GestureStatus.Running:
                // Translate and pan.
                double boundsX = Content.Width;
                double boundsY = Content.Height;
                Content.TranslationX = Math.Clamp(panX + e.TotalX, -boundsX, boundsX);
                Content.TranslationY = Math.Clamp(panY + e.TotalY, -boundsY, boundsY);
                break;

            case GestureStatus.Completed:
                // Store the translation applied during the pan
                panX = Content.TranslationX;
                panY = Content.TranslationY;
                break;
        }
    }
}

在此示例中,OnPanUpdated 方法根据用户的平移手势更新包装视图的可查看内容。 这是通过以下方式来实现的:使用 PanUpdatedEventArgs 实例的 TotalXTotalY 属性的值来计算平移的方向和距离。 然后,通过将包装的用户元素的 TranslationXTranslationY 属性设置为已计算值,对该元素进行平移。 对未占据整个屏幕的元素中的内容进行平移时,可以从该元素的 HeightWidth 属性中获取视区的高度和宽度。

PanContainer 类可以包装在 View 周围,以便识别的平移手势将平移包装视图。 以下 XAML 示例演示了包装 ImagePanContainer

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:PanGesture"
             x:Class="PanGesture.MainPage">
    <AbsoluteLayout>
        <local:PanContainer>
            <Image Source="monkey.jpg" WidthRequest="1024" HeightRequest="768" />
        </local:PanContainer>
    </AbsoluteLayout>
</ContentPage>

在此示例中,当 Image 接收到平移手势时,将平移显示的图像。