Содержание
Жесты используются для управления приложением на мобильных устройствах. Сейчас уже трудно себе представить любое, даже самое простое мобильное приложение, например, в Android, которое бы не использовало в работе хотя бы один жест — касание (англ. Tap) или, как этот жест часто называют пользователи, — тап. В этой главе мы рассмотрим основные жесты, которые можно применять в приложениях .NET MAUI, а также компоненты XAML, реализующие те или иные возможности работы с жестами в наших приложениях.
Жесты в мобильных приложениях
Можно выделить следующие виды жестов, которые могут использоваться в мобильных приложениях:
- Tap (тап, касание) — касание или нажатие на сенсорный экран. Например, чтобы открыть приложение, нужно «тапнуть» на его иконку
- Double tap (двойной тап). Два коротких касания. Может использоваться для каких-то дополнительных действий в приложении и, как дополнительная защита от непреднамеренного нажатия.
- Multi tap (мультитап, многократное касание). Три и более тапа подряд по одному элементу
- Long Tap (лонгтап). Нажатие с удержанием на несколько секунд. Используется для того, чтобы открыть дополнительные опции там, где они есть. Например, чтобы открыть действия приложения.
- Scroll (скролл). Вертикальное пролистывание содержимого скольжением пальца по экрану сверху вниз или снизу вверх
- Swipe (свайп). Смахивание вниз, вверх, вправо или влево. Одна из функций этого жеста — показать или скрыть спрятанные панели, например, в списке писем, чтобы удалить письмо или ответить на него.
- Pull to refresh. Жест используется для обновления элементов интерфейса. Например, этот жест используется для обновления списков чего-либо (писем, покупок и т.д.) Дословный перевод: «потяни для обновления».
- Drag&Drop. Изменение положения элементов интерфейса с помощью перетягивания.
- Pinch. Жест, используемый для изменения масштаба картинки (увеличения или уменьшения). Для уменьшения два пальца касаются экрана и сводятся вместе, для увеличения — разводятся в стороны
Распознавание жестов в .NET MAUI
Некоторые элементы управления в .NET MAUI уже распознают жесты по умолчанию. Например, кнопки Button или ImageButton распознают жест Tap (иначе, мы не смогли бы «кликать» по кнопкам в мобильном приложении). Однако, при разработке приложений .NET MAUI нам можем потребоваться распознавание жестов для других компонентов, например, для текстовых меток (Label) или рамок (Border). В этом случае нам придется самостоятельно определять поведение элемента управления и настраивать распознавание жестов.
Каждый элемент, являющийся наследником View, содержит свойство:
public IList<IGestureRecognizer> GestureRecognizers { get; }
В свою очередь, .NET MAUI содержит ряд классов, реализующих интерфейс IGestureRecognizer и предназначенных для работы с конкретным видом жестов в приложении.
Чтобы продемонстрировать работу со свойством GestureRecognizers, создадим новое шаблонное приложение .NET MAUI. И изменим код главной страницы приложения следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp24.MainPage">
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Image
Source="dotnet_bot.png"
HeightRequest="185"
Aspect="AspectFit"
SemanticProperties.Description="dot net bot in a hovercraft number nine" />
<Label
Text="Hello, World!"
Style="{StaticResource Headline}"
SemanticProperties.HeadingLevel="Level1" >
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"></TapGestureRecognizer>
</Label.GestureRecognizers>
</Label>
<Button
x:Name="CounterBtn"
Text="Click me"
SemanticProperties.Hint="Counts the number of times you click"
Clicked="OnCounterClicked"
HorizontalOptions="Fill" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
Обратите внимание на код метки — здесь мы использовали свойство GestureRecognizers и добавили в список распознаваемых жестов TapGestureRecognizer у которого определили событие Tapped, которое генерируется при касании элемента. Обработчик события TapGestureRecognizer_Tapped будет выглядеть следующим образом:
private void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e)
{
count++;
if (count == 1)
CounterBtn.Text = $"Clicked {count} time";
else
CounterBtn.Text = $"Clicked {count} times";
}
Теперь запустите приложение и убедитесь, что клик по метке срабатывает и текст кнопки изменяется так же, как если бы вы просто тапали по ней. Аналогичным образом вы можете добавить распознавание жеста «касание» и для других элементов управления, которые по умолчанию такой жест не распознают.
Свойства и события класса TapGestureRecognizer
Ниже в таблице представлены свойства, которые предоставляет нам класс TapGestureRecognizer :
| Свойство | Тип | Описание |
Buttons |
ButtonsMask |
определяет, какой кнопкой мыши активирован жест. Может принимать следующие значения:
|
Command |
ICommand |
Команда, вызываемая при распознавании жеста |
Command |
object |
Параметр команды |
Number |
int |
Количество касаний, необходимых для срабатывания события Tapped |
Как только распознается жест «касание», генерируется следующее событие:
public event EventHandler<TappedEventArgs>? Tapped;
Например, перепишем наше приложение таким образом, чтобы касание по метке «засчитывалось» по двойному тапу. Изменим код метки следующим образом:
<Label
Text="Hello, World!"
Style="{StaticResource Headline}"
SemanticProperties.HeadingLevel="Level1" >
<Label.GestureRecognizers>
<TapGestureRecognizer NumberOfTapsRequired="2" Tapped="TapGestureRecognizer_Tapped"></TapGestureRecognizer>
</Label.GestureRecognizers>
</Label>
Теперь запустите приложение и убедитесь, что счётчик увеличивается на 1 только после того, как вы сделаете двойной тап по метке или, как обычно, тапните по кнопке.
Итого
Для распознавания жестов в .NET MAUI используется специальное свойство элементов управления — GestureRecognizers, которое содержит список объектов, каждый из которых отвечает за распознавание определенного жеста. Самый простой жест — касание, распознается с использованием объекта TapGestureRecognizer .