PanResponder¶
PanResponder объединяет несколько касаний в один жест. Он делает жесты с одним касанием устойчивыми к дополнительным касаниям и может использоваться для распознавания основных жестов с несколькими касаниями.
По умолчанию PanResponder содержит хэндл InteractionManager, чтобы блокировать длительные события JS от прерывания активных жестов.
Он представляет собой предсказуемую обертку обработчиков, предоставляемых gesture responder system. Для каждого обработчика он предоставляет новый объект gestureState наряду с собственным объектом события:
1 | |
Нативное событие — это синтетическое событие касания с формой PressEvent.
Объект gestureState имеет следующее:
stateID— идентификатор состояния жеста — сохраняется до тех пор, пока на экране есть хотя бы одно касание.moveX— последние экранные координаты недавно перемещенного касанияmoveY— последние экранные координаты недавно перемещенного касанияx0— координаты экрана отвечающего грантаy0— экранные координаты отвечающего грантаdx— накопленное расстояние жеста с момента начала касанияdy— накопленное расстояние жеста с момента начала касанияvx— текущая скорость жестаvy— текущая скорость жестаnumberActiveTouches— количество касаний, находящихся в данный момент на экране
Шаблон использования¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | |
Пример¶
PanResponder работает с API Animated, чтобы помочь создать сложные жесты в пользовательском интерфейсе. Следующий пример содержит анимированный компонент View, который можно свободно перетаскивать по экрану
Попробуйте использовать пример PanResponder в RNTester.
Методы¶
create()¶
1 | |
Параметры:
| Имя | Тип | Описание |
|---|---|---|
config (обязательно) | object | Refer below |
Объект config предоставляет расширенные версии всех обратных вызовов ответчика, которые обеспечивают не только PressEvent, но и состояние жеста PanResponder, путем замены слова Responder на PanResponder в каждом из типичных обратных вызовов onResponder*. Например, объект config будет выглядеть следующим образом:
onMoveShouldSetPanResponder: (e, gestureState) => {...}onMoveShouldSetPanResponderCapture: (e, gestureState) => {...}onStartShouldSetPanResponder: (e, gestureState) => {...}onStartShouldSetPanResponderCapture: (e, gestureState) => {...}onPanResponderReject: (e, gestureState) => {...}onPanResponderGrant: (e, gestureState) => {...}onPanResponderStart: (e, gestureState) => {...}onPanResponderEnd: (e, gestureState) => {...}onPanResponderRelease: (e, gestureState) => {...}onPanResponderMove: (e, gestureState) => {...}onPanResponderTerminate: (e, gestureState) => {...}.onPanResponderTerminationRequest: (e, gestureState) => {...}.onShouldBlockNativeResponder: (e, gestureState) => {...}.
В общем, для событий, имеющих эквиваленты захвата, мы обновляем gestureState один раз в фазе захвата и можем использовать его также в фазе пузыря.
Будьте осторожны с обратными вызовами onStartShould*. Они отражают обновленное gestureState только для событий начала/окончания, которые передаются узлу в пузырьке/захвате. Как только узел станет ответчиком, вы можете рассчитывать на то, что каждое событие начала/окончания будет обработано жестом и gestureState будет обновлено соответствующим образом. (NumberActiveTouches) может быть не совсем точным, если только вы не являетесь ответчиком.