react-native-gesture-handler 1.10.3 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/android/build.gradle +49 -1
- package/android/common/src/main/java/com/swmansion/common/GestureHandlerStateManager.kt +5 -0
- package/android/gradle.properties +19 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +18 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/Extensions.kt +11 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +96 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +713 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.kt +8 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +562 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.kt +8 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +21 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +49 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +97 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +11 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +129 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.kt +9 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +289 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +88 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/{PointerEventsConfig.java → PointerEventsConfig.kt} +3 -5
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.kt +125 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +79 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +167 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.kt +10 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +348 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +57 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +59 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +8 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +61 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +686 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +17 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +95 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +132 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.kt +5 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +68 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +34 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +66 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +69 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.kt +51 -0
- package/ios/Handlers/RNFlingHandler.m +78 -5
- package/ios/Handlers/RNForceTouchHandler.m +29 -4
- package/ios/Handlers/RNLongPressHandler.m +105 -3
- package/ios/Handlers/RNManualHandler.h +4 -0
- package/ios/Handlers/RNManualHandler.m +73 -0
- package/ios/Handlers/RNNativeViewHandler.m +30 -2
- package/ios/Handlers/RNPanHandler.m +64 -4
- package/ios/Handlers/RNPinchHandler.m +61 -2
- package/ios/Handlers/RNRotationHandler.m +60 -1
- package/ios/Handlers/RNTapHandler.m +55 -8
- package/ios/RNGestureHandler.h +18 -4
- package/ios/RNGestureHandler.m +123 -13
- package/ios/RNGestureHandlerEvents.h +9 -0
- package/ios/RNGestureHandlerEvents.m +34 -0
- package/ios/RNGestureHandlerManager.h +7 -0
- package/ios/RNGestureHandlerManager.m +62 -34
- package/ios/RNGestureHandlerModule.m +39 -3
- package/ios/RNGestureHandlerPointerTracker.h +25 -0
- package/ios/RNGestureHandlerPointerTracker.m +237 -0
- package/ios/RNGestureHandlerRegistry.h +1 -0
- package/ios/RNGestureHandlerRegistry.m +10 -0
- package/ios/RNGestureHandlerStateManager.h +5 -0
- package/ios/RNManualActivationRecognizer.h +10 -0
- package/ios/RNManualActivationRecognizer.m +80 -0
- package/ios/RNRootViewGestureRecognizer.m +1 -1
- package/ios/RNTouchEventType.h +9 -0
- package/lib/commonjs/EventType.js +16 -0
- package/lib/commonjs/EventType.js.map +1 -0
- package/lib/commonjs/GestureHandlerRootView.android.js +1 -13
- package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
- package/lib/commonjs/GestureHandlerRootView.js +11 -3
- package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.js +3 -1
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js +2 -2
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/components/DrawerLayout.js +41 -37
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/GestureButtons.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js +31 -12
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js +10 -6
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js +2 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/commonjs/components/touchables/TouchableOpacity.js +1 -1
- package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/commonjs/gestureHandlerRootHOC.js +1 -1
- package/lib/commonjs/gestureHandlerRootHOC.js.map +1 -1
- package/lib/commonjs/handlers/FlingGestureHandler.js +23 -0
- package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js +44 -0
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/LongPressGestureHandler.js +23 -0
- package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/NativeViewGestureHandler.js +6 -4
- package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PanGestureHandler.js +121 -0
- package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/PinchGestureHandler.js +21 -0
- package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/RotationGestureHandler.js +21 -0
- package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/TapGestureHandler.js +23 -0
- package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/createHandler.js +52 -83
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js +80 -0
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -0
- package/lib/commonjs/handlers/gestures/GestureDetector.js +440 -0
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -0
- package/lib/commonjs/handlers/gestures/eventReceiver.js +135 -0
- package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -0
- package/lib/commonjs/handlers/gestures/flingGesture.js +34 -0
- package/lib/commonjs/handlers/gestures/flingGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/forceTouchGesture.js +65 -0
- package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gesture.js +193 -0
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gestureComposition.js +94 -0
- package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gestureObjects.js +85 -0
- package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gestureStateManager.js +58 -0
- package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -0
- package/lib/commonjs/handlers/gestures/longPressGesture.js +34 -0
- package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/manualGesture.js +31 -0
- package/lib/commonjs/handlers/gestures/manualGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/nativeGesture.js +34 -0
- package/lib/commonjs/handlers/gestures/nativeGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/panGesture.js +144 -0
- package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/pinchGesture.js +45 -0
- package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +24 -0
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -0
- package/lib/commonjs/handlers/gestures/rotationGesture.js +45 -0
- package/lib/commonjs/handlers/gestures/rotationGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/tapGesture.js +59 -0
- package/lib/commonjs/handlers/gestures/tapGesture.js.map +1 -0
- package/lib/commonjs/handlers/handlersRegistry.js +31 -0
- package/lib/commonjs/handlers/handlersRegistry.js.map +1 -0
- package/lib/commonjs/index.js +146 -8
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/init.js +13 -0
- package/lib/commonjs/init.js.map +1 -0
- package/lib/commonjs/mocks.js +31 -2
- package/lib/commonjs/mocks.js.map +1 -1
- package/lib/commonjs/utils.js +15 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/commonjs/web/Errors.js +1 -1
- package/lib/commonjs/web/Errors.js.map +1 -1
- package/lib/commonjs/web/GestureHandler.js +4 -6
- package/lib/commonjs/web/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/NodeManager.js +8 -2
- package/lib/commonjs/web/NodeManager.js.map +1 -1
- package/lib/module/EventType.js +8 -0
- package/lib/module/EventType.js.map +1 -0
- package/lib/module/GestureHandlerRootView.android.js +2 -14
- package/lib/module/GestureHandlerRootView.android.js.map +1 -1
- package/lib/module/GestureHandlerRootView.js +5 -1
- package/lib/module/GestureHandlerRootView.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.js +3 -1
- package/lib/module/RNGestureHandlerModule.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +2 -2
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/components/DrawerLayout.js +43 -40
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/GestureButtons.js.map +1 -1
- package/lib/module/components/GestureComponents.js +29 -11
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/Swipeable.js +9 -6
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/components/touchables/GenericTouchable.js +2 -1
- package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/module/components/touchables/TouchableOpacity.js +1 -1
- package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/module/gestureHandlerRootHOC.js +1 -1
- package/lib/module/gestureHandlerRootHOC.js.map +1 -1
- package/lib/module/handlers/FlingGestureHandler.js +10 -0
- package/lib/module/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/module/handlers/ForceTouchGestureHandler.js +29 -0
- package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -0
- package/lib/module/handlers/LongPressGestureHandler.js +10 -0
- package/lib/module/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/module/handlers/NativeViewGestureHandler.js +4 -3
- package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/handlers/PanGestureHandler.js +106 -0
- package/lib/module/handlers/PanGestureHandler.js.map +1 -0
- package/lib/module/handlers/PinchGestureHandler.js +9 -0
- package/lib/module/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/module/handlers/RotationGestureHandler.js +9 -0
- package/lib/module/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/module/handlers/TapGestureHandler.js +10 -0
- package/lib/module/handlers/TapGestureHandler.js.map +1 -0
- package/lib/module/handlers/createHandler.js +41 -76
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js +66 -0
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -0
- package/lib/module/handlers/gestures/GestureDetector.js +402 -0
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -0
- package/lib/module/handlers/gestures/eventReceiver.js +120 -0
- package/lib/module/handlers/gestures/eventReceiver.js.map +1 -0
- package/lib/module/handlers/gestures/flingGesture.js +24 -0
- package/lib/module/handlers/gestures/flingGesture.js.map +1 -0
- package/lib/module/handlers/gestures/forceTouchGesture.js +56 -0
- package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -0
- package/lib/module/handlers/gestures/gesture.js +175 -0
- package/lib/module/handlers/gestures/gesture.js.map +1 -0
- package/lib/module/handlers/gestures/gestureComposition.js +79 -0
- package/lib/module/handlers/gestures/gestureComposition.js.map +1 -0
- package/lib/module/handlers/gestures/gestureObjects.js +67 -0
- package/lib/module/handlers/gestures/gestureObjects.js.map +1 -0
- package/lib/module/handlers/gestures/gestureStateManager.js +48 -0
- package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -0
- package/lib/module/handlers/gestures/longPressGesture.js +24 -0
- package/lib/module/handlers/gestures/longPressGesture.js.map +1 -0
- package/lib/module/handlers/gestures/manualGesture.js +22 -0
- package/lib/module/handlers/gestures/manualGesture.js.map +1 -0
- package/lib/module/handlers/gestures/nativeGesture.js +24 -0
- package/lib/module/handlers/gestures/nativeGesture.js.map +1 -0
- package/lib/module/handlers/gestures/panGesture.js +135 -0
- package/lib/module/handlers/gestures/panGesture.js.map +1 -0
- package/lib/module/handlers/gestures/pinchGesture.js +36 -0
- package/lib/module/handlers/gestures/pinchGesture.js.map +1 -0
- package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -0
- package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -0
- package/lib/module/handlers/gestures/rotationGesture.js +36 -0
- package/lib/module/handlers/gestures/rotationGesture.js.map +1 -0
- package/lib/module/handlers/gestures/tapGesture.js +49 -0
- package/lib/module/handlers/gestures/tapGesture.js.map +1 -0
- package/lib/module/handlers/handlersRegistry.js +16 -0
- package/lib/module/handlers/handlersRegistry.js.map +1 -0
- package/lib/module/index.js +22 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/init.js +5 -0
- package/lib/module/init.js.map +1 -0
- package/lib/module/mocks.js +31 -2
- package/lib/module/mocks.js.map +1 -1
- package/lib/module/utils.js +8 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/module/web/Errors.js +1 -1
- package/lib/module/web/Errors.js.map +1 -1
- package/lib/module/web/GestureHandler.js +4 -6
- package/lib/module/web/GestureHandler.js.map +1 -1
- package/lib/module/web/NodeManager.js +8 -2
- package/lib/module/web/NodeManager.js.map +1 -1
- package/lib/typescript/EventType.d.ts +8 -0
- package/lib/typescript/GestureHandlerRootView.android.d.ts +2 -4
- package/lib/typescript/GestureHandlerRootView.d.ts +5 -2
- package/lib/typescript/RNGestureHandlerModule.d.ts +1 -1
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -1
- package/lib/typescript/components/DrawerLayout.d.ts +50 -1
- package/lib/typescript/components/GestureButtons.d.ts +36 -0
- package/lib/typescript/components/GestureComponents.d.ts +8 -35
- package/lib/typescript/components/Swipeable.d.ts +73 -6
- package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -2
- package/lib/typescript/components/touchables/TouchableHighlight.d.ts +1 -0
- package/lib/typescript/components/touchables/TouchableOpacity.d.ts +1 -0
- package/lib/typescript/handlers/FlingGestureHandler.d.ts +33 -0
- package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +43 -0
- package/lib/typescript/handlers/LongPressGestureHandler.d.ts +55 -0
- package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +19 -4
- package/lib/typescript/handlers/PanGestureHandler.d.ts +137 -0
- package/lib/typescript/handlers/PinchGestureHandler.d.ts +28 -0
- package/lib/typescript/handlers/RotationGestureHandler.d.ts +28 -0
- package/lib/typescript/handlers/TapGestureHandler.d.ts +56 -0
- package/lib/typescript/handlers/createHandler.d.ts +1 -1
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +62 -0
- package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts +8 -1
- package/lib/typescript/handlers/gestures/GestureDetector.d.ts +16 -0
- package/lib/typescript/handlers/gestures/eventReceiver.d.ts +2 -0
- package/lib/typescript/handlers/gestures/flingGesture.d.ts +9 -0
- package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +16 -0
- package/lib/typescript/handlers/gestures/gesture.d.ts +97 -0
- package/lib/typescript/handlers/gestures/gestureComposition.d.ts +21 -0
- package/lib/typescript/handlers/gestures/gestureObjects.d.ts +39 -0
- package/lib/typescript/handlers/gestures/gestureStateManager.d.ts +9 -0
- package/lib/typescript/handlers/gestures/longPressGesture.d.ts +9 -0
- package/lib/typescript/handlers/gestures/manualGesture.d.ts +7 -0
- package/lib/typescript/handlers/gestures/nativeGesture.d.ts +9 -0
- package/lib/typescript/handlers/gestures/panGesture.d.ts +26 -0
- package/lib/typescript/handlers/gestures/pinchGesture.d.ts +12 -0
- package/lib/typescript/handlers/gestures/reanimatedWrapper.d.ts +14 -0
- package/lib/typescript/handlers/gestures/rotationGesture.d.ts +12 -0
- package/lib/typescript/handlers/gestures/tapGesture.d.ts +14 -0
- package/lib/typescript/handlers/handlersRegistry.d.ts +6 -0
- package/lib/typescript/index.d.ts +29 -2
- package/lib/typescript/init.d.ts +1 -0
- package/lib/typescript/mocks.d.ts +21 -2
- package/lib/typescript/utils.d.ts +1 -0
- package/lib/typescript/web/FlingGestureHandler.d.ts +0 -1
- package/lib/typescript/web/GestureHandler.d.ts +0 -1
- package/lib/typescript/web/PanGestureHandler.d.ts +0 -1
- package/lib/typescript/web/PinchGestureHandler.d.ts +0 -1
- package/lib/typescript/web/PressGestureHandler.d.ts +0 -1
- package/lib/typescript/web/RotationGestureHandler.d.ts +0 -1
- package/lib/typescript/web/TapGestureHandler.d.ts +0 -1
- package/package.json +8 -5
- package/src/EventType.ts +10 -0
- package/src/GestureHandlerRootView.android.tsx +9 -25
- package/src/GestureHandlerRootView.tsx +11 -2
- package/src/RNGestureHandlerModule.ts +5 -1
- package/src/RNGestureHandlerModule.web.ts +1 -0
- package/src/components/DrawerLayout.tsx +114 -41
- package/src/components/GestureButtons.tsx +45 -5
- package/src/components/GestureComponents.tsx +47 -41
- package/src/components/Swipeable.tsx +108 -21
- package/src/components/touchables/GenericTouchable.tsx +2 -1
- package/src/components/touchables/TouchableOpacity.tsx +1 -1
- package/src/handlers/FlingGestureHandler.ts +57 -0
- package/src/handlers/ForceTouchGestureHandler.ts +83 -0
- package/src/handlers/LongPressGestureHandler.ts +84 -0
- package/src/handlers/NativeViewGestureHandler.ts +31 -7
- package/src/handlers/PanGestureHandler.ts +321 -0
- package/src/handlers/PinchGestureHandler.ts +46 -0
- package/src/handlers/RotationGestureHandler.ts +46 -0
- package/src/handlers/TapGestureHandler.ts +90 -0
- package/src/handlers/createHandler.ts +54 -79
- package/src/handlers/gestureHandlerCommon.ts +185 -0
- package/src/handlers/gestureHandlerTypesCompat.ts +19 -5
- package/src/handlers/gestures/GestureDetector.tsx +519 -0
- package/src/handlers/gestures/eventReceiver.ts +151 -0
- package/src/handlers/gestures/flingGesture.ts +27 -0
- package/src/handlers/gestures/forceTouchGesture.ts +74 -0
- package/src/handlers/gestures/gesture.ts +292 -0
- package/src/handlers/gestures/gestureComposition.ts +109 -0
- package/src/handlers/gestures/gestureObjects.ts +79 -0
- package/src/handlers/gestures/gestureStateManager.ts +60 -0
- package/src/handlers/gestures/longPressGesture.ts +27 -0
- package/src/handlers/gestures/manualGesture.ts +31 -0
- package/src/handlers/gestures/nativeGesture.ts +27 -0
- package/src/handlers/gestures/panGesture.ts +147 -0
- package/src/handlers/gestures/pinchGesture.ts +51 -0
- package/src/handlers/gestures/reanimatedWrapper.ts +45 -0
- package/src/handlers/gestures/rotationGesture.ts +51 -0
- package/src/handlers/gestures/tapGesture.ts +52 -0
- package/src/handlers/handlersRegistry.ts +22 -0
- package/src/index.ts +57 -17
- package/src/init.ts +5 -0
- package/src/mocks.ts +42 -2
- package/src/utils.ts +7 -0
- package/src/web/GestureHandler.ts +1 -2
- package/src/web/NodeManager.ts +5 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.java +0 -23
- package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.java +0 -110
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.java +0 -531
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.java +0 -8
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.java +0 -543
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.java +0 -10
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.java +0 -29
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.java +0 -53
- package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.java +0 -81
- package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.java +0 -110
- package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.java +0 -8
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.java +0 -312
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.java +0 -109
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.java +0 -169
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.java +0 -96
- package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.java +0 -172
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.java +0 -10
- package/android/src/main/java/com/facebook/react/views/modal/RNGHModalUtils.java +0 -21
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.java +0 -296
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.java +0 -72
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.java +0 -77
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.java +0 -8
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.java +0 -86
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.java +0 -731
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.java +0 -31
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.java +0 -101
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.java +0 -151
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.java +0 -7
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java +0 -76
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java +0 -49
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.java +0 -82
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.java +0 -61
- package/lib/commonjs/handlers/gestureHandlers.js +0 -236
- package/lib/commonjs/handlers/gestureHandlers.js.map +0 -1
- package/lib/module/handlers/gestureHandlers.js +0 -216
- package/lib/module/handlers/gestureHandlers.js.map +0 -1
- package/lib/typescript/handlers/gestureHandlers.d.ts +0 -158
- package/src/handlers/gestureHandlers.ts +0 -511
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.os.Handler
|
|
5
|
+
import android.os.SystemClock
|
|
6
|
+
import android.view.MotionEvent
|
|
7
|
+
|
|
8
|
+
class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestureHandler>() {
|
|
9
|
+
var minDurationMs = DEFAULT_MIN_DURATION_MS
|
|
10
|
+
val duration: Int
|
|
11
|
+
get() = (previousTime - startTime).toInt()
|
|
12
|
+
private val defaultMaxDistSq: Float
|
|
13
|
+
private var maxDistSq: Float
|
|
14
|
+
private var startX = 0f
|
|
15
|
+
private var startY = 0f
|
|
16
|
+
private var startTime: Long = 0
|
|
17
|
+
private var previousTime: Long = 0
|
|
18
|
+
private var handler: Handler? = null
|
|
19
|
+
|
|
20
|
+
init {
|
|
21
|
+
setShouldCancelWhenOutside(true)
|
|
22
|
+
defaultMaxDistSq = DEFAULT_MAX_DIST_DP * context.resources.displayMetrics.density
|
|
23
|
+
maxDistSq = defaultMaxDistSq
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
override fun resetConfig() {
|
|
27
|
+
super.resetConfig()
|
|
28
|
+
minDurationMs = DEFAULT_MIN_DURATION_MS
|
|
29
|
+
maxDistSq = defaultMaxDistSq
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
fun setMaxDist(maxDist: Float): LongPressGestureHandler {
|
|
33
|
+
maxDistSq = maxDist * maxDist
|
|
34
|
+
return this
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override fun onHandle(event: MotionEvent) {
|
|
38
|
+
if (state == STATE_UNDETERMINED) {
|
|
39
|
+
previousTime = SystemClock.uptimeMillis()
|
|
40
|
+
startTime = previousTime
|
|
41
|
+
begin()
|
|
42
|
+
startX = event.rawX
|
|
43
|
+
startY = event.rawY
|
|
44
|
+
handler = Handler()
|
|
45
|
+
if (minDurationMs > 0) {
|
|
46
|
+
handler!!.postDelayed({ activate() }, minDurationMs)
|
|
47
|
+
} else if (minDurationMs == 0L) {
|
|
48
|
+
activate()
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (event.actionMasked == MotionEvent.ACTION_UP) {
|
|
52
|
+
handler?.let {
|
|
53
|
+
it.removeCallbacksAndMessages(null)
|
|
54
|
+
handler = null
|
|
55
|
+
}
|
|
56
|
+
if (state == STATE_ACTIVE) {
|
|
57
|
+
end()
|
|
58
|
+
} else {
|
|
59
|
+
fail()
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
// calculate distance from start
|
|
63
|
+
val deltaX = event.rawX - startX
|
|
64
|
+
val deltaY = event.rawY - startY
|
|
65
|
+
val distSq = deltaX * deltaX + deltaY * deltaY
|
|
66
|
+
if (distSq > maxDistSq) {
|
|
67
|
+
if (state == STATE_ACTIVE) {
|
|
68
|
+
cancel()
|
|
69
|
+
} else {
|
|
70
|
+
fail()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
override fun onStateChange(newState: Int, previousState: Int) {
|
|
77
|
+
handler?.let {
|
|
78
|
+
it.removeCallbacksAndMessages(null)
|
|
79
|
+
handler = null
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
override fun dispatchStateChange(newState: Int, prevState: Int) {
|
|
84
|
+
previousTime = SystemClock.uptimeMillis()
|
|
85
|
+
super.dispatchStateChange(newState, prevState)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
override fun dispatchHandlerUpdate(event: MotionEvent) {
|
|
89
|
+
previousTime = SystemClock.uptimeMillis()
|
|
90
|
+
super.dispatchHandlerUpdate(event)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
companion object {
|
|
94
|
+
private const val DEFAULT_MIN_DURATION_MS: Long = 500
|
|
95
|
+
private const val DEFAULT_MAX_DIST_DP = 10f
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler
|
|
2
|
+
|
|
3
|
+
import android.os.SystemClock
|
|
4
|
+
import android.view.MotionEvent
|
|
5
|
+
import android.view.View
|
|
6
|
+
import android.view.ViewGroup
|
|
7
|
+
import com.swmansion.gesturehandler.react.RNGestureHandlerButtonViewManager
|
|
8
|
+
|
|
9
|
+
class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
10
|
+
private var shouldActivateOnStart = false
|
|
11
|
+
private var disallowInterruption = false
|
|
12
|
+
|
|
13
|
+
init {
|
|
14
|
+
setShouldCancelWhenOutside(true)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
override fun resetConfig() {
|
|
18
|
+
super.resetConfig()
|
|
19
|
+
shouldActivateOnStart = false
|
|
20
|
+
disallowInterruption = false
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
fun setShouldActivateOnStart(shouldActivateOnStart: Boolean) = apply {
|
|
24
|
+
this.shouldActivateOnStart = shouldActivateOnStart
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Set this to `true` when wrapping native components that are supposed to be an exclusive
|
|
29
|
+
* target for a touch stream. Like for example switch or slider component which when activated
|
|
30
|
+
* aren't supposed to be cancelled by scrollview or other container that may also handle touches.
|
|
31
|
+
*/
|
|
32
|
+
fun setDisallowInterruption(disallowInterruption: Boolean) = apply {
|
|
33
|
+
this.disallowInterruption = disallowInterruption
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
|
|
37
|
+
if (handler is NativeViewGestureHandler) {
|
|
38
|
+
// Special case when the peer handler is also an instance of NativeViewGestureHandler:
|
|
39
|
+
// For the `disallowInterruption` to work correctly we need to check the property when
|
|
40
|
+
// accessed as a peer, because simultaneous recognizers can be set on either side of the
|
|
41
|
+
// connection.
|
|
42
|
+
val nativeWrapper = handler
|
|
43
|
+
if (nativeWrapper.state == STATE_ACTIVE && nativeWrapper.disallowInterruption) {
|
|
44
|
+
// other handler is active and it disallows interruption, we don't want to get into its way
|
|
45
|
+
return false
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
val canBeInterrupted = !disallowInterruption
|
|
49
|
+
val otherState = handler.state
|
|
50
|
+
return if (state == STATE_ACTIVE && otherState == STATE_ACTIVE && canBeInterrupted) {
|
|
51
|
+
// if both handlers are active and the current handler can be interrupted it we return `false`
|
|
52
|
+
// as it means the other handler has turned active and returning `true` would prevent it from
|
|
53
|
+
// interrupting the current handler
|
|
54
|
+
false
|
|
55
|
+
} else state == STATE_ACTIVE && canBeInterrupted
|
|
56
|
+
// otherwise we can only return `true` if already in an active state
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
override fun shouldBeCancelledBy(handler: GestureHandler<*>): Boolean {
|
|
60
|
+
return !disallowInterruption
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private fun canStart(): Boolean {
|
|
64
|
+
val view = view
|
|
65
|
+
if (view is StateChangeHook) {
|
|
66
|
+
return view.canStart()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return true
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private fun afterGestureEnd() {
|
|
73
|
+
val view = view
|
|
74
|
+
if (view is StateChangeHook) {
|
|
75
|
+
view.afterGestureEnd()
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
override fun onHandle(event: MotionEvent) {
|
|
80
|
+
val view = view!!
|
|
81
|
+
if (event.actionMasked == MotionEvent.ACTION_UP) {
|
|
82
|
+
view.onTouchEvent(event)
|
|
83
|
+
if ((state == STATE_UNDETERMINED || state == STATE_BEGAN) && view.isPressed) {
|
|
84
|
+
activate()
|
|
85
|
+
}
|
|
86
|
+
end()
|
|
87
|
+
afterGestureEnd()
|
|
88
|
+
} else if (state == STATE_UNDETERMINED || state == STATE_BEGAN) {
|
|
89
|
+
when {
|
|
90
|
+
shouldActivateOnStart -> {
|
|
91
|
+
tryIntercept(view, event)
|
|
92
|
+
view.onTouchEvent(event)
|
|
93
|
+
activate()
|
|
94
|
+
}
|
|
95
|
+
tryIntercept(view, event) -> {
|
|
96
|
+
view.onTouchEvent(event)
|
|
97
|
+
activate()
|
|
98
|
+
}
|
|
99
|
+
state != STATE_BEGAN -> {
|
|
100
|
+
if (canStart()) {
|
|
101
|
+
begin()
|
|
102
|
+
} else {
|
|
103
|
+
cancel()
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
} else if (state == STATE_ACTIVE) {
|
|
108
|
+
view.onTouchEvent(event)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
override fun onCancel() {
|
|
113
|
+
val time = SystemClock.uptimeMillis()
|
|
114
|
+
val event = MotionEvent.obtain(time, time, MotionEvent.ACTION_CANCEL, 0f, 0f, 0).apply {
|
|
115
|
+
action = MotionEvent.ACTION_CANCEL
|
|
116
|
+
}
|
|
117
|
+
view!!.onTouchEvent(event)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
companion object {
|
|
121
|
+
private fun tryIntercept(view: View, event: MotionEvent) =
|
|
122
|
+
view is ViewGroup && view.onInterceptTouchEvent(event)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
interface StateChangeHook {
|
|
126
|
+
fun canStart(): Boolean
|
|
127
|
+
fun afterGestureEnd()
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler
|
|
2
|
+
|
|
3
|
+
import android.view.MotionEvent
|
|
4
|
+
|
|
5
|
+
interface OnTouchEventListener {
|
|
6
|
+
fun <T : GestureHandler<T>> onHandlerUpdate(handler: T, event: MotionEvent)
|
|
7
|
+
fun <T : GestureHandler<T>> onStateChange(handler: T, newState: Int, oldState: Int)
|
|
8
|
+
fun <T : GestureHandler<T>> onTouchEvent(handler: T)
|
|
9
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.view.MotionEvent
|
|
5
|
+
import android.view.VelocityTracker
|
|
6
|
+
import android.view.ViewConfiguration
|
|
7
|
+
import com.swmansion.gesturehandler.GestureUtils.getLastPointerX
|
|
8
|
+
import com.swmansion.gesturehandler.GestureUtils.getLastPointerY
|
|
9
|
+
|
|
10
|
+
class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>() {
|
|
11
|
+
var velocityX = 0f
|
|
12
|
+
private set
|
|
13
|
+
var velocityY = 0f
|
|
14
|
+
private set
|
|
15
|
+
val translationX: Float
|
|
16
|
+
get() = lastX - startX + offsetX
|
|
17
|
+
val translationY: Float
|
|
18
|
+
get() = lastY - startY + offsetY
|
|
19
|
+
|
|
20
|
+
private val defaultMinDistSq: Float
|
|
21
|
+
private var minDistSq = MAX_VALUE_IGNORE
|
|
22
|
+
private var activeOffsetXStart = MIN_VALUE_IGNORE
|
|
23
|
+
private var activeOffsetXEnd = MAX_VALUE_IGNORE
|
|
24
|
+
private var failOffsetXStart = MAX_VALUE_IGNORE
|
|
25
|
+
private var failOffsetXEnd = MIN_VALUE_IGNORE
|
|
26
|
+
private var activeOffsetYStart = MIN_VALUE_IGNORE
|
|
27
|
+
private var activeOffsetYEnd = MAX_VALUE_IGNORE
|
|
28
|
+
private var failOffsetYStart = MAX_VALUE_IGNORE
|
|
29
|
+
private var failOffsetYEnd = MIN_VALUE_IGNORE
|
|
30
|
+
private var minVelocityX = MIN_VALUE_IGNORE
|
|
31
|
+
private var minVelocityY = MIN_VALUE_IGNORE
|
|
32
|
+
private var minVelocitySq = MIN_VALUE_IGNORE
|
|
33
|
+
private var minPointers = DEFAULT_MIN_POINTERS
|
|
34
|
+
private var maxPointers = DEFAULT_MAX_POINTERS
|
|
35
|
+
private var startX = 0f
|
|
36
|
+
private var startY = 0f
|
|
37
|
+
private var offsetX = 0f
|
|
38
|
+
private var offsetY = 0f
|
|
39
|
+
private var lastX = 0f
|
|
40
|
+
private var lastY = 0f
|
|
41
|
+
private var velocityTracker: VelocityTracker? = null
|
|
42
|
+
private var averageTouches = false
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* On Android when there are multiple pointers on the screen pan gestures most often just consider
|
|
46
|
+
* the last placed pointer. The behaviour on iOS is quite different where the x and y component
|
|
47
|
+
* of the pan pointer is calculated as an average out of all the pointers placed on the screen.
|
|
48
|
+
*
|
|
49
|
+
* This behaviour can be customized on android by setting averageTouches property of the handler
|
|
50
|
+
* object. This could be useful in particular for the usecases when we attach other handlers that
|
|
51
|
+
* recognizes multi-finger gestures such as rotation. In that case when we only rely on the last
|
|
52
|
+
* placed finger it is easier for the gesture handler to trigger when we do a rotation gesture
|
|
53
|
+
* because each finger when treated separately will travel some distance, whereas the average
|
|
54
|
+
* position of all the fingers will remain still while doing a rotation gesture.
|
|
55
|
+
*/
|
|
56
|
+
init {
|
|
57
|
+
val vc = ViewConfiguration.get(context)
|
|
58
|
+
val touchSlop = vc.scaledTouchSlop
|
|
59
|
+
defaultMinDistSq = (touchSlop * touchSlop).toFloat()
|
|
60
|
+
minDistSq = defaultMinDistSq
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
override fun resetConfig() {
|
|
64
|
+
super.resetConfig()
|
|
65
|
+
activeOffsetXStart = MIN_VALUE_IGNORE
|
|
66
|
+
activeOffsetXEnd = MAX_VALUE_IGNORE
|
|
67
|
+
failOffsetXStart = MAX_VALUE_IGNORE
|
|
68
|
+
failOffsetXEnd = MIN_VALUE_IGNORE
|
|
69
|
+
activeOffsetYStart = MIN_VALUE_IGNORE
|
|
70
|
+
activeOffsetYEnd = MAX_VALUE_IGNORE
|
|
71
|
+
failOffsetYStart = MAX_VALUE_IGNORE
|
|
72
|
+
failOffsetYEnd = MIN_VALUE_IGNORE
|
|
73
|
+
minVelocityX = MIN_VALUE_IGNORE
|
|
74
|
+
minVelocityY = MIN_VALUE_IGNORE
|
|
75
|
+
minVelocitySq = MIN_VALUE_IGNORE
|
|
76
|
+
minDistSq = defaultMinDistSq
|
|
77
|
+
minPointers = DEFAULT_MIN_POINTERS
|
|
78
|
+
maxPointers = DEFAULT_MAX_POINTERS
|
|
79
|
+
averageTouches = false
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
fun setActiveOffsetXStart(activeOffsetXStart: Float) = apply {
|
|
83
|
+
this.activeOffsetXStart = activeOffsetXStart
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fun setActiveOffsetXEnd(activeOffsetXEnd: Float) = apply {
|
|
87
|
+
this.activeOffsetXEnd = activeOffsetXEnd
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
fun setFailOffsetXStart(failOffsetXStart: Float) = apply {
|
|
91
|
+
this.failOffsetXStart = failOffsetXStart
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
fun setFailOffsetXEnd(failOffsetXEnd: Float) = apply {
|
|
95
|
+
this.failOffsetXEnd = failOffsetXEnd
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
fun setActiveOffsetYStart(activeOffsetYStart: Float) = apply {
|
|
99
|
+
this.activeOffsetYStart = activeOffsetYStart
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
fun setActiveOffsetYEnd(activeOffsetYEnd: Float) = apply {
|
|
103
|
+
this.activeOffsetYEnd = activeOffsetYEnd
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
fun setFailOffsetYStart(failOffsetYStart: Float) = apply {
|
|
107
|
+
this.failOffsetYStart = failOffsetYStart
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
fun setFailOffsetYEnd(failOffsetYEnd: Float) = apply {
|
|
111
|
+
this.failOffsetYEnd = failOffsetYEnd
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fun setMinDist(minDist: Float) = apply {
|
|
115
|
+
minDistSq = minDist * minDist
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
fun setMinPointers(minPointers: Int) = apply {
|
|
119
|
+
this.minPointers = minPointers
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
fun setMaxPointers(maxPointers: Int) = apply {
|
|
123
|
+
this.maxPointers = maxPointers
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fun setAverageTouches(averageTouches: Boolean) = apply {
|
|
127
|
+
this.averageTouches = averageTouches
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @param minVelocity in pixels per second
|
|
132
|
+
*/
|
|
133
|
+
fun setMinVelocity(minVelocity: Float) = apply {
|
|
134
|
+
minVelocitySq = minVelocity * minVelocity
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fun setMinVelocityX(minVelocityX: Float) = apply {
|
|
138
|
+
this.minVelocityX = minVelocityX
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
fun setMinVelocityY(minVelocityY: Float) = apply {
|
|
142
|
+
this.minVelocityY = minVelocityY
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private fun shouldActivate(): Boolean {
|
|
146
|
+
val dx = lastX - startX + offsetX
|
|
147
|
+
if (activeOffsetXStart != MIN_VALUE_IGNORE && dx < activeOffsetXStart) {
|
|
148
|
+
return true
|
|
149
|
+
}
|
|
150
|
+
if (activeOffsetXEnd != MAX_VALUE_IGNORE && dx > activeOffsetXEnd) {
|
|
151
|
+
return true
|
|
152
|
+
}
|
|
153
|
+
val dy = lastY - startY + offsetY
|
|
154
|
+
if (activeOffsetYStart != MIN_VALUE_IGNORE && dy < activeOffsetYStart) {
|
|
155
|
+
return true
|
|
156
|
+
}
|
|
157
|
+
if (activeOffsetYEnd != MAX_VALUE_IGNORE && dy > activeOffsetYEnd) {
|
|
158
|
+
return true
|
|
159
|
+
}
|
|
160
|
+
val distSq = dx * dx + dy * dy
|
|
161
|
+
if (minDistSq != MIN_VALUE_IGNORE && distSq >= minDistSq) {
|
|
162
|
+
return true
|
|
163
|
+
}
|
|
164
|
+
val vx = velocityX
|
|
165
|
+
if (minVelocityX != MIN_VALUE_IGNORE &&
|
|
166
|
+
(minVelocityX < 0 && vx <= minVelocityX || minVelocityX in 0.0f..vx)) {
|
|
167
|
+
return true
|
|
168
|
+
}
|
|
169
|
+
val vy = velocityY
|
|
170
|
+
if (minVelocityY != MIN_VALUE_IGNORE &&
|
|
171
|
+
(minVelocityY < 0 && vx <= minVelocityY || minVelocityY in 0.0f..vx)) {
|
|
172
|
+
return true
|
|
173
|
+
}
|
|
174
|
+
val velocitySq = vx * vx + vy * vy
|
|
175
|
+
return minVelocitySq != MIN_VALUE_IGNORE && velocitySq >= minVelocitySq
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private fun shouldFail(): Boolean {
|
|
179
|
+
val dx = lastX - startX + offsetX
|
|
180
|
+
if (failOffsetXStart != MAX_VALUE_IGNORE && dx < failOffsetXStart) {
|
|
181
|
+
return true
|
|
182
|
+
}
|
|
183
|
+
if (failOffsetXEnd != MIN_VALUE_IGNORE && dx > failOffsetXEnd) {
|
|
184
|
+
return true
|
|
185
|
+
}
|
|
186
|
+
val dy = lastY - startY + offsetY
|
|
187
|
+
if (failOffsetYStart != MAX_VALUE_IGNORE && dy < failOffsetYStart) {
|
|
188
|
+
return true
|
|
189
|
+
}
|
|
190
|
+
return failOffsetYEnd != MIN_VALUE_IGNORE && dy > failOffsetYEnd
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
override fun onHandle(event: MotionEvent) {
|
|
194
|
+
val state = state
|
|
195
|
+
val action = event.actionMasked
|
|
196
|
+
if (action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_POINTER_DOWN) {
|
|
197
|
+
// update offset if new pointer gets added or removed
|
|
198
|
+
offsetX += lastX - startX
|
|
199
|
+
offsetY += lastY - startY
|
|
200
|
+
|
|
201
|
+
// reset starting point
|
|
202
|
+
lastX = getLastPointerX(event, averageTouches)
|
|
203
|
+
lastY = getLastPointerY(event, averageTouches)
|
|
204
|
+
startX = lastX
|
|
205
|
+
startY = lastY
|
|
206
|
+
} else {
|
|
207
|
+
lastX = getLastPointerX(event, averageTouches)
|
|
208
|
+
lastY = getLastPointerY(event, averageTouches)
|
|
209
|
+
}
|
|
210
|
+
if (state == STATE_UNDETERMINED && event.pointerCount >= minPointers) {
|
|
211
|
+
startX = lastX
|
|
212
|
+
startY = lastY
|
|
213
|
+
offsetX = 0f
|
|
214
|
+
offsetY = 0f
|
|
215
|
+
velocityX = 0f
|
|
216
|
+
velocityY = 0f
|
|
217
|
+
velocityTracker = VelocityTracker.obtain()
|
|
218
|
+
addVelocityMovement(velocityTracker, event)
|
|
219
|
+
begin()
|
|
220
|
+
} else if (velocityTracker != null) {
|
|
221
|
+
addVelocityMovement(velocityTracker, event)
|
|
222
|
+
velocityTracker!!.computeCurrentVelocity(1000)
|
|
223
|
+
velocityX = velocityTracker!!.xVelocity
|
|
224
|
+
velocityY = velocityTracker!!.yVelocity
|
|
225
|
+
}
|
|
226
|
+
if (action == MotionEvent.ACTION_UP) {
|
|
227
|
+
if (state == STATE_ACTIVE) {
|
|
228
|
+
end()
|
|
229
|
+
} else {
|
|
230
|
+
fail()
|
|
231
|
+
}
|
|
232
|
+
} else if (action == MotionEvent.ACTION_POINTER_DOWN && event.pointerCount > maxPointers) {
|
|
233
|
+
// When new finger is placed down (POINTER_DOWN) we check if MAX_POINTERS is not exceeded
|
|
234
|
+
if (state == STATE_ACTIVE) {
|
|
235
|
+
cancel()
|
|
236
|
+
} else {
|
|
237
|
+
fail()
|
|
238
|
+
}
|
|
239
|
+
} else if (action == MotionEvent.ACTION_POINTER_UP && state == STATE_ACTIVE && event.pointerCount < minPointers) {
|
|
240
|
+
// When finger is lifted up (POINTER_UP) and the number of pointers falls below MIN_POINTERS
|
|
241
|
+
// threshold, we only want to take an action when the handler has already activated. Otherwise
|
|
242
|
+
// we can still expect more fingers to be placed on screen and fulfill MIN_POINTERS criteria.
|
|
243
|
+
fail()
|
|
244
|
+
} else if (state == STATE_BEGAN) {
|
|
245
|
+
if (shouldFail()) {
|
|
246
|
+
fail()
|
|
247
|
+
} else if (shouldActivate()) {
|
|
248
|
+
activate()
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
override fun activate(force: Boolean) {
|
|
254
|
+
// reset starting point if the handler has not yet activated
|
|
255
|
+
if (state != STATE_ACTIVE) {
|
|
256
|
+
startX = lastX
|
|
257
|
+
startY = lastY
|
|
258
|
+
}
|
|
259
|
+
super.activate(force)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
override fun onReset() {
|
|
263
|
+
velocityTracker?.let {
|
|
264
|
+
it.recycle()
|
|
265
|
+
velocityTracker = null
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
companion object {
|
|
270
|
+
private const val MIN_VALUE_IGNORE = Float.MAX_VALUE
|
|
271
|
+
private const val MAX_VALUE_IGNORE = Float.MIN_VALUE
|
|
272
|
+
private const val DEFAULT_MIN_POINTERS = 1
|
|
273
|
+
private const val DEFAULT_MAX_POINTERS = 10
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* This method adds movement to {@class VelocityTracker} first resetting offset of the event so
|
|
277
|
+
* that the velocity is calculated based on the absolute position of touch pointers. This is
|
|
278
|
+
* because if the underlying view moves along with the finger using relative x/y coords yields
|
|
279
|
+
* incorrect results.
|
|
280
|
+
*/
|
|
281
|
+
private fun addVelocityMovement(tracker: VelocityTracker?, event: MotionEvent) {
|
|
282
|
+
val offsetX = event.rawX - event.x
|
|
283
|
+
val offsetY = event.rawY - event.y
|
|
284
|
+
event.offsetLocation(offsetX, offsetY)
|
|
285
|
+
tracker!!.addMovement(event)
|
|
286
|
+
event.offsetLocation(-offsetX, -offsetY)
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler
|
|
2
|
+
|
|
3
|
+
import android.view.MotionEvent
|
|
4
|
+
import android.view.ScaleGestureDetector
|
|
5
|
+
import android.view.ScaleGestureDetector.OnScaleGestureListener
|
|
6
|
+
import android.view.ViewConfiguration
|
|
7
|
+
import kotlin.math.abs
|
|
8
|
+
|
|
9
|
+
class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
|
|
10
|
+
var scale = 0.0
|
|
11
|
+
private set
|
|
12
|
+
var velocity = 0.0
|
|
13
|
+
private set
|
|
14
|
+
val focalPointX: Float
|
|
15
|
+
get() = scaleGestureDetector?.focusX ?: Float.NaN
|
|
16
|
+
val focalPointY: Float
|
|
17
|
+
get() = scaleGestureDetector?.focusY ?: Float.NaN
|
|
18
|
+
|
|
19
|
+
private var scaleGestureDetector: ScaleGestureDetector? = null
|
|
20
|
+
private var startingSpan = 0f
|
|
21
|
+
private var spanSlop = 0f
|
|
22
|
+
private val gestureListener: OnScaleGestureListener = object : OnScaleGestureListener {
|
|
23
|
+
override fun onScale(detector: ScaleGestureDetector): Boolean {
|
|
24
|
+
val prevScaleFactor: Double = scale
|
|
25
|
+
scale *= detector.scaleFactor.toDouble()
|
|
26
|
+
val delta = detector.timeDelta
|
|
27
|
+
if (delta > 0) {
|
|
28
|
+
velocity = (scale - prevScaleFactor) / delta
|
|
29
|
+
}
|
|
30
|
+
if (abs(startingSpan - detector.currentSpan) >= spanSlop
|
|
31
|
+
&& state == STATE_BEGAN) {
|
|
32
|
+
activate()
|
|
33
|
+
}
|
|
34
|
+
return true
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
init {
|
|
38
|
+
setShouldCancelWhenOutside(false)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
override fun onScaleBegin(detector: ScaleGestureDetector): Boolean {
|
|
42
|
+
startingSpan = detector.currentSpan
|
|
43
|
+
return true
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
override fun onScaleEnd(detector: ScaleGestureDetector) {
|
|
47
|
+
// ScaleGestureDetector thinks that when fingers are 27mm away that's a sufficiently good
|
|
48
|
+
// reason to trigger this method giving us no other choice but to ignore it completely.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
override fun onHandle(event: MotionEvent) {
|
|
53
|
+
if (state == STATE_UNDETERMINED) {
|
|
54
|
+
val context = view!!.context
|
|
55
|
+
velocity = 0.0
|
|
56
|
+
scale = 1.0
|
|
57
|
+
scaleGestureDetector = ScaleGestureDetector(context, gestureListener)
|
|
58
|
+
val configuration = ViewConfiguration.get(context)
|
|
59
|
+
spanSlop = configuration.scaledTouchSlop.toFloat()
|
|
60
|
+
begin()
|
|
61
|
+
}
|
|
62
|
+
scaleGestureDetector?.onTouchEvent(event)
|
|
63
|
+
var activePointers = event.pointerCount
|
|
64
|
+
if (event.actionMasked == MotionEvent.ACTION_POINTER_UP) {
|
|
65
|
+
activePointers -= 1
|
|
66
|
+
}
|
|
67
|
+
if (state == STATE_ACTIVE && activePointers < 2) {
|
|
68
|
+
end()
|
|
69
|
+
} else if (event.actionMasked == MotionEvent.ACTION_UP) {
|
|
70
|
+
fail()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
override fun activate(force: Boolean) {
|
|
75
|
+
// reset scale if the handler has not yet activated
|
|
76
|
+
if (state != STATE_ACTIVE) {
|
|
77
|
+
velocity = 0.0
|
|
78
|
+
scale = 1.0
|
|
79
|
+
}
|
|
80
|
+
super.activate(force)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
override fun onReset() {
|
|
84
|
+
scaleGestureDetector = null
|
|
85
|
+
velocity = 0.0
|
|
86
|
+
scale = 1.0
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
package com.swmansion.gesturehandler
|
|
2
|
-
|
|
3
|
-
public enum PointerEventsConfig {
|
|
1
|
+
package com.swmansion.gesturehandler
|
|
4
2
|
|
|
3
|
+
enum class PointerEventsConfig {
|
|
5
4
|
/**
|
|
6
5
|
* Neither the container nor its children receive events.
|
|
7
6
|
*/
|
|
@@ -20,6 +19,5 @@ public enum PointerEventsConfig {
|
|
|
20
19
|
/**
|
|
21
20
|
* Container and all of its children receive touch events (like pointerEvents is unspecified).
|
|
22
21
|
*/
|
|
23
|
-
AUTO
|
|
24
|
-
;
|
|
22
|
+
AUTO
|
|
25
23
|
}
|