Поделиться через


Распознавание жеста касания

Распознаватель жестов касания .NET Multi-platform App UI (.NET MAUI) используется для обнаружения касаний и реализуется с TapGestureRecognizer помощью класса. Этот класс определяет приведенные ниже свойства.

  • ButtonsButtonsMaskтип , который определяет, активирует ли основная или вторичная кнопка мыши или оба, активирует жест в Android, Mac Catalyst и Windows. Дополнительные сведения см. в разделе "Определение маски кнопок".
  • Command, тип ICommand, который выполняется при распознавании касания.
  • CommandParameter с типом object, который передается как параметр в Command.
  • NumberOfTapsRequiredintтип, представляющий количество касаний, необходимых для распознавания жеста касания. Значение этого свойства по умолчанию равно 1.

Эти свойства поддерживаются объектами BindableProperty, то есть эти свойства можно указывать в качестве целевых для привязки и стилизации данных.

Класс TapGestureRecognizer также определяет событие, которое возникает Tapped при распознавании касания. Объект TappedEventArgs , который сопровождает Tapped событие, определяет Parameter свойство типа object , указывающее значение, переданное CommandParameter свойством, если определено. Объект TappedEventArgs также определяет Buttons свойство и GetPosition метод. Свойство Buttons имеет тип ButtonsMaskи может использоваться для определения того, активируется ли основная или вторичная кнопка мыши распознаватель жестов в Android, Mac Catalyst и Windows. Метод GetPosition возвращает Point? объект, представляющий позицию, в которой обнаружен жест касания. Дополнительные сведения о масках кнопок см. в разделе "Определение маски кнопки". Дополнительные сведения о методе см. в разделе "Получение позиции жестаGetPosition".

Предупреждение

Не TapGestureRecognizer удается распознать больше двойного касания в Windows.

Создание TapGestureRecognizer

View Чтобы распознать жест касания, создайте TapGestureRecognizer объект, обработайте Tapped событие и добавьте в коллекцию новый распознаватель GestureRecognizers жестов в представлении. В следующем примере кода показан присоединенный к объекту TapGestureRecognizerImage:

<Image Source="dotnet_bot.png">
    <Image.GestureRecognizers>
        <TapGestureRecognizer Tapped="OnTapGestureRecognizerTapped"
                              NumberOfTapsRequired="2" />
  </Image.GestureRecognizers>
</Image>

Код обработчика OnTapGestureRecognizerTapped событий должен быть добавлен в файл программной части:

void OnTapGestureRecognizerTapped(object sender, TappedEventArgs args)
{
    // Handle the tap
}

Эквивалентный код на C# выглядит так:

TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) =>
{
    // Handle the tap
};
Image image = new Image();
image.GestureRecognizers.Add(tapGestureRecognizer);

По умолчанию ответит Image на одиночные касания. NumberOfTapsRequired Если свойству присвоено значение больше одного, обработчик событий будет выполняться только в том случае, если касания происходят в течение заданного периода времени. Если второй (или последующий) касания не происходят в течение этого периода, они фактически игнорируются.

Определение маски кнопки

Объект TapGestureRecognizer имеет Buttons свойство типа, определяющее, ButtonsMaskактивирует ли основная или вторичная кнопка мыши или оба, активирует жест в Android, Mac Catalyst и Windows. Перечисление ButtonsMask определяет следующие члены:

  • Primary представляет основную кнопку мыши, которая обычно является левой кнопкой мыши.
  • Secondary представляет вторичную кнопку мыши, которая обычно является правой кнопкой мыши.

В следующем примере показано TapGestureRecognizer , как обнаружить касания с помощью вторичной кнопки мыши:

<Image Source="dotnet_bot.png">
    <Image.GestureRecognizers>
        <TapGestureRecognizer Tapped="OnTapGestureRecognizerTapped"
                              Buttons="Secondary" />
  </Image.GestureRecognizers>
</Image>

Обработчик событий для Tapped события может определить, какая кнопка активировала жест:

void OnTapGestureRecognizerTapped(object sender, TappedEventArgs args)
{
    // Handle the tap
    if (args.Buttons == ButtonsMask.Secondary)
    {
        // Do something
    }
}

Эквивалентный код на C# выглядит так:

TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer
{
    Buttons = ButtonsMask.Secondary
};
tapGestureRecognizer.Tapped += (s, e) =>
{
    // Handle the tap
    if (args.Buttons == ButtonsMask.Secondary)
    {
        // Do something
    }
};
Image image = new Image();
image.GestureRecognizers.Add(tapGestureRecognizer);

Предупреждение

В Windows свойство не TapGestureRecognizerButtonsSecondary учитывается NumberOfTapsRequired , если оно больше одного.

Кроме того, можно определить объект TapGestureRecognizer , чтобы основная или вторичная кнопка мыши активировала жест:

<TapGestureRecognizer Tapped="OnTapGestureRecognizerTapped"
                      Buttons="Primary,Secondary" />

Эквивалентный код на C# выглядит так:

TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer
{
    Buttons = ButtonsMask.Primary | ButtonsMask.Secondary
};

Получение позиции жеста

Положение, в котором произошло касание жеста, можно получить путем вызова GetPosition метода в объекте TappedEventArgs . Метод GetPosition принимает Element? аргумент и возвращает позицию в качестве Point? объекта:

void OnTapGestureRecognizerTapped(object sender, TappedEventArgs 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? объект, определяющий положение жеста касания в окне.