react-native-gesture-handler 2.1.2 → 2.3.0
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/LICENSE +1 -1
- package/README.md +8 -3
- package/RNGestureHandler.podspec +27 -3
- package/android/build.gradle +82 -9
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +47 -12
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +50 -14
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +7 -4
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +8 -8
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +6 -4
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ScaleGestureDetector.java +558 -0
- package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +29 -0
- package/android/src/fabric/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +12 -0
- package/android/src/main/AndroidManifest.xml +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +29 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +29 -10
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +119 -55
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +9 -4
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +17 -2
- package/android/src/main/jni/Android.mk +53 -0
- package/android/src/main/jni/OnLoad.cpp +9 -0
- package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +71 -0
- package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +34 -0
- package/android/src/main/jni/cpp-adapter.cpp +41 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +47 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +22 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerDelegate.java +25 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerInterface.java +16 -0
- package/android/src/paper/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +13 -0
- package/ios/Handlers/RNFlingHandler.m +2 -0
- package/ios/Handlers/RNPanHandler.m +2 -0
- package/ios/Handlers/RNPinchHandler.m +2 -0
- package/ios/Handlers/RNRotationHandler.m +2 -0
- package/ios/RNGestureHandler.h +3 -8
- package/ios/RNGestureHandler.m +2 -10
- package/ios/RNGestureHandlerActionType.h +8 -0
- package/ios/RNGestureHandlerButtonComponentView.h +17 -0
- package/ios/RNGestureHandlerButtonComponentView.mm +48 -0
- package/ios/RNGestureHandlerButtonManager.h +5 -0
- package/ios/RNGestureHandlerButtonManager.m +30 -0
- package/ios/RNGestureHandlerManager.h +2 -4
- package/ios/{RNGestureHandlerManager.m → RNGestureHandlerManager.mm} +92 -20
- package/ios/{RNGestureHandlerModule.m → RNGestureHandlerModule.mm} +91 -36
- package/ios/RNGestureHandlerRegistry.h +1 -2
- package/ios/RNGestureHandlerRegistry.m +2 -11
- package/ios/RNGestureHandlerRootViewComponentView.mm +21 -0
- package/lib/commonjs/ActionType.js +15 -0
- package/lib/commonjs/ActionType.js.map +1 -0
- package/lib/commonjs/GestureHandlerRootView.android.js +6 -6
- package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
- package/lib/commonjs/GestureHandlerRootView.js +2 -3
- package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.js +4 -2
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/components/DrawerLayout.js +2 -2
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerButton.js +5 -2
- package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js +22 -20
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +21 -0
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +21 -0
- package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
- package/lib/commonjs/getShadowNodeFromRef.js +24 -0
- package/lib/commonjs/getShadowNodeFromRef.js.map +1 -0
- package/lib/commonjs/getShadowNodeFromRef.web.js +15 -0
- package/lib/commonjs/getShadowNodeFromRef.web.js.map +1 -0
- package/lib/commonjs/handlers/FlingGestureHandler.js +4 -2
- package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js +8 -4
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/LongPressGestureHandler.js +4 -2
- package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/NativeViewGestureHandler.js +4 -2
- package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PanGestureHandler.js +4 -2
- package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PinchGestureHandler.js +4 -2
- package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/RotationGestureHandler.js +4 -2
- package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/TapGestureHandler.js +4 -2
- package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +72 -8
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/createNativeWrapper.js +6 -2
- package/lib/commonjs/handlers/createNativeWrapper.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js +84 -32
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/eventReceiver.js +25 -8
- package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js +16 -1
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gestureStateManager.js +7 -4
- package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
- package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +4 -1
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/commonjs/handlers/handlersRegistry.js +42 -6
- package/lib/commonjs/handlers/handlersRegistry.js.map +1 -1
- package/lib/commonjs/index.js +14 -106
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/init.js +10 -0
- package/lib/commonjs/init.js.map +1 -1
- package/lib/commonjs/jestUtils.js +375 -0
- package/lib/commonjs/jestUtils.js.map +1 -0
- package/lib/commonjs/utils.js +38 -0
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/module/ActionType.js +7 -0
- package/lib/module/ActionType.js.map +1 -0
- package/lib/module/GestureHandlerRootView.android.js +5 -6
- package/lib/module/GestureHandlerRootView.android.js.map +1 -1
- package/lib/module/GestureHandlerRootView.js +2 -3
- package/lib/module/GestureHandlerRootView.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.js +3 -2
- package/lib/module/RNGestureHandlerModule.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +1 -1
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/components/DrawerLayout.js +2 -2
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/GestureHandlerButton.js +4 -2
- package/lib/module/components/GestureHandlerButton.js.map +1 -1
- package/lib/module/components/Swipeable.js +22 -20
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +9 -0
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
- package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +9 -0
- package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
- package/lib/module/getShadowNodeFromRef.js +17 -0
- package/lib/module/getShadowNodeFromRef.js.map +1 -0
- package/lib/module/getShadowNodeFromRef.web.js +8 -0
- package/lib/module/getShadowNodeFromRef.web.js.map +1 -0
- package/lib/module/handlers/FlingGestureHandler.js +2 -1
- package/lib/module/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/module/handlers/ForceTouchGestureHandler.js +5 -3
- package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
- package/lib/module/handlers/LongPressGestureHandler.js +2 -1
- package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/handlers/NativeViewGestureHandler.js +2 -1
- package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/handlers/PanGestureHandler.js +2 -1
- package/lib/module/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/handlers/PinchGestureHandler.js +2 -1
- package/lib/module/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/module/handlers/RotationGestureHandler.js +2 -1
- package/lib/module/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/module/handlers/TapGestureHandler.js +2 -1
- package/lib/module/handlers/TapGestureHandler.js.map +1 -1
- package/lib/module/handlers/createHandler.js +72 -9
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/createNativeWrapper.js +6 -2
- package/lib/module/handlers/createNativeWrapper.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +79 -32
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/eventReceiver.js +25 -7
- package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js +16 -1
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/gestureStateManager.js +6 -4
- package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
- package/lib/module/handlers/gestures/panGesture.js.map +1 -1
- package/lib/module/handlers/gestures/pinchGesture.js.map +1 -1
- package/lib/module/handlers/gestures/reanimatedWrapper.js +2 -1
- package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/module/handlers/handlersRegistry.js +34 -6
- package/lib/module/handlers/handlersRegistry.js.map +1 -1
- package/lib/module/index.js +1 -11
- package/lib/module/index.js.map +1 -1
- package/lib/module/init.js +6 -0
- package/lib/module/init.js.map +1 -1
- package/lib/module/jestUtils.js +350 -0
- package/lib/module/jestUtils.js.map +1 -0
- package/lib/module/utils.js +28 -0
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/ActionType.d.ts +7 -0
- package/lib/typescript/GestureHandlerRootView.android.d.ts +5 -2
- package/lib/typescript/GestureHandlerRootView.d.ts +1 -1
- package/lib/typescript/RNGestureHandlerModule.d.ts +3 -1
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +2 -1
- package/lib/typescript/components/GestureHandlerButton.d.ts +2 -2
- package/lib/typescript/components/Swipeable.d.ts +12 -4
- package/lib/typescript/getShadowNodeFromRef.d.ts +1 -0
- package/lib/typescript/getShadowNodeFromRef.web.d.ts +1 -0
- package/lib/typescript/handlers/FlingGestureHandler.d.ts +1 -0
- package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -1
- package/lib/typescript/handlers/LongPressGestureHandler.d.ts +3 -2
- package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -0
- package/lib/typescript/handlers/PanGestureHandler.d.ts +3 -2
- package/lib/typescript/handlers/PinchGestureHandler.d.ts +1 -0
- package/lib/typescript/handlers/RotationGestureHandler.d.ts +1 -0
- package/lib/typescript/handlers/TapGestureHandler.d.ts +1 -0
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +2 -4
- package/lib/typescript/handlers/gestures/GestureDetector.d.ts +4 -1
- package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +1 -2
- package/lib/typescript/handlers/gestures/gesture.d.ts +5 -0
- package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -2
- package/lib/typescript/handlers/gestures/pinchGesture.d.ts +1 -2
- package/lib/typescript/handlers/handlersRegistry.d.ts +11 -3
- package/lib/typescript/index.d.ts +15 -11
- package/lib/typescript/jestUtils.d.ts +28 -0
- package/lib/typescript/utils.d.ts +6 -0
- package/lib/typescript/web/constants.d.ts +0 -1
- package/package.json +39 -16
- package/src/ActionType.ts +9 -0
- package/src/GestureHandlerRootView.android.tsx +14 -14
- package/src/GestureHandlerRootView.tsx +4 -4
- package/src/RNGestureHandlerModule.ts +11 -6
- package/src/RNGestureHandlerModule.web.ts +2 -1
- package/src/components/DrawerLayout.tsx +8 -2
- package/src/components/GestureHandlerButton.tsx +7 -4
- package/src/components/Swipeable.tsx +28 -22
- package/src/fabric/RNGestureHandlerButtonNativeComponent.js +27 -0
- package/src/fabric/RNGestureHandlerRootViewNativeComponent.js +19 -0
- package/src/getShadowNodeFromRef.ts +19 -0
- package/src/getShadowNodeFromRef.web.ts +7 -0
- package/src/handlers/FlingGestureHandler.ts +3 -1
- package/src/handlers/ForceTouchGestureHandler.ts +8 -2
- package/src/handlers/LongPressGestureHandler.ts +5 -3
- package/src/handlers/NativeViewGestureHandler.ts +3 -1
- package/src/handlers/PanGestureHandler.ts +5 -3
- package/src/handlers/PinchGestureHandler.ts +3 -1
- package/src/handlers/RotationGestureHandler.ts +3 -1
- package/src/handlers/TapGestureHandler.ts +3 -1
- package/src/handlers/createHandler.ts +80 -5
- package/src/handlers/createNativeWrapper.tsx +7 -1
- package/src/handlers/gestureHandlerCommon.ts +2 -5
- package/src/handlers/gestures/GestureDetector.tsx +110 -37
- package/src/handlers/gestures/eventReceiver.ts +23 -19
- package/src/handlers/gestures/forceTouchGesture.ts +1 -1
- package/src/handlers/gestures/gesture.ts +21 -1
- package/src/handlers/gestures/gestureStateManager.ts +9 -12
- package/src/handlers/gestures/panGesture.ts +1 -1
- package/src/handlers/gestures/pinchGesture.ts +1 -1
- package/src/handlers/gestures/reanimatedWrapper.ts +4 -1
- package/src/handlers/handlersRegistry.ts +44 -6
- package/src/index.ts +15 -11
- package/src/init.ts +6 -0
- package/src/jestUtils.ts +506 -0
- package/src/utils.ts +38 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +0 -18
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +0 -21
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +0 -17
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2016
|
|
3
|
+
Copyright (c) 2016 Software Mansion <swmansion.com>
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -11,6 +11,10 @@ It makes touch interactions and gesture tracking not only smooth, but also depen
|
|
|
11
11
|
|
|
12
12
|
Check [getting started](https://docs.swmansion.com/react-native-gesture-handler/docs/#installation) section of our docs for the detailed installation instructions.
|
|
13
13
|
|
|
14
|
+
## Fabric
|
|
15
|
+
|
|
16
|
+
To learn how to use `react-native-gesture-handler` with Fabric architecture, head over to [Fabric README](README-Fabric.md). Instructions on how to run Fabric Example within this repo can be found in the [FabricExample README](FabricExample/README.md).
|
|
17
|
+
|
|
14
18
|
## Documentation
|
|
15
19
|
|
|
16
20
|
Check out our dedicated documentation page for info about this library, API reference and more: [https://docs.swmansion.com/react-native-gesture-handler/docs/](https://docs.swmansion.com/react-native-gesture-handler/docs/)
|
|
@@ -31,7 +35,7 @@ Run `yarn android` or `yarn ios` (depending on which platform you want to run th
|
|
|
31
35
|
|
|
32
36
|
You will need to have an Android or iOS device or emulator connected as well as `react-native-cli` package installed globally.
|
|
33
37
|
|
|
34
|
-
## React
|
|
38
|
+
## React Native Support
|
|
35
39
|
|
|
36
40
|
| version | react-native version |
|
|
37
41
|
| ------- | -------------------- |
|
|
@@ -47,7 +51,8 @@ Gesture handler library is licensed under [The MIT License](LICENSE).
|
|
|
47
51
|
|
|
48
52
|
## Credits
|
|
49
53
|
|
|
50
|
-
This project is
|
|
54
|
+
This project has been build and is maintained thanks to the support from [Shopify](https://shopify.com), [Expo.io](https://expo.io) and [Software Mansion](https://swmansion.com)
|
|
51
55
|
|
|
56
|
+
[](https://shopify.com)
|
|
52
57
|
[](https://expo.io)
|
|
53
|
-
[](https://swmansion.com)
|
package/RNGestureHandler.podspec
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require "json"
|
|
2
2
|
|
|
3
|
+
fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED']
|
|
4
|
+
|
|
3
5
|
Pod::Spec.new do |s|
|
|
4
6
|
# NPM package specification
|
|
5
7
|
package = JSON.parse(File.read(File.join(File.dirname(__FILE__), "package.json")))
|
|
@@ -10,10 +12,32 @@ Pod::Spec.new do |s|
|
|
|
10
12
|
s.homepage = "https://github.com/software-mansion/react-native-gesture-handler"
|
|
11
13
|
s.license = "MIT"
|
|
12
14
|
s.author = { package["author"]["name"] => package["author"]["email"] }
|
|
13
|
-
s.platforms = { :ios => "9.0", :tvos => "9.0" }
|
|
14
15
|
s.source = { :git => "https://github.com/software-mansion/react-native-gesture-handler", :tag => "#{s.version}" }
|
|
15
|
-
s.source_files = "ios/**/*.{h,m}"
|
|
16
|
+
s.source_files = "ios/**/*.{h,m,mm}"
|
|
17
|
+
s.requires_arc = true
|
|
18
|
+
|
|
19
|
+
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
|
+
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
|
|
24
|
+
|
|
25
|
+
s.pod_target_xcconfig = {
|
|
26
|
+
'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"'
|
|
27
|
+
}
|
|
28
|
+
s.platforms = { ios: '11.0', tvos: '11.0' }
|
|
29
|
+
s.compiler_flags = folly_compiler_flags + ' -DRN_FABRIC_ENABLED'
|
|
16
30
|
|
|
17
|
-
|
|
31
|
+
s.dependency "React"
|
|
32
|
+
s.dependency "React-RCTFabric" # This is for fabric component
|
|
33
|
+
s.dependency "React-Codegen"
|
|
34
|
+
s.dependency "RCT-Folly", folly_version
|
|
35
|
+
s.dependency "RCTRequired"
|
|
36
|
+
s.dependency "RCTTypeSafety"
|
|
37
|
+
s.dependency "ReactCommon/turbomodule/core"
|
|
38
|
+
else
|
|
39
|
+
s.platforms = { :ios => "9.0", :tvos => "9.0" }
|
|
18
40
|
|
|
41
|
+
s.dependency "React-Core"
|
|
42
|
+
end
|
|
19
43
|
end
|
package/android/build.gradle
CHANGED
|
@@ -12,6 +12,17 @@ buildscript {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
def isNewArchitectureEnabled() {
|
|
16
|
+
// To opt-in for the New Architecture, you can either:
|
|
17
|
+
// - Set `newArchEnabled` to true inside the `gradle.properties` file
|
|
18
|
+
// - Invoke gradle with `-newArchEnabled=true`
|
|
19
|
+
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
|
|
20
|
+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (isNewArchitectureEnabled()) {
|
|
24
|
+
apply plugin: 'com.facebook.react'
|
|
25
|
+
}
|
|
15
26
|
apply plugin: 'com.android.library'
|
|
16
27
|
apply plugin: 'kotlin-android'
|
|
17
28
|
|
|
@@ -27,7 +38,7 @@ def shouldUseCommonInterfaceFromReanimated() {
|
|
|
27
38
|
def json = new JsonSlurper().parseText(inputFile.text)
|
|
28
39
|
def reanimatedVersion = json.version as String
|
|
29
40
|
def (major, minor, patch) = reanimatedVersion.tokenize('.')
|
|
30
|
-
return Integer.parseInt(minor) >= 3
|
|
41
|
+
return Integer.parseInt(major) == 2 && Integer.parseInt(minor) >= 3
|
|
31
42
|
} else {
|
|
32
43
|
return false
|
|
33
44
|
}
|
|
@@ -45,18 +56,62 @@ android {
|
|
|
45
56
|
targetSdkVersion safeExtGet('targetSdkVersion', 28)
|
|
46
57
|
versionCode 1
|
|
47
58
|
versionName "1.0"
|
|
59
|
+
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
60
|
+
if (isNewArchitectureEnabled()) {
|
|
61
|
+
var appProject = rootProject.allprojects.find {it.plugins.hasPlugin('com.android.application')}
|
|
62
|
+
externalNativeBuild {
|
|
63
|
+
ndkBuild {
|
|
64
|
+
arguments "APP_PLATFORM=android-21",
|
|
65
|
+
"APP_STL=c++_shared",
|
|
66
|
+
"NDK_TOOLCHAIN_VERSION=clang",
|
|
67
|
+
"GENERATED_SRC_DIR=${appProject.buildDir}/generated/source",
|
|
68
|
+
"PROJECT_BUILD_DIR=${appProject.buildDir}",
|
|
69
|
+
"REACT_ANDROID_DIR=${appProject.rootDir}/../node_modules/react-native/ReactAndroid",
|
|
70
|
+
"REACT_ANDROID_BUILD_DIR=${appProject.rootDir}/../node_modules/react-native/ReactAndroid/build"
|
|
71
|
+
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
|
|
72
|
+
cppFlags "-std=c++17"
|
|
73
|
+
targets "rngesturehandler_modules"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (isNewArchitectureEnabled()) {
|
|
80
|
+
externalNativeBuild {
|
|
81
|
+
ndkBuild {
|
|
82
|
+
path "src/main/jni/Android.mk"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
packagingOptions {
|
|
88
|
+
// For some reason gradle only complains about the duplicated version of libreact_render libraries
|
|
89
|
+
// while there are more libraries copied in intermediates folder of the lib build directory, we exclude
|
|
90
|
+
// only the ones that make the build fail (ideally we should only include librngesturehandler_modules but we
|
|
91
|
+
// are only allowed to specify exclude patterns)
|
|
92
|
+
exclude "**/libreact_render*.so"
|
|
48
93
|
}
|
|
49
94
|
|
|
50
95
|
// Include "lib/" as sources, unfortunately react-native link can't handle
|
|
51
96
|
// setting up alternative gradle modules. We still have "lib" defined as a
|
|
52
97
|
// standalone gradle module just to be used in AndroidNativeExample
|
|
53
|
-
sourceSets {
|
|
54
|
-
|
|
98
|
+
sourceSets.main {
|
|
99
|
+
java {
|
|
100
|
+
srcDirs += 'lib/src/main/java'
|
|
55
101
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
102
|
+
// Include "common/" only when it's not provided by Reanimated to mitigate
|
|
103
|
+
// multiple definitions of the same class preventing build
|
|
104
|
+
if (!shouldUseCommonInterfaceFromReanimated()) {
|
|
105
|
+
srcDirs += 'common/src/main/java'
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (isNewArchitectureEnabled()) {
|
|
109
|
+
srcDirs += 'src/fabric/java'
|
|
110
|
+
} else {
|
|
111
|
+
// this folder also includes files from codegen so the library can compile with
|
|
112
|
+
// codegen turned off
|
|
113
|
+
srcDirs += 'src/paper/java'
|
|
114
|
+
}
|
|
60
115
|
}
|
|
61
116
|
}
|
|
62
117
|
}
|
|
@@ -65,12 +120,30 @@ def kotlin_version = safeExtGet('kotlinVersion', project.properties['RNGH_kotlin
|
|
|
65
120
|
|
|
66
121
|
dependencies {
|
|
67
122
|
//noinspection GradleDynamicVersion
|
|
123
|
+
if (isNewArchitectureEnabled()) {
|
|
124
|
+
implementation project(':ReactAndroid')
|
|
125
|
+
} else {
|
|
126
|
+
implementation 'com.facebook.react:react-native:+'
|
|
127
|
+
}
|
|
128
|
+
|
|
68
129
|
if (shouldUseCommonInterfaceFromReanimated()) {
|
|
69
130
|
// Include Reanimated as dependency to load the common interface
|
|
70
|
-
implementation project(':react-native-reanimated')
|
|
131
|
+
implementation (project(':react-native-reanimated')) {
|
|
132
|
+
exclude group:'com.facebook.fbjni' // resolves "Duplicate class com.facebook.jni.CppException"
|
|
133
|
+
}
|
|
71
134
|
}
|
|
72
|
-
|
|
135
|
+
|
|
73
136
|
implementation 'androidx.appcompat:appcompat:1.2.0'
|
|
74
137
|
implementation "androidx.core:core-ktx:1.6.0"
|
|
75
138
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
76
139
|
}
|
|
140
|
+
|
|
141
|
+
if (isNewArchitectureEnabled()) {
|
|
142
|
+
react {
|
|
143
|
+
reactRoot = rootProject.file("../node_modules/react-native/")
|
|
144
|
+
jsRootDir = file("../src/fabric/")
|
|
145
|
+
codegenDir = rootProject.file("../node_modules/react-native-codegen/")
|
|
146
|
+
libraryName = "rngesturehandler"
|
|
147
|
+
codegenJavaPackageName = "com.swmansion.gesturehandler"
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
package com.swmansion.gesturehandler
|
|
2
2
|
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.content.ContextWrapper
|
|
6
|
+
import android.graphics.Rect
|
|
3
7
|
import android.view.MotionEvent
|
|
4
8
|
import android.view.MotionEvent.PointerCoords
|
|
5
9
|
import android.view.MotionEvent.PointerProperties
|
|
6
10
|
import android.view.View
|
|
11
|
+
import android.view.Window
|
|
7
12
|
import com.facebook.react.bridge.Arguments
|
|
8
13
|
import com.facebook.react.bridge.UiThreadUtil
|
|
9
14
|
import com.facebook.react.bridge.WritableArray
|
|
@@ -15,6 +20,7 @@ import java.util.*
|
|
|
15
20
|
open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestureHandlerT>> {
|
|
16
21
|
private val trackedPointerIDs = IntArray(MAX_POINTERS_COUNT)
|
|
17
22
|
private var trackedPointersIDsCount = 0
|
|
23
|
+
private val windowOffset = IntArray(2) { 0 }
|
|
18
24
|
var tag = 0
|
|
19
25
|
var view: View? = null
|
|
20
26
|
private set
|
|
@@ -28,7 +34,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
28
34
|
private set
|
|
29
35
|
var isEnabled = true
|
|
30
36
|
private set
|
|
31
|
-
var
|
|
37
|
+
var actionType = 0
|
|
32
38
|
|
|
33
39
|
var changedTouchesPayload: WritableArray? = null
|
|
34
40
|
private set
|
|
@@ -67,14 +73,11 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
67
73
|
protected inline fun applySelf(block: ConcreteGestureHandlerT.() -> Unit): ConcreteGestureHandlerT =
|
|
68
74
|
self().apply { block() }
|
|
69
75
|
|
|
70
|
-
// set and accessed only by the orchestrator
|
|
76
|
+
// properties set and accessed only by the orchestrator
|
|
71
77
|
var activationIndex = 0
|
|
72
|
-
|
|
73
|
-
// set and accessed only by the orchestrator
|
|
74
78
|
var isActive = false
|
|
75
|
-
|
|
76
|
-
// set and accessed only by the orchestrator
|
|
77
79
|
var isAwaiting = false
|
|
80
|
+
var shouldResetProgress = false
|
|
78
81
|
|
|
79
82
|
open fun dispatchStateChange(newState: Int, prevState: Int) {
|
|
80
83
|
onTouchEventListener?.onStateChange(self(), newState, prevState)
|
|
@@ -158,6 +161,25 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
158
161
|
state = STATE_UNDETERMINED
|
|
159
162
|
this.view = view
|
|
160
163
|
this.orchestrator = orchestrator
|
|
164
|
+
|
|
165
|
+
val decorView = getWindow(view?.context)?.decorView
|
|
166
|
+
if (decorView != null) {
|
|
167
|
+
val frame = Rect()
|
|
168
|
+
decorView.getWindowVisibleDisplayFrame(frame)
|
|
169
|
+
windowOffset[0] = frame.left
|
|
170
|
+
windowOffset[1] = frame.top
|
|
171
|
+
} else {
|
|
172
|
+
windowOffset[0] = 0
|
|
173
|
+
windowOffset[1] = 0
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private fun getWindow(context: Context?): Window? {
|
|
178
|
+
if (context == null) return null
|
|
179
|
+
if (context is Activity) return context.window
|
|
180
|
+
if (context is ContextWrapper) return getWindow(context.baseContext)
|
|
181
|
+
|
|
182
|
+
return null
|
|
161
183
|
}
|
|
162
184
|
|
|
163
185
|
private fun findNextLocalPointerId(): Int {
|
|
@@ -341,8 +363,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
341
363
|
pointerId,
|
|
342
364
|
event.getX(event.actionIndex),
|
|
343
365
|
event.getY(event.actionIndex),
|
|
344
|
-
event.getX(event.actionIndex) + offsetX,
|
|
345
|
-
event.getY(event.actionIndex) + offsetY,
|
|
366
|
+
event.getX(event.actionIndex) + offsetX - windowOffset[0],
|
|
367
|
+
event.getY(event.actionIndex) + offsetY - windowOffset[1],
|
|
346
368
|
)
|
|
347
369
|
trackedPointersCount++
|
|
348
370
|
addChangedPointer(trackedPointers[pointerId]!!)
|
|
@@ -363,8 +385,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
363
385
|
pointerId,
|
|
364
386
|
event.getX(event.actionIndex),
|
|
365
387
|
event.getY(event.actionIndex),
|
|
366
|
-
event.getX(event.actionIndex) + offsetX,
|
|
367
|
-
event.getY(event.actionIndex) + offsetY,
|
|
388
|
+
event.getX(event.actionIndex) + offsetX - windowOffset[0],
|
|
389
|
+
event.getY(event.actionIndex) + offsetY - windowOffset[1],
|
|
368
390
|
)
|
|
369
391
|
addChangedPointer(trackedPointers[pointerId]!!)
|
|
370
392
|
trackedPointers[pointerId] = null
|
|
@@ -387,8 +409,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
387
409
|
if (pointer.x != event.getX(i) || pointer.y != event.getY(i)) {
|
|
388
410
|
pointer.x = event.getX(i)
|
|
389
411
|
pointer.y = event.getY(i)
|
|
390
|
-
pointer.absoluteX = event.getX(i) + offsetX
|
|
391
|
-
pointer.absoluteY = event.getY(i) + offsetY
|
|
412
|
+
pointer.absoluteX = event.getX(i) + offsetX - windowOffset[0]
|
|
413
|
+
pointer.absoluteY = event.getY(i) + offsetY - windowOffset[1]
|
|
392
414
|
|
|
393
415
|
addChangedPointer(pointer)
|
|
394
416
|
pointersAdded++
|
|
@@ -617,6 +639,10 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
617
639
|
}
|
|
618
640
|
}
|
|
619
641
|
|
|
642
|
+
// responsible for resetting the state of handler upon activation (may be called more than once
|
|
643
|
+
// if the handler is waiting for failure of other one)
|
|
644
|
+
open fun resetProgress() {}
|
|
645
|
+
|
|
620
646
|
protected open fun onHandle(event: MotionEvent) {
|
|
621
647
|
moveToState(STATE_FAILED)
|
|
622
648
|
}
|
|
@@ -651,6 +677,11 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
651
677
|
val lastRelativePositionY: Float
|
|
652
678
|
get() = lastAbsolutePositionY - lastEventOffsetY
|
|
653
679
|
|
|
680
|
+
val lastPositionInWindowX: Float
|
|
681
|
+
get() = lastAbsolutePositionX - windowOffset[0]
|
|
682
|
+
val lastPositionInWindowY: Float
|
|
683
|
+
get() = lastAbsolutePositionY - windowOffset[1]
|
|
684
|
+
|
|
654
685
|
companion object {
|
|
655
686
|
const val STATE_UNDETERMINED = 0
|
|
656
687
|
const val STATE_FAILED = 1
|
|
@@ -669,6 +700,10 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
669
700
|
const val DIRECTION_LEFT = 2
|
|
670
701
|
const val DIRECTION_UP = 4
|
|
671
702
|
const val DIRECTION_DOWN = 8
|
|
703
|
+
const val ACTION_TYPE_REANIMATED_WORKLET = 1
|
|
704
|
+
const val ACTION_TYPE_NATIVE_ANIMATED_EVENT = 2
|
|
705
|
+
const val ACTION_TYPE_JS_FUNCTION_OLD_API = 3
|
|
706
|
+
const val ACTION_TYPE_JS_FUNCTION_NEW_API = 4
|
|
672
707
|
private const val MAX_POINTERS_COUNT = 12
|
|
673
708
|
private lateinit var pointerProps: Array<PointerProperties?>
|
|
674
709
|
private lateinit var pointerCoords: Array<PointerCoords?>
|
package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt
CHANGED
|
@@ -142,8 +142,16 @@ class GestureHandlerOrchestrator(
|
|
|
142
142
|
} else if (prevState == GestureHandler.STATE_ACTIVE || prevState == GestureHandler.STATE_END) {
|
|
143
143
|
if (handler.isActive) {
|
|
144
144
|
handler.dispatchStateChange(newState, prevState)
|
|
145
|
+
} else if (prevState == GestureHandler.STATE_ACTIVE) {
|
|
146
|
+
// handle edge case where handler awaiting for another one tries to activate but finishes
|
|
147
|
+
// before the other would not send state change event upon ending
|
|
148
|
+
handler.dispatchStateChange(newState, GestureHandler.STATE_BEGAN)
|
|
145
149
|
}
|
|
146
|
-
} else {
|
|
150
|
+
} else if (prevState != GestureHandler.STATE_UNDETERMINED || newState != GestureHandler.STATE_CANCELLED) {
|
|
151
|
+
// If handler is changing state from UNDETERMINED to CANCELLED, the state change event shouldn't
|
|
152
|
+
// be sent. Handler hasn't yet began so it may not be initialized which results in crashes.
|
|
153
|
+
// If it doesn't crash, there may be some weird behavior on JS side, as `onFinalize` will be
|
|
154
|
+
// called without calling `onBegin` first.
|
|
147
155
|
handler.dispatchStateChange(newState, prevState)
|
|
148
156
|
}
|
|
149
157
|
handlingChangeSemaphore -= 1
|
|
@@ -155,6 +163,7 @@ class GestureHandlerOrchestrator(
|
|
|
155
163
|
with(handler) {
|
|
156
164
|
isAwaiting = false
|
|
157
165
|
isActive = true
|
|
166
|
+
shouldResetProgress = true
|
|
158
167
|
activationIndex = this@GestureHandlerOrchestrator.activationIndex++
|
|
159
168
|
}
|
|
160
169
|
var toCancelCount = 0
|
|
@@ -242,16 +251,41 @@ class GestureHandlerOrchestrator(
|
|
|
242
251
|
// approach when we want to use pointer coordinates to calculate velocity or distance
|
|
243
252
|
// for pinch so I don't know yet if we should transform or not...
|
|
244
253
|
event.setLocation(coords[0], coords[1])
|
|
245
|
-
|
|
254
|
+
|
|
255
|
+
// Touch events are sent before the handler itself has a chance to process them,
|
|
256
|
+
// mainly because `onTouchesUp` shoul be send befor gesture finishes. This means that
|
|
257
|
+
// the first `onTouchesDown` event is sent before a gesture begins, activation in
|
|
258
|
+
// callback for this event causes problems because the handler doesn't have a chance
|
|
259
|
+
// to initialize itself with starting values of pointer (in pan this causes translation
|
|
260
|
+
// to be equal to the coordinates of the pointer). The simplest solution is to send
|
|
261
|
+
// the first `onTouchesDown` event after the handler processes it and changes state
|
|
262
|
+
// to `BEGAN`.
|
|
263
|
+
if (handler.needsPointerData && handler.state != 0) {
|
|
246
264
|
handler.updatePointerData(event)
|
|
247
265
|
}
|
|
248
266
|
|
|
249
267
|
if (!handler.isAwaiting || action != MotionEvent.ACTION_MOVE) {
|
|
268
|
+
val isFirstEvent = handler.state == 0
|
|
250
269
|
handler.handle(event)
|
|
251
270
|
if (handler.isActive) {
|
|
271
|
+
// After handler is done waiting for other one to fail its progress should be
|
|
272
|
+
// reset, otherwise there may be a visible jump in values sent by the handler.
|
|
273
|
+
// When handler is waiting it's already activated but the `isAwaiting` flag
|
|
274
|
+
// prevents it from receiving touch stream. When the flag is changed, the
|
|
275
|
+
// difference between this event and the last one may be large enough to be
|
|
276
|
+
// visible in interactions based on this gesture. This makes it consistent with
|
|
277
|
+
// the behavior on iOS.
|
|
278
|
+
if (handler.shouldResetProgress) {
|
|
279
|
+
handler.shouldResetProgress = false
|
|
280
|
+
handler.resetProgress()
|
|
281
|
+
}
|
|
252
282
|
handler.dispatchHandlerUpdate(event)
|
|
253
283
|
}
|
|
254
284
|
|
|
285
|
+
if (handler.needsPointerData && isFirstEvent) {
|
|
286
|
+
handler.updatePointerData(event)
|
|
287
|
+
}
|
|
288
|
+
|
|
255
289
|
// if event was of type UP or POINTER_UP we request handler to stop tracking now that
|
|
256
290
|
// the event has been dispatched
|
|
257
291
|
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP) {
|
|
@@ -349,11 +383,13 @@ class GestureHandlerOrchestrator(
|
|
|
349
383
|
val parentViewGroup: ViewGroup = parent
|
|
350
384
|
|
|
351
385
|
handlerRegistry.getHandlersForView(parent)?.let {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
386
|
+
synchronized(it) {
|
|
387
|
+
for (handler in it) {
|
|
388
|
+
if (handler.isEnabled && handler.isWithinBounds(view, coords[0], coords[1])) {
|
|
389
|
+
found = true
|
|
390
|
+
recordHandlerIfNotPresent(handler, parentViewGroup)
|
|
391
|
+
handler.startTrackingPointer(pointerId)
|
|
392
|
+
}
|
|
357
393
|
}
|
|
358
394
|
}
|
|
359
395
|
}
|
|
@@ -368,13 +404,13 @@ class GestureHandlerOrchestrator(
|
|
|
368
404
|
private fun recordViewHandlersForPointer(view: View, coords: FloatArray, pointerId: Int): Boolean {
|
|
369
405
|
var found = false
|
|
370
406
|
handlerRegistry.getHandlersForView(view)?.let {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
407
|
+
synchronized(it) {
|
|
408
|
+
for (handler in it) {
|
|
409
|
+
if (handler.isEnabled && handler.isWithinBounds(view, coords[0], coords[1])) {
|
|
410
|
+
recordHandlerIfNotPresent(handler, view)
|
|
411
|
+
handler.startTrackingPointer(pointerId)
|
|
412
|
+
found = true
|
|
413
|
+
}
|
|
378
414
|
}
|
|
379
415
|
}
|
|
380
416
|
}
|
|
@@ -208,8 +208,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
208
208
|
lastY = getLastPointerY(event, averageTouches)
|
|
209
209
|
}
|
|
210
210
|
if (state == STATE_UNDETERMINED && event.pointerCount >= minPointers) {
|
|
211
|
-
|
|
212
|
-
startY = lastY
|
|
211
|
+
resetProgress()
|
|
213
212
|
offsetX = 0f
|
|
214
213
|
offsetY = 0f
|
|
215
214
|
velocityX = 0f
|
|
@@ -253,8 +252,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
253
252
|
override fun activate(force: Boolean) {
|
|
254
253
|
// reset starting point if the handler has not yet activated
|
|
255
254
|
if (state != STATE_ACTIVE) {
|
|
256
|
-
|
|
257
|
-
startY = lastY
|
|
255
|
+
resetProgress()
|
|
258
256
|
}
|
|
259
257
|
super.activate(force)
|
|
260
258
|
}
|
|
@@ -266,6 +264,11 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
266
264
|
}
|
|
267
265
|
}
|
|
268
266
|
|
|
267
|
+
override fun resetProgress() {
|
|
268
|
+
startX = lastX
|
|
269
|
+
startY = lastY
|
|
270
|
+
}
|
|
271
|
+
|
|
269
272
|
companion object {
|
|
270
273
|
private const val MIN_VALUE_IGNORE = Float.MAX_VALUE
|
|
271
274
|
private const val MAX_VALUE_IGNORE = Float.MIN_VALUE
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
package com.swmansion.gesturehandler
|
|
2
2
|
|
|
3
3
|
import android.view.MotionEvent
|
|
4
|
-
import android.view.ScaleGestureDetector
|
|
5
|
-
import android.view.ScaleGestureDetector.OnScaleGestureListener
|
|
6
4
|
import android.view.ViewConfiguration
|
|
7
5
|
import kotlin.math.abs
|
|
8
6
|
|
|
@@ -19,7 +17,7 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
|
|
|
19
17
|
private var scaleGestureDetector: ScaleGestureDetector? = null
|
|
20
18
|
private var startingSpan = 0f
|
|
21
19
|
private var spanSlop = 0f
|
|
22
|
-
private val gestureListener: OnScaleGestureListener = object : OnScaleGestureListener {
|
|
20
|
+
private val gestureListener: ScaleGestureDetector.OnScaleGestureListener = object : ScaleGestureDetector.OnScaleGestureListener {
|
|
23
21
|
override fun onScale(detector: ScaleGestureDetector): Boolean {
|
|
24
22
|
val prevScaleFactor: Double = scale
|
|
25
23
|
scale *= detector.scaleFactor.toDouble()
|
|
@@ -28,7 +26,7 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
|
|
|
28
26
|
velocity = (scale - prevScaleFactor) / delta
|
|
29
27
|
}
|
|
30
28
|
if (abs(startingSpan - detector.currentSpan) >= spanSlop
|
|
31
|
-
|
|
29
|
+
&& state == STATE_BEGAN) {
|
|
32
30
|
activate()
|
|
33
31
|
}
|
|
34
32
|
return true
|
|
@@ -52,8 +50,7 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
|
|
|
52
50
|
override fun onHandle(event: MotionEvent) {
|
|
53
51
|
if (state == STATE_UNDETERMINED) {
|
|
54
52
|
val context = view!!.context
|
|
55
|
-
|
|
56
|
-
scale = 1.0
|
|
53
|
+
resetProgress()
|
|
57
54
|
scaleGestureDetector = ScaleGestureDetector(context, gestureListener)
|
|
58
55
|
val configuration = ViewConfiguration.get(context)
|
|
59
56
|
spanSlop = configuration.scaledTouchSlop.toFloat()
|
|
@@ -74,14 +71,17 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
|
|
|
74
71
|
override fun activate(force: Boolean) {
|
|
75
72
|
// reset scale if the handler has not yet activated
|
|
76
73
|
if (state != STATE_ACTIVE) {
|
|
77
|
-
|
|
78
|
-
scale = 1.0
|
|
74
|
+
resetProgress()
|
|
79
75
|
}
|
|
80
76
|
super.activate(force)
|
|
81
77
|
}
|
|
82
78
|
|
|
83
79
|
override fun onReset() {
|
|
84
80
|
scaleGestureDetector = null
|
|
81
|
+
resetProgress()
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
override fun resetProgress() {
|
|
85
85
|
velocity = 0.0
|
|
86
86
|
scale = 1.0
|
|
87
87
|
}
|
|
@@ -43,8 +43,7 @@ class RotationGestureHandler : GestureHandler<RotationGestureHandler>() {
|
|
|
43
43
|
|
|
44
44
|
override fun onHandle(event: MotionEvent) {
|
|
45
45
|
if (state == STATE_UNDETERMINED) {
|
|
46
|
-
|
|
47
|
-
rotation = 0.0
|
|
46
|
+
resetProgress()
|
|
48
47
|
rotationGestureDetector = RotationGestureDetector(gestureListener)
|
|
49
48
|
begin()
|
|
50
49
|
}
|
|
@@ -61,14 +60,17 @@ class RotationGestureHandler : GestureHandler<RotationGestureHandler>() {
|
|
|
61
60
|
override fun activate(force: Boolean) {
|
|
62
61
|
// reset rotation if the handler has not yet activated
|
|
63
62
|
if (state != STATE_ACTIVE) {
|
|
64
|
-
|
|
65
|
-
velocity = 0.0
|
|
63
|
+
resetProgress()
|
|
66
64
|
}
|
|
67
65
|
super.activate(force)
|
|
68
66
|
}
|
|
69
67
|
|
|
70
68
|
override fun onReset() {
|
|
71
69
|
rotationGestureDetector = null
|
|
70
|
+
resetProgress()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
override fun resetProgress() {
|
|
72
74
|
velocity = 0.0
|
|
73
75
|
rotation = 0.0
|
|
74
76
|
}
|