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.
Files changed (382) hide show
  1. package/README.md +7 -6
  2. package/android/build.gradle +49 -1
  3. package/android/common/src/main/java/com/swmansion/common/GestureHandlerStateManager.kt +5 -0
  4. package/android/gradle.properties +19 -0
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +18 -0
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/Extensions.kt +11 -0
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +96 -0
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +713 -0
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.kt +8 -0
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +562 -0
  11. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.kt +8 -0
  12. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +21 -0
  13. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +49 -0
  14. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +97 -0
  15. package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +11 -0
  16. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +129 -0
  17. package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.kt +9 -0
  18. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +289 -0
  19. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +88 -0
  20. package/android/lib/src/main/java/com/swmansion/gesturehandler/{PointerEventsConfig.java → PointerEventsConfig.kt} +3 -5
  21. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.kt +125 -0
  22. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +79 -0
  23. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +167 -0
  24. package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.kt +10 -0
  25. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +348 -0
  26. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +57 -0
  27. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +59 -0
  28. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +8 -0
  29. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +61 -0
  30. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +686 -0
  31. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +17 -0
  32. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +95 -0
  33. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +132 -0
  34. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.kt +5 -0
  35. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +68 -0
  36. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +34 -0
  37. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +66 -0
  38. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +69 -0
  39. package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.kt +51 -0
  40. package/ios/Handlers/RNFlingHandler.m +78 -5
  41. package/ios/Handlers/RNForceTouchHandler.m +29 -4
  42. package/ios/Handlers/RNLongPressHandler.m +105 -3
  43. package/ios/Handlers/RNManualHandler.h +4 -0
  44. package/ios/Handlers/RNManualHandler.m +73 -0
  45. package/ios/Handlers/RNNativeViewHandler.m +30 -2
  46. package/ios/Handlers/RNPanHandler.m +64 -4
  47. package/ios/Handlers/RNPinchHandler.m +61 -2
  48. package/ios/Handlers/RNRotationHandler.m +60 -1
  49. package/ios/Handlers/RNTapHandler.m +55 -8
  50. package/ios/RNGestureHandler.h +18 -4
  51. package/ios/RNGestureHandler.m +123 -13
  52. package/ios/RNGestureHandlerEvents.h +9 -0
  53. package/ios/RNGestureHandlerEvents.m +34 -0
  54. package/ios/RNGestureHandlerManager.h +7 -0
  55. package/ios/RNGestureHandlerManager.m +62 -34
  56. package/ios/RNGestureHandlerModule.m +39 -3
  57. package/ios/RNGestureHandlerPointerTracker.h +25 -0
  58. package/ios/RNGestureHandlerPointerTracker.m +237 -0
  59. package/ios/RNGestureHandlerRegistry.h +1 -0
  60. package/ios/RNGestureHandlerRegistry.m +10 -0
  61. package/ios/RNGestureHandlerStateManager.h +5 -0
  62. package/ios/RNManualActivationRecognizer.h +10 -0
  63. package/ios/RNManualActivationRecognizer.m +80 -0
  64. package/ios/RNRootViewGestureRecognizer.m +1 -1
  65. package/ios/RNTouchEventType.h +9 -0
  66. package/lib/commonjs/EventType.js +16 -0
  67. package/lib/commonjs/EventType.js.map +1 -0
  68. package/lib/commonjs/GestureHandlerRootView.android.js +1 -13
  69. package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
  70. package/lib/commonjs/GestureHandlerRootView.js +11 -3
  71. package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
  72. package/lib/commonjs/RNGestureHandlerModule.js +3 -1
  73. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  74. package/lib/commonjs/RNGestureHandlerModule.web.js +2 -2
  75. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  76. package/lib/commonjs/components/DrawerLayout.js +41 -37
  77. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  78. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  79. package/lib/commonjs/components/GestureComponents.js +31 -12
  80. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  81. package/lib/commonjs/components/Swipeable.js +10 -6
  82. package/lib/commonjs/components/Swipeable.js.map +1 -1
  83. package/lib/commonjs/components/touchables/GenericTouchable.js +2 -1
  84. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  85. package/lib/commonjs/components/touchables/TouchableOpacity.js +1 -1
  86. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  87. package/lib/commonjs/gestureHandlerRootHOC.js +1 -1
  88. package/lib/commonjs/gestureHandlerRootHOC.js.map +1 -1
  89. package/lib/commonjs/handlers/FlingGestureHandler.js +23 -0
  90. package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -0
  91. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +44 -0
  92. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -0
  93. package/lib/commonjs/handlers/LongPressGestureHandler.js +23 -0
  94. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -0
  95. package/lib/commonjs/handlers/NativeViewGestureHandler.js +6 -4
  96. package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
  97. package/lib/commonjs/handlers/PanGestureHandler.js +121 -0
  98. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -0
  99. package/lib/commonjs/handlers/PinchGestureHandler.js +21 -0
  100. package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -0
  101. package/lib/commonjs/handlers/RotationGestureHandler.js +21 -0
  102. package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -0
  103. package/lib/commonjs/handlers/TapGestureHandler.js +23 -0
  104. package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -0
  105. package/lib/commonjs/handlers/createHandler.js +52 -83
  106. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  107. package/lib/commonjs/handlers/gestureHandlerCommon.js +80 -0
  108. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -0
  109. package/lib/commonjs/handlers/gestures/GestureDetector.js +440 -0
  110. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -0
  111. package/lib/commonjs/handlers/gestures/eventReceiver.js +135 -0
  112. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -0
  113. package/lib/commonjs/handlers/gestures/flingGesture.js +34 -0
  114. package/lib/commonjs/handlers/gestures/flingGesture.js.map +1 -0
  115. package/lib/commonjs/handlers/gestures/forceTouchGesture.js +65 -0
  116. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -0
  117. package/lib/commonjs/handlers/gestures/gesture.js +193 -0
  118. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -0
  119. package/lib/commonjs/handlers/gestures/gestureComposition.js +94 -0
  120. package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -0
  121. package/lib/commonjs/handlers/gestures/gestureObjects.js +85 -0
  122. package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -0
  123. package/lib/commonjs/handlers/gestures/gestureStateManager.js +58 -0
  124. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -0
  125. package/lib/commonjs/handlers/gestures/longPressGesture.js +34 -0
  126. package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -0
  127. package/lib/commonjs/handlers/gestures/manualGesture.js +31 -0
  128. package/lib/commonjs/handlers/gestures/manualGesture.js.map +1 -0
  129. package/lib/commonjs/handlers/gestures/nativeGesture.js +34 -0
  130. package/lib/commonjs/handlers/gestures/nativeGesture.js.map +1 -0
  131. package/lib/commonjs/handlers/gestures/panGesture.js +144 -0
  132. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -0
  133. package/lib/commonjs/handlers/gestures/pinchGesture.js +45 -0
  134. package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -0
  135. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +24 -0
  136. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -0
  137. package/lib/commonjs/handlers/gestures/rotationGesture.js +45 -0
  138. package/lib/commonjs/handlers/gestures/rotationGesture.js.map +1 -0
  139. package/lib/commonjs/handlers/gestures/tapGesture.js +59 -0
  140. package/lib/commonjs/handlers/gestures/tapGesture.js.map +1 -0
  141. package/lib/commonjs/handlers/handlersRegistry.js +31 -0
  142. package/lib/commonjs/handlers/handlersRegistry.js.map +1 -0
  143. package/lib/commonjs/index.js +146 -8
  144. package/lib/commonjs/index.js.map +1 -1
  145. package/lib/commonjs/init.js +13 -0
  146. package/lib/commonjs/init.js.map +1 -0
  147. package/lib/commonjs/mocks.js +31 -2
  148. package/lib/commonjs/mocks.js.map +1 -1
  149. package/lib/commonjs/utils.js +15 -0
  150. package/lib/commonjs/utils.js.map +1 -0
  151. package/lib/commonjs/web/Errors.js +1 -1
  152. package/lib/commonjs/web/Errors.js.map +1 -1
  153. package/lib/commonjs/web/GestureHandler.js +4 -6
  154. package/lib/commonjs/web/GestureHandler.js.map +1 -1
  155. package/lib/commonjs/web/NodeManager.js +8 -2
  156. package/lib/commonjs/web/NodeManager.js.map +1 -1
  157. package/lib/module/EventType.js +8 -0
  158. package/lib/module/EventType.js.map +1 -0
  159. package/lib/module/GestureHandlerRootView.android.js +2 -14
  160. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  161. package/lib/module/GestureHandlerRootView.js +5 -1
  162. package/lib/module/GestureHandlerRootView.js.map +1 -1
  163. package/lib/module/RNGestureHandlerModule.js +3 -1
  164. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  165. package/lib/module/RNGestureHandlerModule.web.js +2 -2
  166. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  167. package/lib/module/components/DrawerLayout.js +43 -40
  168. package/lib/module/components/DrawerLayout.js.map +1 -1
  169. package/lib/module/components/GestureButtons.js.map +1 -1
  170. package/lib/module/components/GestureComponents.js +29 -11
  171. package/lib/module/components/GestureComponents.js.map +1 -1
  172. package/lib/module/components/Swipeable.js +9 -6
  173. package/lib/module/components/Swipeable.js.map +1 -1
  174. package/lib/module/components/touchables/GenericTouchable.js +2 -1
  175. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  176. package/lib/module/components/touchables/TouchableOpacity.js +1 -1
  177. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  178. package/lib/module/gestureHandlerRootHOC.js +1 -1
  179. package/lib/module/gestureHandlerRootHOC.js.map +1 -1
  180. package/lib/module/handlers/FlingGestureHandler.js +10 -0
  181. package/lib/module/handlers/FlingGestureHandler.js.map +1 -0
  182. package/lib/module/handlers/ForceTouchGestureHandler.js +29 -0
  183. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -0
  184. package/lib/module/handlers/LongPressGestureHandler.js +10 -0
  185. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -0
  186. package/lib/module/handlers/NativeViewGestureHandler.js +4 -3
  187. package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
  188. package/lib/module/handlers/PanGestureHandler.js +106 -0
  189. package/lib/module/handlers/PanGestureHandler.js.map +1 -0
  190. package/lib/module/handlers/PinchGestureHandler.js +9 -0
  191. package/lib/module/handlers/PinchGestureHandler.js.map +1 -0
  192. package/lib/module/handlers/RotationGestureHandler.js +9 -0
  193. package/lib/module/handlers/RotationGestureHandler.js.map +1 -0
  194. package/lib/module/handlers/TapGestureHandler.js +10 -0
  195. package/lib/module/handlers/TapGestureHandler.js.map +1 -0
  196. package/lib/module/handlers/createHandler.js +41 -76
  197. package/lib/module/handlers/createHandler.js.map +1 -1
  198. package/lib/module/handlers/gestureHandlerCommon.js +66 -0
  199. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -0
  200. package/lib/module/handlers/gestures/GestureDetector.js +402 -0
  201. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -0
  202. package/lib/module/handlers/gestures/eventReceiver.js +120 -0
  203. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -0
  204. package/lib/module/handlers/gestures/flingGesture.js +24 -0
  205. package/lib/module/handlers/gestures/flingGesture.js.map +1 -0
  206. package/lib/module/handlers/gestures/forceTouchGesture.js +56 -0
  207. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -0
  208. package/lib/module/handlers/gestures/gesture.js +175 -0
  209. package/lib/module/handlers/gestures/gesture.js.map +1 -0
  210. package/lib/module/handlers/gestures/gestureComposition.js +79 -0
  211. package/lib/module/handlers/gestures/gestureComposition.js.map +1 -0
  212. package/lib/module/handlers/gestures/gestureObjects.js +67 -0
  213. package/lib/module/handlers/gestures/gestureObjects.js.map +1 -0
  214. package/lib/module/handlers/gestures/gestureStateManager.js +48 -0
  215. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -0
  216. package/lib/module/handlers/gestures/longPressGesture.js +24 -0
  217. package/lib/module/handlers/gestures/longPressGesture.js.map +1 -0
  218. package/lib/module/handlers/gestures/manualGesture.js +22 -0
  219. package/lib/module/handlers/gestures/manualGesture.js.map +1 -0
  220. package/lib/module/handlers/gestures/nativeGesture.js +24 -0
  221. package/lib/module/handlers/gestures/nativeGesture.js.map +1 -0
  222. package/lib/module/handlers/gestures/panGesture.js +135 -0
  223. package/lib/module/handlers/gestures/panGesture.js.map +1 -0
  224. package/lib/module/handlers/gestures/pinchGesture.js +36 -0
  225. package/lib/module/handlers/gestures/pinchGesture.js.map +1 -0
  226. package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -0
  227. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -0
  228. package/lib/module/handlers/gestures/rotationGesture.js +36 -0
  229. package/lib/module/handlers/gestures/rotationGesture.js.map +1 -0
  230. package/lib/module/handlers/gestures/tapGesture.js +49 -0
  231. package/lib/module/handlers/gestures/tapGesture.js.map +1 -0
  232. package/lib/module/handlers/handlersRegistry.js +16 -0
  233. package/lib/module/handlers/handlersRegistry.js.map +1 -0
  234. package/lib/module/index.js +22 -1
  235. package/lib/module/index.js.map +1 -1
  236. package/lib/module/init.js +5 -0
  237. package/lib/module/init.js.map +1 -0
  238. package/lib/module/mocks.js +31 -2
  239. package/lib/module/mocks.js.map +1 -1
  240. package/lib/module/utils.js +8 -0
  241. package/lib/module/utils.js.map +1 -0
  242. package/lib/module/web/Errors.js +1 -1
  243. package/lib/module/web/Errors.js.map +1 -1
  244. package/lib/module/web/GestureHandler.js +4 -6
  245. package/lib/module/web/GestureHandler.js.map +1 -1
  246. package/lib/module/web/NodeManager.js +8 -2
  247. package/lib/module/web/NodeManager.js.map +1 -1
  248. package/lib/typescript/EventType.d.ts +8 -0
  249. package/lib/typescript/GestureHandlerRootView.android.d.ts +2 -4
  250. package/lib/typescript/GestureHandlerRootView.d.ts +5 -2
  251. package/lib/typescript/RNGestureHandlerModule.d.ts +1 -1
  252. package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -1
  253. package/lib/typescript/components/DrawerLayout.d.ts +50 -1
  254. package/lib/typescript/components/GestureButtons.d.ts +36 -0
  255. package/lib/typescript/components/GestureComponents.d.ts +8 -35
  256. package/lib/typescript/components/Swipeable.d.ts +73 -6
  257. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -2
  258. package/lib/typescript/components/touchables/TouchableHighlight.d.ts +1 -0
  259. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +1 -0
  260. package/lib/typescript/handlers/FlingGestureHandler.d.ts +33 -0
  261. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +43 -0
  262. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +55 -0
  263. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +19 -4
  264. package/lib/typescript/handlers/PanGestureHandler.d.ts +137 -0
  265. package/lib/typescript/handlers/PinchGestureHandler.d.ts +28 -0
  266. package/lib/typescript/handlers/RotationGestureHandler.d.ts +28 -0
  267. package/lib/typescript/handlers/TapGestureHandler.d.ts +56 -0
  268. package/lib/typescript/handlers/createHandler.d.ts +1 -1
  269. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +62 -0
  270. package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts +8 -1
  271. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +16 -0
  272. package/lib/typescript/handlers/gestures/eventReceiver.d.ts +2 -0
  273. package/lib/typescript/handlers/gestures/flingGesture.d.ts +9 -0
  274. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +16 -0
  275. package/lib/typescript/handlers/gestures/gesture.d.ts +97 -0
  276. package/lib/typescript/handlers/gestures/gestureComposition.d.ts +21 -0
  277. package/lib/typescript/handlers/gestures/gestureObjects.d.ts +39 -0
  278. package/lib/typescript/handlers/gestures/gestureStateManager.d.ts +9 -0
  279. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +9 -0
  280. package/lib/typescript/handlers/gestures/manualGesture.d.ts +7 -0
  281. package/lib/typescript/handlers/gestures/nativeGesture.d.ts +9 -0
  282. package/lib/typescript/handlers/gestures/panGesture.d.ts +26 -0
  283. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +12 -0
  284. package/lib/typescript/handlers/gestures/reanimatedWrapper.d.ts +14 -0
  285. package/lib/typescript/handlers/gestures/rotationGesture.d.ts +12 -0
  286. package/lib/typescript/handlers/gestures/tapGesture.d.ts +14 -0
  287. package/lib/typescript/handlers/handlersRegistry.d.ts +6 -0
  288. package/lib/typescript/index.d.ts +29 -2
  289. package/lib/typescript/init.d.ts +1 -0
  290. package/lib/typescript/mocks.d.ts +21 -2
  291. package/lib/typescript/utils.d.ts +1 -0
  292. package/lib/typescript/web/FlingGestureHandler.d.ts +0 -1
  293. package/lib/typescript/web/GestureHandler.d.ts +0 -1
  294. package/lib/typescript/web/PanGestureHandler.d.ts +0 -1
  295. package/lib/typescript/web/PinchGestureHandler.d.ts +0 -1
  296. package/lib/typescript/web/PressGestureHandler.d.ts +0 -1
  297. package/lib/typescript/web/RotationGestureHandler.d.ts +0 -1
  298. package/lib/typescript/web/TapGestureHandler.d.ts +0 -1
  299. package/package.json +8 -5
  300. package/src/EventType.ts +10 -0
  301. package/src/GestureHandlerRootView.android.tsx +9 -25
  302. package/src/GestureHandlerRootView.tsx +11 -2
  303. package/src/RNGestureHandlerModule.ts +5 -1
  304. package/src/RNGestureHandlerModule.web.ts +1 -0
  305. package/src/components/DrawerLayout.tsx +114 -41
  306. package/src/components/GestureButtons.tsx +45 -5
  307. package/src/components/GestureComponents.tsx +47 -41
  308. package/src/components/Swipeable.tsx +108 -21
  309. package/src/components/touchables/GenericTouchable.tsx +2 -1
  310. package/src/components/touchables/TouchableOpacity.tsx +1 -1
  311. package/src/handlers/FlingGestureHandler.ts +57 -0
  312. package/src/handlers/ForceTouchGestureHandler.ts +83 -0
  313. package/src/handlers/LongPressGestureHandler.ts +84 -0
  314. package/src/handlers/NativeViewGestureHandler.ts +31 -7
  315. package/src/handlers/PanGestureHandler.ts +321 -0
  316. package/src/handlers/PinchGestureHandler.ts +46 -0
  317. package/src/handlers/RotationGestureHandler.ts +46 -0
  318. package/src/handlers/TapGestureHandler.ts +90 -0
  319. package/src/handlers/createHandler.ts +54 -79
  320. package/src/handlers/gestureHandlerCommon.ts +185 -0
  321. package/src/handlers/gestureHandlerTypesCompat.ts +19 -5
  322. package/src/handlers/gestures/GestureDetector.tsx +519 -0
  323. package/src/handlers/gestures/eventReceiver.ts +151 -0
  324. package/src/handlers/gestures/flingGesture.ts +27 -0
  325. package/src/handlers/gestures/forceTouchGesture.ts +74 -0
  326. package/src/handlers/gestures/gesture.ts +292 -0
  327. package/src/handlers/gestures/gestureComposition.ts +109 -0
  328. package/src/handlers/gestures/gestureObjects.ts +79 -0
  329. package/src/handlers/gestures/gestureStateManager.ts +60 -0
  330. package/src/handlers/gestures/longPressGesture.ts +27 -0
  331. package/src/handlers/gestures/manualGesture.ts +31 -0
  332. package/src/handlers/gestures/nativeGesture.ts +27 -0
  333. package/src/handlers/gestures/panGesture.ts +147 -0
  334. package/src/handlers/gestures/pinchGesture.ts +51 -0
  335. package/src/handlers/gestures/reanimatedWrapper.ts +45 -0
  336. package/src/handlers/gestures/rotationGesture.ts +51 -0
  337. package/src/handlers/gestures/tapGesture.ts +52 -0
  338. package/src/handlers/handlersRegistry.ts +22 -0
  339. package/src/index.ts +57 -17
  340. package/src/init.ts +5 -0
  341. package/src/mocks.ts +42 -2
  342. package/src/utils.ts +7 -0
  343. package/src/web/GestureHandler.ts +1 -2
  344. package/src/web/NodeManager.ts +5 -0
  345. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.java +0 -23
  346. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.java +0 -110
  347. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.java +0 -531
  348. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.java +0 -8
  349. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.java +0 -543
  350. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.java +0 -10
  351. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.java +0 -29
  352. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.java +0 -53
  353. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.java +0 -81
  354. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.java +0 -110
  355. package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.java +0 -8
  356. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.java +0 -312
  357. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.java +0 -109
  358. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.java +0 -169
  359. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.java +0 -96
  360. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.java +0 -172
  361. package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.java +0 -10
  362. package/android/src/main/java/com/facebook/react/views/modal/RNGHModalUtils.java +0 -21
  363. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.java +0 -296
  364. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.java +0 -72
  365. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.java +0 -77
  366. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.java +0 -8
  367. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.java +0 -86
  368. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.java +0 -731
  369. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.java +0 -31
  370. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.java +0 -101
  371. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.java +0 -151
  372. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.java +0 -7
  373. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java +0 -76
  374. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java +0 -49
  375. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.java +0 -82
  376. package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.java +0 -61
  377. package/lib/commonjs/handlers/gestureHandlers.js +0 -236
  378. package/lib/commonjs/handlers/gestureHandlers.js.map +0 -1
  379. package/lib/module/handlers/gestureHandlers.js +0 -216
  380. package/lib/module/handlers/gestureHandlers.js.map +0 -1
  381. package/lib/typescript/handlers/gestureHandlers.d.ts +0 -158
  382. 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,11 @@
1
+ package com.swmansion.gesturehandler
2
+
3
+ import android.view.MotionEvent
4
+
5
+ class ManualGestureHandler : GestureHandler<ManualGestureHandler>() {
6
+ override fun onHandle(event: MotionEvent) {
7
+ if (state == STATE_UNDETERMINED) {
8
+ begin()
9
+ }
10
+ }
11
+ }
@@ -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
  }