Какие жесты обрабатывает Flutter?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Жесты в Flutter
Flutter предоставляет мощный и гибкий механизм обработки жестов пользователя. Система жестов в Flutter основана на двух основных уровнях: Pointer события и Gesture детектор.
Уровень Pointer событий
На самом низком уровне находятся pointer события, которые отслеживают взаимодействие пользователя с экраном:
- PointerDownEvent — палец коснулся экрана
- PointerMoveEvent — палец движется по экрану
- PointerUpEvent — палец поднят с экрана
- PointerCancelEvent — событие прервано системой
Для обработки этих событий используется виджет Listener:
Listener(
onPointerDown: (PointerDownEvent event) {
print("Палец коснулся: ${event.position}");
},
onPointerMove: (PointerMoveEvent event) {
print("Позиция: ${event.position}");
},
onPointerUp: (PointerUpEvent event) {
print("Палец поднят");
},
child: Container()
)
Высокоуровневые жесты (GestureDetector)
GestureDetector — это основной виджет для обработки жестов. Он распознает различные типы жестов и вызывает соответствующие коллбеки:
Одиночные касания:
- onTap — однократное касание
- onLongPress — долгое касание
- onDoubleTap — двойное касание
Движения:
- onPanStart — начало перетаскивания
- onPanUpdate — движение во время перетаскивания
- onPanEnd — конец перетаскивания
Масштабирование:
- onScaleStart — начало масштабирования
- onScaleUpdate — изменение масштаба
- onScaleEnd — конец масштабирования
GestureDetector(
onTap: () => print("Нажато!"),
onLongPress: () => print("Долгое нажатие"),
onDoubleTap: () => print("Двойной тап"),
onPanUpdate: (DragUpdateDetails details) {
print("Позиция: ${details.globalPosition}");
},
onScaleUpdate: (ScaleUpdateDetails details) {
print("Масштаб: ${details.scale}");
},
child: Container()
)
Специализированные детекторы
Flutter также предоставляет специальные виджеты:
- Draggable и DragTarget — для drag-and-drop операций
- FloatingActionButton — встроенная обработка нажатий
- Scrollable — автоматическое управление жестами прокрутки
- HorizontalDragGestureRecognizer и VerticalDragGestureRecognizer — для жестов в конкретном направлении
Система распознавания жестов (GestureRecognizer)
Для более сложных случаев используются GestureRecognizer — это низкоуровневый механизм, который позволяет создавать кастомные распознаватели жестов:
final tapRecognizer = TapGestureRecognizer();
tapRecognizer.onTap = () => print("Tap!");
RawGestureDetector(
gestures: {
TapGestureRecognizer: GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>(
() => TapGestureRecognizer(),
(recognizer) => recognizer.onTap = () => print("Tap!"),
)
},
child: Container()
)
Приоритет жестов
Жесты в Flutter имеют приоритет арены: когда несколько распознавателей конкурируют за событие, выигрывает наиболее специфичный жест. Это управляется через GestureArena.
Практические примеры
// Свайпы
GestureDetector(
onHorizontalDragEnd: (details) {
if (details.velocity.pixelsPerSecond.dx > 0) {
print("Свайп вправо");
} else {
print("Свайп влево");
}
},
child: Container()
)
Итоги
Flutter обрабатывает жесты через несколько слоев абстракции: от низкоуровневых pointer событий до высокоуровневых GestureDetector. Правильный выбор инструмента зависит от сложности требуемого функционала. Для большинства приложений достаточно GestureDetector, но для специфических случаев можно использовать Listener, RawGestureDetector или кастомные GestureRecognizer.