react-native-gesture-handler 2.4.1 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +4 -2
- package/RNGestureHandler.podspec +17 -5
- package/android/build.gradle +71 -15
- package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +2 -1
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +9 -5
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +32 -6
- package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +5 -2
- package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +105 -23
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +30 -2
- package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +3 -2
- package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +0 -8
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +74 -84
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +7 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +5 -1
- package/android/src/main/jni/CMakeLists.txt +59 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +12 -9
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +1 -0
- package/ios/Handlers/RNFlingHandler.m +43 -1
- package/ios/Handlers/{RNNativeViewHandler.m → RNNativeViewHandler.mm} +13 -1
- package/ios/Handlers/RNPanHandler.m +27 -0
- package/ios/RNGestureHandler.h +1 -0
- package/ios/RNGestureHandler.m +22 -4
- package/ios/RNGestureHandlerButtonComponentView.mm +1 -1
- package/ios/RNGestureHandlerManager.mm +10 -7
- package/ios/RNGestureHandlerModule.mm +4 -1
- package/ios/RNGestureHandlerRootViewComponentView.mm +1 -1
- package/ios/RNManualActivationRecognizer.m +10 -3
- package/ios/RNRootViewGestureRecognizer.m +12 -1
- package/lib/commonjs/EnableExperimentalWebImplementation.js +24 -0
- package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -0
- package/lib/commonjs/RNGestureHandlerModule.macos.js +138 -0
- package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -0
- package/lib/commonjs/RNGestureHandlerModule.web.js +87 -25
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/RNRenderer.js +16 -0
- package/lib/commonjs/RNRenderer.js.map +1 -0
- package/lib/commonjs/RNRenderer.web.js +11 -0
- package/lib/commonjs/RNRenderer.web.js.map +1 -0
- package/lib/commonjs/components/DrawerLayout.js +41 -12
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/GestureButtons.js +42 -9
- package/lib/commonjs/components/GestureButtons.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js +41 -4
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.web.js +7 -2
- package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js +3 -1
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js +5 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js +2 -1
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PanGestureHandler.js +1 -1
- package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PressabilityDebugView.js +14 -0
- package/lib/commonjs/handlers/PressabilityDebugView.js.map +1 -0
- package/lib/commonjs/handlers/PressabilityDebugView.web.js +12 -0
- package/lib/commonjs/handlers/PressabilityDebugView.web.js.map +1 -0
- package/lib/commonjs/handlers/createHandler.js +33 -12
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js +150 -75
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js +13 -2
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gestureStateManager.js +13 -9
- package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
- package/lib/commonjs/handlers/gestures/panGesture.js +5 -0
- package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +7 -0
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/commonjs/index.js +14 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils.js +6 -3
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/commonjs/web/constants.js +3 -51
- package/lib/commonjs/web/constants.js.map +1 -1
- package/lib/commonjs/web/detectors/RotationGestureDetector.js +169 -0
- package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -0
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js +167 -0
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -0
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +154 -0
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/GestureHandler.js +538 -0
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +147 -0
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +116 -0
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/PanGestureHandler.js +451 -0
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/PinchGestureHandler.js +171 -0
- package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/RotationGestureHandler.js +187 -0
- package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/TapGestureHandler.js +296 -0
- package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -0
- package/lib/commonjs/web/interfaces.js +34 -0
- package/lib/commonjs/web/interfaces.js.map +1 -0
- package/lib/commonjs/web/tools/EventManager.js +169 -0
- package/lib/commonjs/web/tools/EventManager.js.map +1 -0
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +283 -0
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -0
- package/lib/commonjs/web/tools/InteractionManager.js +102 -0
- package/lib/commonjs/web/tools/InteractionManager.js.map +1 -0
- package/lib/commonjs/web/tools/NodeManager.js +48 -0
- package/lib/commonjs/web/tools/NodeManager.js.map +1 -0
- package/lib/commonjs/web/tools/PointerTracker.js +132 -0
- package/lib/commonjs/web/tools/PointerTracker.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/Errors.js +0 -0
- package/lib/commonjs/{web → web_hammer}/Errors.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/GestureHandler.js +83 -42
- package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
- package/lib/commonjs/web_hammer/NativeViewGestureHandler.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/NodeManager.js +0 -0
- package/lib/commonjs/web_hammer/NodeManager.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js.map +0 -0
- package/lib/commonjs/web_hammer/constants.js +64 -0
- package/lib/commonjs/web_hammer/constants.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/utils.js +0 -0
- package/lib/commonjs/{web → web_hammer}/utils.js.map +1 -1
- package/lib/module/EnableExperimentalWebImplementation.js +15 -0
- package/lib/module/EnableExperimentalWebImplementation.js.map +1 -0
- package/lib/module/RNGestureHandlerModule.macos.js +102 -0
- package/lib/module/RNGestureHandlerModule.macos.js.map +1 -0
- package/lib/module/RNGestureHandlerModule.web.js +73 -24
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/RNRenderer.js +4 -0
- package/lib/module/RNRenderer.js.map +1 -0
- package/lib/module/RNRenderer.web.js +4 -0
- package/lib/module/RNRenderer.web.js.map +1 -0
- package/lib/module/components/DrawerLayout.js +41 -12
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/GestureButtons.js +43 -9
- package/lib/module/components/GestureButtons.js.map +1 -1
- package/lib/module/components/GestureComponents.js +39 -4
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/GestureComponents.web.js +6 -2
- package/lib/module/components/GestureComponents.web.js.map +1 -1
- package/lib/module/components/Swipeable.js +3 -1
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/components/touchables/GenericTouchable.js +5 -1
- package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/module/handlers/ForceTouchGestureHandler.js +1 -1
- package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
- package/lib/module/handlers/PanGestureHandler.js +1 -1
- package/lib/module/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/handlers/PressabilityDebugView.js +3 -0
- package/lib/module/handlers/PressabilityDebugView.js.map +1 -0
- package/lib/module/handlers/PressabilityDebugView.web.js +5 -0
- package/lib/module/handlers/PressabilityDebugView.web.js.map +1 -0
- package/lib/module/handlers/createHandler.js +35 -14
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +147 -74
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js +13 -2
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/gestureStateManager.js +13 -9
- package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
- package/lib/module/handlers/gestures/panGesture.js +5 -0
- package/lib/module/handlers/gestures/panGesture.js.map +1 -1
- package/lib/module/handlers/gestures/reanimatedWrapper.js +7 -0
- package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils.js +2 -1
- package/lib/module/utils.js.map +1 -1
- package/lib/module/web/constants.js +1 -36
- package/lib/module/web/constants.js.map +1 -1
- package/lib/module/web/detectors/RotationGestureDetector.js +159 -0
- package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -0
- package/lib/module/web/detectors/ScaleGestureDetector.js +156 -0
- package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -0
- package/lib/module/web/handlers/FlingGestureHandler.js +139 -0
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/GestureHandler.js +521 -0
- package/lib/module/web/handlers/GestureHandler.js.map +1 -0
- package/lib/module/web/handlers/LongPressGestureHandler.js +133 -0
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/NativeViewGestureHandler.js +103 -0
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/PanGestureHandler.js +434 -0
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/PinchGestureHandler.js +155 -0
- package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/RotationGestureHandler.js +171 -0
- package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/TapGestureHandler.js +281 -0
- package/lib/module/web/handlers/TapGestureHandler.js.map +1 -0
- package/lib/module/web/interfaces.js +26 -0
- package/lib/module/web/interfaces.js.map +1 -0
- package/lib/module/web/tools/EventManager.js +160 -0
- package/lib/module/web/tools/EventManager.js.map +1 -0
- package/lib/module/web/tools/GestureHandlerOrchestrator.js +270 -0
- package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -0
- package/lib/module/web/tools/InteractionManager.js +93 -0
- package/lib/module/web/tools/InteractionManager.js.map +1 -0
- package/lib/module/web/tools/NodeManager.js +39 -0
- package/lib/module/web/tools/NodeManager.js.map +1 -0
- package/lib/module/web/tools/PointerTracker.js +122 -0
- package/lib/module/web/tools/PointerTracker.js.map +1 -0
- package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/DraggingGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/Errors.js +0 -0
- package/lib/module/{web → web_hammer}/Errors.js.map +0 -0
- package/lib/module/{web → web_hammer}/FlingGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/GestureHandler.js +83 -42
- package/lib/module/web_hammer/GestureHandler.js.map +1 -0
- package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/LongPressGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
- package/lib/module/web_hammer/NativeViewGestureHandler.js.map +1 -0
- package/lib/module/{web → web_hammer}/NodeManager.js +0 -0
- package/lib/module/web_hammer/NodeManager.js.map +1 -0
- package/lib/module/{web → web_hammer}/PanGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/PanGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/PinchGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/PressGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/PressGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/RotationGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/TapGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/TapGestureHandler.js.map +0 -0
- package/lib/module/web_hammer/constants.js +43 -0
- package/lib/module/web_hammer/constants.js.map +1 -0
- package/lib/module/{web → web_hammer}/utils.js +0 -0
- package/lib/module/{web → web_hammer}/utils.js.map +1 -1
- package/lib/typescript/EnableExperimentalWebImplementation.d.ts +2 -0
- package/lib/typescript/RNGestureHandlerModule.macos.d.ts +44 -0
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +29 -18
- package/lib/typescript/RNRenderer.d.ts +1 -0
- package/lib/typescript/RNRenderer.web.d.ts +3 -0
- package/lib/typescript/components/DrawerLayout.d.ts +4 -1
- package/lib/typescript/components/GestureButtons.d.ts +22 -0
- package/lib/typescript/components/GestureComponents.d.ts +7 -3
- package/lib/typescript/components/GestureComponents.web.d.ts +1 -0
- package/lib/typescript/components/Swipeable.d.ts +1 -1
- package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +1 -0
- package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -2
- package/lib/typescript/handlers/PanGestureHandler.d.ts +2 -1
- package/lib/typescript/handlers/PressabilityDebugView.d.ts +1 -0
- package/lib/typescript/handlers/PressabilityDebugView.web.d.ts +1 -0
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +1 -0
- package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +3 -0
- package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -0
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/web/constants.d.ts +1 -33
- package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +30 -0
- package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +30 -0
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +31 -0
- package/lib/typescript/web/handlers/GestureHandler.d.ts +84 -0
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +33 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +16 -0
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +68 -0
- package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +30 -0
- package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +30 -0
- package/lib/typescript/web/handlers/TapGestureHandler.d.ts +49 -0
- package/lib/typescript/web/interfaces.d.ts +97 -0
- package/lib/typescript/web/tools/EventManager.d.ts +28 -0
- package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +28 -0
- package/lib/typescript/web/tools/InteractionManager.d.ts +13 -0
- package/lib/typescript/web/tools/NodeManager.d.ts +11 -0
- package/lib/typescript/web/tools/PointerTracker.d.ts +28 -0
- package/lib/typescript/{web → web_hammer}/DiscreteGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/DraggingGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/Errors.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/FlingGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/GestureHandler.d.ts +6 -0
- package/lib/typescript/{web → web_hammer}/IndiscreteGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/LongPressGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/NativeViewGestureHandler.d.ts +1 -0
- package/lib/typescript/web_hammer/NodeManager.d.ts +8 -0
- package/lib/typescript/{web → web_hammer}/PanGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/PinchGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/PressGestureHandler.d.ts +2 -0
- package/lib/typescript/{web → web_hammer}/RotationGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/TapGestureHandler.d.ts +1 -0
- package/lib/typescript/web_hammer/constants.d.ts +39 -0
- package/lib/typescript/{web → web_hammer}/utils.d.ts +0 -0
- package/package.json +1 -1
- package/src/EnableExperimentalWebImplementation.ts +18 -0
- package/src/RNGestureHandlerModule.macos.ts +114 -0
- package/src/RNGestureHandlerModule.web.ts +89 -26
- package/src/RNRenderer.ts +3 -0
- package/src/RNRenderer.web.ts +3 -0
- package/src/components/DrawerLayout.tsx +37 -14
- package/src/components/GestureButtons.tsx +64 -0
- package/src/components/GestureComponents.tsx +66 -6
- package/src/components/GestureComponents.web.tsx +5 -0
- package/src/components/Swipeable.tsx +3 -1
- package/src/components/touchables/GenericTouchable.tsx +2 -0
- package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +1 -0
- package/src/handlers/ForceTouchGestureHandler.ts +3 -2
- package/src/handlers/PanGestureHandler.ts +2 -0
- package/src/handlers/PressabilityDebugView.tsx +2 -0
- package/src/handlers/PressabilityDebugView.web.tsx +4 -0
- package/src/handlers/{createHandler.ts → createHandler.tsx} +45 -19
- package/src/handlers/gestureHandlerCommon.ts +2 -0
- package/src/handlers/gestures/GestureDetector.tsx +185 -93
- package/src/handlers/gestures/gesture.ts +16 -0
- package/src/handlers/gestures/gestureStateManager.ts +13 -8
- package/src/handlers/gestures/panGesture.ts +5 -0
- package/src/handlers/gestures/reanimatedWrapper.ts +7 -0
- package/src/index.ts +3 -0
- package/src/utils.ts +3 -1
- package/src/web/constants.ts +1 -41
- package/src/web/detectors/RotationGestureDetector.ts +199 -0
- package/src/web/detectors/ScaleGestureDetector.ts +208 -0
- package/src/web/handlers/FlingGestureHandler.ts +146 -0
- package/src/web/handlers/GestureHandler.ts +572 -0
- package/src/web/handlers/LongPressGestureHandler.ts +122 -0
- package/src/web/handlers/NativeViewGestureHandler.ts +109 -0
- package/src/web/handlers/PanGestureHandler.ts +488 -0
- package/src/web/handlers/PinchGestureHandler.ts +162 -0
- package/src/web/handlers/RotationGestureHandler.ts +181 -0
- package/src/web/handlers/TapGestureHandler.ts +275 -0
- package/src/web/interfaces.ts +114 -0
- package/src/web/tools/EventManager.ts +186 -0
- package/src/web/tools/GestureHandlerOrchestrator.ts +329 -0
- package/src/web/tools/InteractionManager.ts +108 -0
- package/src/web/tools/NodeManager.ts +43 -0
- package/src/web/tools/PointerTracker.ts +130 -0
- package/src/{web → web_hammer}/DiscreteGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/DraggingGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/Errors.ts +0 -0
- package/src/{web → web_hammer}/FlingGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/GestureHandler.ts +102 -55
- package/src/{web → web_hammer}/IndiscreteGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/LongPressGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/NativeViewGestureHandler.ts +4 -0
- package/src/{web → web_hammer}/NodeManager.ts +6 -3
- package/src/{web → web_hammer}/PanGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/PinchGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/PressGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/RotationGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/TapGestureHandler.ts +0 -0
- package/src/web_hammer/constants.ts +48 -0
- package/src/{web → web_hammer}/utils.ts +1 -1
- package/android/src/main/jni/Android.mk +0 -53
- package/android/src/main/jni/OnLoad.cpp +0 -9
- package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +0 -71
- package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +0 -34
- package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +0 -19
- package/lib/commonjs/web/GestureHandler.js.map +0 -1
- package/lib/commonjs/web/NativeViewGestureHandler.js.map +0 -1
- package/lib/commonjs/web/NodeManager.js.map +0 -1
- package/lib/module/web/GestureHandler.js.map +0 -1
- package/lib/module/web/NativeViewGestureHandler.js.map +0 -1
- package/lib/module/web/NodeManager.js.map +0 -1
- package/lib/typescript/web/NodeManager.d.ts +0 -8
package/README.md
CHANGED
@@ -24,7 +24,7 @@ Check out our dedicated documentation page for info about this library, API refe
|
|
24
24
|
If you want to play with the API but don't feel like trying it on a real app, you can run the example project. Clone the repo, go to the `example` folder and run:
|
25
25
|
|
26
26
|
```bash
|
27
|
-
|
27
|
+
yarn install
|
28
28
|
```
|
29
29
|
|
30
30
|
If you are running on ios, run `pod install` in the ios folder
|
@@ -39,12 +39,14 @@ You will need to have an Android or iOS device or emulator connected as well as
|
|
39
39
|
|
40
40
|
| version | react-native version |
|
41
41
|
| ------- | -------------------- |
|
42
|
+
| 2.0.0+ | 0.63.0+ |
|
42
43
|
| 1.4.0+ | 0.60.0+ |
|
43
44
|
| 1.1.0+ | 0.57.2+ |
|
44
45
|
| <1.1.0 | 0.50.0+ |
|
45
46
|
|
46
47
|
It may be possible to use newer versions of react-native-gesture-handler on React Native with version <= 0.59 by reverse Jetifying.
|
47
|
-
Read more on that here https://github.com/mikehardy/jetifier#to-reverse-jetify--convert-node_modules-dependencies-to-support-libraries
|
48
|
+
Read more on that here <https://github.com/mikehardy/jetifier#to-reverse-jetify--convert-node_modules-dependencies-to-support-libraries>
|
49
|
+
|
48
50
|
## License
|
49
51
|
|
50
52
|
Gesture handler library is licensed under [The MIT License](LICENSE).
|
package/RNGestureHandler.podspec
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
require "json"
|
2
2
|
|
3
|
-
fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED']
|
3
|
+
fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
|
4
|
+
|
5
|
+
isUserApp = File.exists?(File.join(__dir__, "..", "..", "node_modules", "react-native", "package.json"))
|
6
|
+
if isUserApp
|
7
|
+
libInstances = %x[find ../../ -name "package.json" | grep "/react-native-gesture-handler/package.json" | grep -v "/.yarn/"]
|
8
|
+
libInstancesArray = libInstances.split("\n")
|
9
|
+
if libInstancesArray.length() > 1
|
10
|
+
parsedLocation = ''
|
11
|
+
for location in libInstancesArray
|
12
|
+
location['../../'] = '- '
|
13
|
+
location['/package.json'] = ''
|
14
|
+
parsedLocation += location + "\n"
|
15
|
+
end
|
16
|
+
raise "[Gesture Handler] Multiple versions of Gesture Handler were detected. Only one instance of react-native-gesture-handler can be installed in a project. You need to resolve the conflict manually. Check out the documentation: https://docs.swmansion.com/react-native-gesture-handler/docs/troubleshooting#multiple-versions-of-reanimated-were-detected \n\nConflict between: \n" + parsedLocation
|
17
|
+
end
|
18
|
+
end
|
4
19
|
|
5
20
|
Pod::Spec.new do |s|
|
6
21
|
# NPM package specification
|
@@ -17,9 +32,6 @@ Pod::Spec.new do |s|
|
|
17
32
|
s.requires_arc = true
|
18
33
|
|
19
34
|
if fabric_enabled
|
20
|
-
# folly_version must match the version used in React Native
|
21
|
-
# See folly_version in react-native/React/FBReactNativeSpec/FBReactNativeSpec.podspec
|
22
|
-
folly_version = '2021.06.28.00-v2'
|
23
35
|
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
|
24
36
|
|
25
37
|
s.pod_target_xcconfig = {
|
@@ -32,7 +44,7 @@ Pod::Spec.new do |s|
|
|
32
44
|
s.dependency "React"
|
33
45
|
s.dependency "React-RCTFabric" # This is for fabric component
|
34
46
|
s.dependency "React-Codegen"
|
35
|
-
s.dependency "RCT-Folly"
|
47
|
+
s.dependency "RCT-Folly"
|
36
48
|
s.dependency "RCTRequired"
|
37
49
|
s.dependency "RCTTypeSafety"
|
38
50
|
s.dependency "ReactCommon/turbomodule/core"
|
package/android/build.gradle
CHANGED
@@ -21,7 +21,7 @@ def isNewArchitectureEnabled() {
|
|
21
21
|
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
|
22
22
|
}
|
23
23
|
|
24
|
-
def findNodeModulePath(baseDir, packageName) {
|
24
|
+
static def findNodeModulePath(baseDir, packageName) {
|
25
25
|
def basePath = baseDir.toPath().normalize()
|
26
26
|
// Node's module resolution algorithm searches up to the root directory,
|
27
27
|
// after which the base path will be null
|
@@ -35,6 +35,13 @@ def findNodeModulePath(baseDir, packageName) {
|
|
35
35
|
return null
|
36
36
|
}
|
37
37
|
|
38
|
+
def findNodeModulePath(packageName) {
|
39
|
+
// Don't start in the project dir, as its path ends with node_modules/react-native-gesture-handler/android
|
40
|
+
// we want to go two levels up, so we end up in the first_node modules and eventually
|
41
|
+
// search upwards if the package is not found there
|
42
|
+
return findNodeModulePath(projectDir.toPath().parent.parent.toFile(), packageName)
|
43
|
+
}
|
44
|
+
|
38
45
|
if (isNewArchitectureEnabled()) {
|
39
46
|
apply plugin: 'com.facebook.react'
|
40
47
|
}
|
@@ -59,6 +66,45 @@ def shouldUseCommonInterfaceFromReanimated() {
|
|
59
66
|
}
|
60
67
|
}
|
61
68
|
|
69
|
+
def reactNativeArchitectures() {
|
70
|
+
def value = project.getProperties().get("reactNativeArchitectures")
|
71
|
+
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
72
|
+
}
|
73
|
+
|
74
|
+
def shouldAssertNoMultipleInstances() {
|
75
|
+
if (rootProject.hasProperty("disableMultipleInstancesCheck")) {
|
76
|
+
return rootProject.property("disableMultipleInstancesCheck") != "true"
|
77
|
+
} else {
|
78
|
+
return true
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
def noMultipleInstancesAssertion() {
|
83
|
+
Set<File> files = fileTree(rootDir.parent) {
|
84
|
+
include "node_modules/**/react-native-gesture-handler/package.json"
|
85
|
+
exclude "**/.yarn/**"
|
86
|
+
}.files
|
87
|
+
|
88
|
+
if (files.size() > 1) {
|
89
|
+
String parsedLocation = files.stream().map({ File file -> "- " + file.toString().replace("/package.json", "") }).collect().join("\n")
|
90
|
+
String exceptionMessage = "\n[Gesture Handler] Multiple instances of Gesture Handler were detected. Only one instance of react-native-gesture-handler can be installed in a project. You need to resolve the conflict manually. Check out the documentation: https://docs.swmansion.com/react-native-gesture-handler/docs/troubleshooting#multiple-instances-of-gesture-handler-were-detected \n\nConflict between: \n" + parsedLocation + "\n";
|
91
|
+
throw new Exception(exceptionMessage);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
def REACT_NATIVE_DIR = findNodeModulePath("react-native")
|
96
|
+
|
97
|
+
def assertionTask = task assertNoMultipleInstances {
|
98
|
+
onlyIf { shouldAssertNoMultipleInstances() }
|
99
|
+
doFirst {
|
100
|
+
noMultipleInstancesAssertion()
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
tasks.preBuild {
|
105
|
+
dependsOn assertionTask
|
106
|
+
}
|
107
|
+
|
62
108
|
repositories {
|
63
109
|
mavenCentral()
|
64
110
|
}
|
@@ -84,17 +130,12 @@ android {
|
|
84
130
|
if (isNewArchitectureEnabled()) {
|
85
131
|
var appProject = rootProject.allprojects.find {it.plugins.hasPlugin('com.android.application')}
|
86
132
|
externalNativeBuild {
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
"REACT_ANDROID_DIR=${findNodeModulePath(appProject.rootDir, "react-native") ?: "../node_modules/react-native/"}/ReactAndroid",
|
94
|
-
"REACT_ANDROID_BUILD_DIR=${findNodeModulePath(appProject.rootDir, "react-native") ?: "../node_modules/react-native/"}/ReactAndroid/build"
|
95
|
-
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
|
96
|
-
cppFlags "-std=c++17"
|
97
|
-
targets "rngesturehandler_modules"
|
133
|
+
cmake {
|
134
|
+
cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all"
|
135
|
+
arguments "-DAPP_BUILD_DIR=${appProject.buildDir}",
|
136
|
+
"-DREACT_NATIVE_DIR=${REACT_NATIVE_DIR}",
|
137
|
+
"-DANDROID_STL=c++_shared"
|
138
|
+
abiFilters (*reactNativeArchitectures())
|
98
139
|
}
|
99
140
|
}
|
100
141
|
}
|
@@ -107,8 +148,8 @@ android {
|
|
107
148
|
|
108
149
|
if (isNewArchitectureEnabled()) {
|
109
150
|
externalNativeBuild {
|
110
|
-
|
111
|
-
path "src/main/jni/
|
151
|
+
cmake {
|
152
|
+
path "src/main/jni/CMakeLists.txt"
|
112
153
|
}
|
113
154
|
}
|
114
155
|
}
|
@@ -116,7 +157,7 @@ android {
|
|
116
157
|
packagingOptions {
|
117
158
|
// For some reason gradle only complains about the duplicated version of libreact_render libraries
|
118
159
|
// while there are more libraries copied in intermediates folder of the lib build directory, we exclude
|
119
|
-
// only the ones that make the build fail (ideally we should only include
|
160
|
+
// only the ones that make the build fail (ideally we should only include libgesturehandler but we
|
120
161
|
// are only allowed to specify exclude patterns)
|
121
162
|
exclude "**/libreact_render*.so"
|
122
163
|
}
|
@@ -178,4 +219,19 @@ if (isNewArchitectureEnabled()) {
|
|
178
219
|
libraryName = "rngesturehandler"
|
179
220
|
codegenJavaPackageName = "com.swmansion.gesturehandler"
|
180
221
|
}
|
222
|
+
|
223
|
+
// Resolves "LOCAL_SRC_FILES points to a missing file, Check that libfb.so exists or that its path is correct".
|
224
|
+
tasks.whenTaskAdded { task ->
|
225
|
+
if (task.name.contains("configureCMakeDebug")) {
|
226
|
+
rootProject.getTasksByName("packageReactNdkDebugLibs", true).forEach {
|
227
|
+
task.dependsOn(it)
|
228
|
+
}
|
229
|
+
}
|
230
|
+
// We want to add a dependency for both configureCMakeRelease and configureCMakeRelWithDebInfo
|
231
|
+
if (task.name.contains("configureCMakeRel")) {
|
232
|
+
rootProject.getTasksByName("packageReactNdkReleaseLibs", true).forEach {
|
233
|
+
task.dependsOn(it)
|
234
|
+
}
|
235
|
+
}
|
236
|
+
}
|
181
237
|
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
package com.swmansion.gesturehandler
|
2
2
|
|
3
3
|
import android.os.Handler
|
4
|
+
import android.os.Looper
|
4
5
|
import android.view.MotionEvent
|
5
6
|
|
6
7
|
class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
|
@@ -27,7 +28,7 @@ class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
|
|
27
28
|
begin()
|
28
29
|
maxNumberOfPointersSimultaneously = 1
|
29
30
|
if (handler == null) {
|
30
|
-
handler = Handler() // lazy delegate?
|
31
|
+
handler = Handler(Looper.getMainLooper()) // lazy delegate?
|
31
32
|
} else {
|
32
33
|
handler!!.removeCallbacksAndMessages(null)
|
33
34
|
}
|
@@ -172,8 +172,12 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
172
172
|
windowOffset[0] = 0
|
173
173
|
windowOffset[1] = 0
|
174
174
|
}
|
175
|
+
|
176
|
+
onPrepare()
|
175
177
|
}
|
176
178
|
|
179
|
+
protected open fun onPrepare() {}
|
180
|
+
|
177
181
|
private fun getWindow(context: Context?): Window? {
|
178
182
|
if (context == null) return null
|
179
183
|
if (context is Activity) return context.window
|
@@ -253,9 +257,9 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
253
257
|
}
|
254
258
|
initPointerProps(trackedPointersIDsCount)
|
255
259
|
var count = 0
|
256
|
-
val
|
257
|
-
val
|
258
|
-
event.
|
260
|
+
val deltaX = event.rawX - event.x
|
261
|
+
val deltaY = event.rawY - event.y
|
262
|
+
event.offsetLocation(deltaX, deltaY)
|
259
263
|
var index = 0
|
260
264
|
val size = event.pointerCount
|
261
265
|
while (index < size) {
|
@@ -298,8 +302,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
298
302
|
} catch (e: IllegalArgumentException) {
|
299
303
|
throw AdaptEventException(this, event, e)
|
300
304
|
}
|
301
|
-
event.
|
302
|
-
result.
|
305
|
+
event.offsetLocation(-deltaX, -deltaY)
|
306
|
+
result.offsetLocation(-deltaX, -deltaY)
|
303
307
|
return result
|
304
308
|
}
|
305
309
|
|
package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt
CHANGED
@@ -5,6 +5,7 @@ import android.graphics.PointF
|
|
5
5
|
import android.view.MotionEvent
|
6
6
|
import android.view.View
|
7
7
|
import android.view.ViewGroup
|
8
|
+
import android.widget.EditText
|
8
9
|
import java.util.*
|
9
10
|
|
10
11
|
class GestureHandlerOrchestrator(
|
@@ -128,6 +129,13 @@ class GestureHandlerOrchestrator(
|
|
128
129
|
if (newState == GestureHandler.STATE_END) {
|
129
130
|
// gesture has ended, we need to kill the awaiting handler
|
130
131
|
otherHandler.cancel()
|
132
|
+
if (otherHandler.state == GestureHandler.STATE_END) {
|
133
|
+
// Handle edge case, where discrete gestures end immediately after activation thus
|
134
|
+
// their state is set to END and when the gesture they are waiting for activates they
|
135
|
+
// should be cancelled, however `cancel` was never sent as gestures were already in the END state.
|
136
|
+
// Send synthetic BEGAN -> CANCELLED to properly handle JS logic
|
137
|
+
otherHandler.dispatchStateChange(GestureHandler.STATE_CANCELLED, GestureHandler.STATE_BEGAN)
|
138
|
+
}
|
131
139
|
otherHandler.isAwaiting = false
|
132
140
|
} else {
|
133
141
|
// gesture has failed recognition, we may try activating
|
@@ -142,9 +150,12 @@ class GestureHandlerOrchestrator(
|
|
142
150
|
} else if (prevState == GestureHandler.STATE_ACTIVE || prevState == GestureHandler.STATE_END) {
|
143
151
|
if (handler.isActive) {
|
144
152
|
handler.dispatchStateChange(newState, prevState)
|
145
|
-
} else if (prevState == GestureHandler.STATE_ACTIVE) {
|
146
|
-
//
|
147
|
-
// before the other would not send state change event upon ending
|
153
|
+
} else if (prevState == GestureHandler.STATE_ACTIVE && (newState == GestureHandler.STATE_CANCELLED || newState == GestureHandler.STATE_FAILED)) {
|
154
|
+
// Handle edge case where handler awaiting for another one tries to activate but finishes
|
155
|
+
// before the other would not send state change event upon ending. Note that we only want
|
156
|
+
// to do this if the newState is either CANCELLED or FAILED, if it is END we still want to
|
157
|
+
// wait for the other handler to finish as in that case synthetic events will be sent by the
|
158
|
+
// makeActive method.
|
148
159
|
handler.dispatchStateChange(newState, GestureHandler.STATE_BEGAN)
|
149
160
|
}
|
150
161
|
} else if (prevState != GestureHandler.STATE_UNDETERMINED || newState != GestureHandler.STATE_CANCELLED) {
|
@@ -474,9 +485,24 @@ class GestureHandlerOrchestrator(
|
|
474
485
|
}
|
475
486
|
PointerEventsConfig.BOX_NONE -> {
|
476
487
|
// This view can't be the target, but its children might
|
477
|
-
|
478
|
-
|
479
|
-
|
488
|
+
when (view) {
|
489
|
+
is ViewGroup -> {
|
490
|
+
extractGestureHandlers(view, coords, pointerId).also { found ->
|
491
|
+
// A child view is handling touch, also extract handlers attached to this view
|
492
|
+
if (found) {
|
493
|
+
recordViewHandlersForPointer(view, coords, pointerId)
|
494
|
+
}
|
495
|
+
}
|
496
|
+
}
|
497
|
+
// When <TextInput> has editable set to `false` getPointerEventsConfigForView returns
|
498
|
+
// `BOX_NONE` as it's `isEnabled` property is false. In this case we still want to extract
|
499
|
+
// handlers attached to the text input, as it makes sense that gestures would work on a
|
500
|
+
// non-editable TextInput.
|
501
|
+
is EditText -> {
|
502
|
+
recordViewHandlersForPointer(view, coords, pointerId)
|
503
|
+
}
|
504
|
+
else -> false
|
505
|
+
}
|
480
506
|
}
|
481
507
|
PointerEventsConfig.AUTO -> {
|
482
508
|
// Either this view or one of its children is the target
|
@@ -2,6 +2,7 @@ package com.swmansion.gesturehandler
|
|
2
2
|
|
3
3
|
import android.content.Context
|
4
4
|
import android.os.Handler
|
5
|
+
import android.os.Looper
|
5
6
|
import android.os.SystemClock
|
6
7
|
import android.view.MotionEvent
|
7
8
|
|
@@ -19,7 +20,9 @@ class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestur
|
|
19
20
|
|
20
21
|
init {
|
21
22
|
setShouldCancelWhenOutside(true)
|
22
|
-
|
23
|
+
|
24
|
+
val defaultMaxDist = DEFAULT_MAX_DIST_DP * context.resources.displayMetrics.density
|
25
|
+
defaultMaxDistSq = defaultMaxDist * defaultMaxDist
|
23
26
|
maxDistSq = defaultMaxDistSq
|
24
27
|
}
|
25
28
|
|
@@ -41,7 +44,7 @@ class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestur
|
|
41
44
|
begin()
|
42
45
|
startX = event.rawX
|
43
46
|
startY = event.rawY
|
44
|
-
handler = Handler()
|
47
|
+
handler = Handler(Looper.getMainLooper())
|
45
48
|
if (minDurationMs > 0) {
|
46
49
|
handler!!.postDelayed({ activate() }, minDurationMs)
|
47
50
|
} else if (minDurationMs == 0L) {
|
@@ -3,12 +3,16 @@ package com.swmansion.gesturehandler
|
|
3
3
|
import android.os.SystemClock
|
4
4
|
import android.view.MotionEvent
|
5
5
|
import android.view.View
|
6
|
+
import android.view.ViewConfiguration
|
6
7
|
import android.view.ViewGroup
|
7
|
-
import com.
|
8
|
+
import com.facebook.react.views.textinput.ReactEditText
|
8
9
|
|
9
10
|
class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
10
11
|
private var shouldActivateOnStart = false
|
11
|
-
|
12
|
+
var disallowInterruption = false
|
13
|
+
private set
|
14
|
+
|
15
|
+
private var hook: NativeViewGestureHandlerHook = defaultHook
|
12
16
|
|
13
17
|
init {
|
14
18
|
setShouldCancelWhenOutside(true)
|
@@ -34,13 +38,17 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
34
38
|
}
|
35
39
|
|
36
40
|
override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
|
41
|
+
// if the gesture is marked by user as simultaneous with other or the hook return true
|
42
|
+
if (super.shouldRecognizeSimultaneously(handler) || hook.shouldRecognizeSimultaneously(handler)) {
|
43
|
+
return true
|
44
|
+
}
|
45
|
+
|
37
46
|
if (handler is NativeViewGestureHandler) {
|
38
47
|
// Special case when the peer handler is also an instance of NativeViewGestureHandler:
|
39
48
|
// For the `disallowInterruption` to work correctly we need to check the property when
|
40
49
|
// accessed as a peer, because simultaneous recognizers can be set on either side of the
|
41
50
|
// connection.
|
42
|
-
|
43
|
-
if (nativeWrapper.state == STATE_ACTIVE && nativeWrapper.disallowInterruption) {
|
51
|
+
if (handler.state == STATE_ACTIVE && handler.disallowInterruption) {
|
44
52
|
// other handler is active and it disallows interruption, we don't want to get into its way
|
45
53
|
return false
|
46
54
|
}
|
@@ -52,7 +60,7 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
52
60
|
// as it means the other handler has turned active and returning `true` would prevent it from
|
53
61
|
// interrupting the current handler
|
54
62
|
false
|
55
|
-
} else state == STATE_ACTIVE && canBeInterrupted
|
63
|
+
} else state == STATE_ACTIVE && canBeInterrupted && (!hook.shouldCancelRootViewGestureHandlerIfNecessary() || handler.tag > 0)
|
56
64
|
// otherwise we can only return `true` if already in an active state
|
57
65
|
}
|
58
66
|
|
@@ -60,19 +68,10 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
60
68
|
return !disallowInterruption
|
61
69
|
}
|
62
70
|
|
63
|
-
|
64
|
-
val view = view
|
65
|
-
|
66
|
-
|
67
|
-
}
|
68
|
-
|
69
|
-
return true
|
70
|
-
}
|
71
|
-
|
72
|
-
private fun afterGestureEnd() {
|
73
|
-
val view = view
|
74
|
-
if (view is StateChangeHook) {
|
75
|
-
view.afterGestureEnd()
|
71
|
+
override fun onPrepare() {
|
72
|
+
when (val view = view) {
|
73
|
+
is NativeViewGestureHandlerHook -> this.hook = view
|
74
|
+
is ReactEditText -> this.hook = EditTextHook(this, view)
|
76
75
|
}
|
77
76
|
}
|
78
77
|
|
@@ -84,7 +83,7 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
84
83
|
activate()
|
85
84
|
}
|
86
85
|
end()
|
87
|
-
afterGestureEnd()
|
86
|
+
hook.afterGestureEnd(event)
|
88
87
|
} else if (state == STATE_UNDETERMINED || state == STATE_BEGAN) {
|
89
88
|
when {
|
90
89
|
shouldActivateOnStart -> {
|
@@ -96,8 +95,11 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
96
95
|
view.onTouchEvent(event)
|
97
96
|
activate()
|
98
97
|
}
|
98
|
+
hook.wantsToHandleEventBeforeActivation() -> {
|
99
|
+
hook.handleEventBeforeActivation(event)
|
100
|
+
}
|
99
101
|
state != STATE_BEGAN -> {
|
100
|
-
if (
|
102
|
+
if (hook.canBegin()) {
|
101
103
|
begin()
|
102
104
|
} else {
|
103
105
|
cancel()
|
@@ -117,13 +119,93 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
117
119
|
view!!.onTouchEvent(event)
|
118
120
|
}
|
119
121
|
|
122
|
+
override fun onReset() {
|
123
|
+
this.hook = defaultHook
|
124
|
+
}
|
125
|
+
|
120
126
|
companion object {
|
121
127
|
private fun tryIntercept(view: View, event: MotionEvent) =
|
122
128
|
view is ViewGroup && view.onInterceptTouchEvent(event)
|
129
|
+
|
130
|
+
private val defaultHook = object : NativeViewGestureHandlerHook {}
|
123
131
|
}
|
124
132
|
|
125
|
-
interface
|
126
|
-
|
127
|
-
|
133
|
+
interface NativeViewGestureHandlerHook {
|
134
|
+
/**
|
135
|
+
* Called when gesture is in the UNDETERMINED state, shouldActivateOnStart is set to false,
|
136
|
+
* and both tryIntercept and wantsToHandleEventBeforeActivation returned false.
|
137
|
+
*
|
138
|
+
* @return Boolean value signalling whether the handler can transition to the BEGAN state. If false
|
139
|
+
* the gesture will be cancelled.
|
140
|
+
*/
|
141
|
+
fun canBegin() = true
|
142
|
+
|
143
|
+
/**
|
144
|
+
* Called after the gesture transitions to the END state.
|
145
|
+
*/
|
146
|
+
fun afterGestureEnd(event: MotionEvent) = Unit
|
147
|
+
|
148
|
+
/**
|
149
|
+
* @return Boolean value signalling whether the gesture can be recognized simultaneously with
|
150
|
+
* other (handler). Returning false doesn't necessarily prevent it from happening.
|
151
|
+
*/
|
152
|
+
fun shouldRecognizeSimultaneously(handler: GestureHandler<*>) = false
|
153
|
+
|
154
|
+
/**
|
155
|
+
* shouldActivateOnStart and tryIntercept have priority over this method
|
156
|
+
*
|
157
|
+
* @return Boolean value signalling if the hook wants to handle events passed to the handler
|
158
|
+
* before it activates (after that the events are passed to the underlying view).
|
159
|
+
*/
|
160
|
+
fun wantsToHandleEventBeforeActivation() = false
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Will be called with events if wantsToHandleEventBeforeActivation returns true.
|
164
|
+
*/
|
165
|
+
fun handleEventBeforeActivation(event: MotionEvent) = Unit
|
166
|
+
|
167
|
+
/**
|
168
|
+
* @return Boolean value indicating whether the RootViewGestureHandler should be cancelled
|
169
|
+
* by this one.
|
170
|
+
*/
|
171
|
+
fun shouldCancelRootViewGestureHandlerIfNecessary() = false
|
172
|
+
}
|
173
|
+
|
174
|
+
private class EditTextHook(
|
175
|
+
private val handler: NativeViewGestureHandler,
|
176
|
+
private val editText: ReactEditText
|
177
|
+
) : NativeViewGestureHandlerHook {
|
178
|
+
private var startX = 0f
|
179
|
+
private var startY = 0f
|
180
|
+
private var touchSlopSquared: Int
|
181
|
+
|
182
|
+
init {
|
183
|
+
val vc = ViewConfiguration.get(editText.context)
|
184
|
+
touchSlopSquared = vc.scaledTouchSlop * vc.scaledTouchSlop
|
185
|
+
}
|
186
|
+
|
187
|
+
override fun afterGestureEnd(event: MotionEvent) {
|
188
|
+
if ((event.x - startX) * (event.x - startX) + (event.y - startY) * (event.y - startY) < touchSlopSquared) {
|
189
|
+
editText.requestFocusFromJS()
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
// recognize alongside every handler besides RootViewGestureHandler, which is a private inner class
|
194
|
+
// of RNGestureHandlerRootHelper so no explicit type checks, but its tag is always negative
|
195
|
+
// also if other handler is NativeViewGestureHandler then don't override the default implementation
|
196
|
+
override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>) =
|
197
|
+
handler.tag > 0 && handler !is NativeViewGestureHandler
|
198
|
+
|
199
|
+
override fun wantsToHandleEventBeforeActivation() = true
|
200
|
+
|
201
|
+
override fun handleEventBeforeActivation(event: MotionEvent) {
|
202
|
+
handler.activate()
|
203
|
+
editText.onTouchEvent(event)
|
204
|
+
|
205
|
+
startX = event.x
|
206
|
+
startY = event.y
|
207
|
+
}
|
208
|
+
|
209
|
+
override fun shouldCancelRootViewGestureHandlerIfNecessary() = true
|
128
210
|
}
|
129
211
|
}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
package com.swmansion.gesturehandler
|
2
2
|
|
3
3
|
import android.content.Context
|
4
|
+
import android.os.Handler
|
5
|
+
import android.os.Looper
|
4
6
|
import android.view.MotionEvent
|
5
7
|
import android.view.VelocityTracker
|
6
8
|
import android.view.ViewConfiguration
|
@@ -40,6 +42,9 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
40
42
|
private var lastY = 0f
|
41
43
|
private var velocityTracker: VelocityTracker? = null
|
42
44
|
private var averageTouches = false
|
45
|
+
private var activateAfterLongPress = DEFAULT_ACTIVATE_AFTER_LONG_PRESS
|
46
|
+
private val activateDelayed = Runnable { activate() }
|
47
|
+
private var handler: Handler? = null
|
43
48
|
|
44
49
|
/**
|
45
50
|
* On Android when there are multiple pointers on the screen pan gestures most often just consider
|
@@ -54,7 +59,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
54
59
|
* position of all the fingers will remain still while doing a rotation gesture.
|
55
60
|
*/
|
56
61
|
init {
|
57
|
-
val vc = ViewConfiguration.get(context)
|
62
|
+
val vc = ViewConfiguration.get(context!!)
|
58
63
|
val touchSlop = vc.scaledTouchSlop
|
59
64
|
defaultMinDistSq = (touchSlop * touchSlop).toFloat()
|
60
65
|
minDistSq = defaultMinDistSq
|
@@ -76,6 +81,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
76
81
|
minDistSq = defaultMinDistSq
|
77
82
|
minPointers = DEFAULT_MIN_POINTERS
|
78
83
|
maxPointers = DEFAULT_MAX_POINTERS
|
84
|
+
activateAfterLongPress = DEFAULT_ACTIVATE_AFTER_LONG_PRESS
|
79
85
|
averageTouches = false
|
80
86
|
}
|
81
87
|
|
@@ -127,6 +133,10 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
127
133
|
this.averageTouches = averageTouches
|
128
134
|
}
|
129
135
|
|
136
|
+
fun setActivateAfterLongPress(time: Long) = apply {
|
137
|
+
this.activateAfterLongPress = time
|
138
|
+
}
|
139
|
+
|
130
140
|
/**
|
131
141
|
* @param minVelocity in pixels per second
|
132
142
|
*/
|
@@ -177,13 +187,18 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
177
187
|
|
178
188
|
private fun shouldFail(): Boolean {
|
179
189
|
val dx = lastX - startX + offsetX
|
190
|
+
val dy = lastY - startY + offsetY
|
191
|
+
|
192
|
+
if (activateAfterLongPress > 0 && dx * dx + dy * dy > defaultMinDistSq) {
|
193
|
+
handler?.removeCallbacksAndMessages(null)
|
194
|
+
return true
|
195
|
+
}
|
180
196
|
if (failOffsetXStart != MAX_VALUE_IGNORE && dx < failOffsetXStart) {
|
181
197
|
return true
|
182
198
|
}
|
183
199
|
if (failOffsetXEnd != MIN_VALUE_IGNORE && dx > failOffsetXEnd) {
|
184
200
|
return true
|
185
201
|
}
|
186
|
-
val dy = lastY - startY + offsetY
|
187
202
|
if (failOffsetYStart != MAX_VALUE_IGNORE && dy < failOffsetYStart) {
|
188
203
|
return true
|
189
204
|
}
|
@@ -216,6 +231,13 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
216
231
|
velocityTracker = VelocityTracker.obtain()
|
217
232
|
addVelocityMovement(velocityTracker, event)
|
218
233
|
begin()
|
234
|
+
|
235
|
+
if (activateAfterLongPress > 0) {
|
236
|
+
if (handler == null) {
|
237
|
+
handler = Handler(Looper.getMainLooper())
|
238
|
+
}
|
239
|
+
handler!!.postDelayed(activateDelayed, activateAfterLongPress)
|
240
|
+
}
|
219
241
|
} else if (velocityTracker != null) {
|
220
242
|
addVelocityMovement(velocityTracker, event)
|
221
243
|
velocityTracker!!.computeCurrentVelocity(1000)
|
@@ -257,7 +279,12 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
257
279
|
super.activate(force)
|
258
280
|
}
|
259
281
|
|
282
|
+
override fun onCancel() {
|
283
|
+
handler?.removeCallbacksAndMessages(null)
|
284
|
+
}
|
285
|
+
|
260
286
|
override fun onReset() {
|
287
|
+
handler?.removeCallbacksAndMessages(null)
|
261
288
|
velocityTracker?.let {
|
262
289
|
it.recycle()
|
263
290
|
velocityTracker = null
|
@@ -274,6 +301,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
274
301
|
private const val MAX_VALUE_IGNORE = Float.MIN_VALUE
|
275
302
|
private const val DEFAULT_MIN_POINTERS = 1
|
276
303
|
private const val DEFAULT_MAX_POINTERS = 10
|
304
|
+
private const val DEFAULT_ACTIVATE_AFTER_LONG_PRESS = 0L
|
277
305
|
|
278
306
|
/**
|
279
307
|
* This method adds movement to {@class VelocityTracker} first resetting offset of the event so
|
@@ -1,6 +1,7 @@
|
|
1
1
|
package com.swmansion.gesturehandler
|
2
2
|
|
3
3
|
import android.os.Handler
|
4
|
+
import android.os.Looper
|
4
5
|
import android.view.MotionEvent
|
5
6
|
import com.swmansion.gesturehandler.GestureUtils.getLastPointerX
|
6
7
|
import com.swmansion.gesturehandler.GestureUtils.getLastPointerY
|
@@ -70,7 +71,7 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
|
|
70
71
|
|
71
72
|
private fun startTap() {
|
72
73
|
if (handler == null) {
|
73
|
-
handler = Handler() // TODO: lazy init (handle else branch correctly)
|
74
|
+
handler = Handler(Looper.getMainLooper()) // TODO: lazy init (handle else branch correctly)
|
74
75
|
} else {
|
75
76
|
handler!!.removeCallbacksAndMessages(null)
|
76
77
|
}
|
@@ -79,7 +80,7 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
|
|
79
80
|
|
80
81
|
private fun endTap() {
|
81
82
|
if (handler == null) {
|
82
|
-
handler = Handler()
|
83
|
+
handler = Handler(Looper.getMainLooper())
|
83
84
|
} else {
|
84
85
|
handler!!.removeCallbacksAndMessages(null)
|
85
86
|
}
|
package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java
CHANGED
@@ -9,7 +9,7 @@ import com.facebook.soloader.SoLoader;
|
|
9
9
|
public class RNGestureHandlerComponentsRegistry {
|
10
10
|
static {
|
11
11
|
SoLoader.loadLibrary("fabricjni");
|
12
|
-
SoLoader.loadLibrary("
|
12
|
+
SoLoader.loadLibrary("gesturehandler");
|
13
13
|
}
|
14
14
|
|
15
15
|
@DoNotStrip private final HybridData mHybridData;
|