@rafaelaugusto/jolt 0.1.0-beta.8 → 0.1.0-rc.1
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 +136 -15
- package/dist/animate.d.ts +25 -4
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +67 -26
- package/dist/animate.js.map +1 -1
- package/dist/blur/index.d.ts +6 -0
- package/dist/blur/index.d.ts.map +1 -0
- package/dist/blur/index.js +196 -0
- package/dist/blur/index.js.map +1 -0
- package/dist/blur/native.d.ts +17 -0
- package/dist/blur/native.d.ts.map +1 -0
- package/dist/blur/native.js +44 -0
- package/dist/blur/native.js.map +1 -0
- package/dist/blur/types.d.ts +32 -0
- package/dist/blur/types.d.ts.map +1 -0
- package/dist/blur/types.js +2 -0
- package/dist/blur/types.js.map +1 -0
- package/dist/bottom-sheet/geometry.d.ts +18 -0
- package/dist/bottom-sheet/geometry.d.ts.map +1 -0
- package/dist/bottom-sheet/geometry.js +51 -0
- package/dist/bottom-sheet/geometry.js.map +1 -0
- package/dist/bottom-sheet/index.d.ts +56 -0
- package/dist/bottom-sheet/index.d.ts.map +1 -0
- package/dist/bottom-sheet/index.js +462 -0
- package/dist/bottom-sheet/index.js.map +1 -0
- package/dist/bottom-sheet/native.d.ts +11 -0
- package/dist/bottom-sheet/native.d.ts.map +1 -0
- package/dist/bottom-sheet/native.js +173 -0
- package/dist/bottom-sheet/native.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +40 -1
- package/dist/config.js.map +1 -1
- package/dist/decay.d.ts +1 -0
- package/dist/decay.d.ts.map +1 -1
- package/dist/decay.js +7 -0
- package/dist/decay.js.map +1 -1
- package/dist/drag-physics.d.ts +6 -1
- package/dist/drag-physics.d.ts.map +1 -1
- package/dist/drag.d.ts +17 -3
- package/dist/drag.d.ts.map +1 -1
- package/dist/drag.js +34 -11
- package/dist/drag.js.map +1 -1
- package/dist/driver/android-gradient.d.ts +5 -0
- package/dist/driver/android-gradient.d.ts.map +1 -0
- package/dist/driver/android-gradient.js +99 -0
- package/dist/driver/android-gradient.js.map +1 -0
- package/dist/driver/android-particles.d.ts +6 -0
- package/dist/driver/android-particles.d.ts.map +1 -0
- package/dist/driver/android-particles.js +93 -0
- package/dist/driver/android-particles.js.map +1 -0
- package/dist/driver/android.d.ts.map +1 -1
- package/dist/driver/android.js +67 -1
- package/dist/driver/android.js.map +1 -1
- package/dist/driver/frame.d.ts +3 -0
- package/dist/driver/frame.d.ts.map +1 -0
- package/dist/driver/frame.js +7 -0
- package/dist/driver/frame.js.map +1 -0
- package/dist/driver/index.d.ts +14 -0
- package/dist/driver/index.d.ts.map +1 -1
- package/dist/driver/index.js.map +1 -1
- package/dist/driver/ios-gradient.d.ts +5 -0
- package/dist/driver/ios-gradient.d.ts.map +1 -0
- package/dist/driver/ios-gradient.js +131 -0
- package/dist/driver/ios-gradient.js.map +1 -0
- package/dist/driver/ios-layout.d.ts +9 -0
- package/dist/driver/ios-layout.d.ts.map +1 -0
- package/dist/driver/ios-layout.js +52 -0
- package/dist/driver/ios-layout.js.map +1 -0
- package/dist/driver/ios-scroll-delegate.d.ts +4 -0
- package/dist/driver/ios-scroll-delegate.d.ts.map +1 -0
- package/dist/driver/ios-scroll-delegate.js +26 -0
- package/dist/driver/ios-scroll-delegate.js.map +1 -0
- package/dist/driver/ios.d.ts.map +1 -1
- package/dist/driver/ios.js +57 -1
- package/dist/driver/ios.js.map +1 -1
- package/dist/easing.d.ts +3 -1
- package/dist/easing.d.ts.map +1 -1
- package/dist/easing.js +18 -1
- package/dist/easing.js.map +1 -1
- package/dist/engine.d.ts +35 -2
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +211 -42
- package/dist/engine.js.map +1 -1
- package/dist/gesture-native.d.ts +28 -0
- package/dist/gesture-native.d.ts.map +1 -0
- package/dist/gesture-native.js +61 -0
- package/dist/gesture-native.js.map +1 -0
- package/dist/gestures/index.d.ts +69 -0
- package/dist/gestures/index.d.ts.map +1 -0
- package/dist/gestures/index.js +262 -0
- package/dist/gestures/index.js.map +1 -0
- package/dist/glass/index.d.ts +55 -0
- package/dist/glass/index.d.ts.map +1 -0
- package/dist/glass/index.js +205 -0
- package/dist/glass/index.js.map +1 -0
- package/dist/gradient-binding.d.ts +38 -0
- package/dist/gradient-binding.d.ts.map +1 -0
- package/dist/gradient-binding.js +128 -0
- package/dist/gradient-binding.js.map +1 -0
- package/dist/gradient.d.ts +105 -0
- package/dist/gradient.d.ts.map +1 -0
- package/dist/gradient.js +514 -0
- package/dist/gradient.js.map +1 -0
- package/dist/gravity.d.ts +13 -0
- package/dist/gravity.d.ts.map +1 -0
- package/dist/gravity.js +84 -0
- package/dist/gravity.js.map +1 -0
- package/dist/haptics.d.ts.map +1 -1
- package/dist/haptics.js +101 -28
- package/dist/haptics.js.map +1 -1
- package/dist/image-effect.d.ts +1 -0
- package/dist/image-effect.d.ts.map +1 -1
- package/dist/image-effect.js +10 -2
- package/dist/image-effect.js.map +1 -1
- package/dist/index.d.ts +21 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/inspector/index.d.ts +86 -0
- package/dist/inspector/index.d.ts.map +1 -0
- package/dist/inspector/index.js +419 -0
- package/dist/inspector/index.js.map +1 -0
- package/dist/inspector/plot.d.ts +4 -0
- package/dist/inspector/plot.d.ts.map +1 -0
- package/dist/inspector/plot.js +23 -0
- package/dist/inspector/plot.js.map +1 -0
- package/dist/inspector/probe.d.ts +19 -0
- package/dist/inspector/probe.d.ts.map +1 -0
- package/dist/inspector/probe.js +37 -0
- package/dist/inspector/probe.js.map +1 -0
- package/dist/inspector/tuning.d.ts +19 -0
- package/dist/inspector/tuning.d.ts.map +1 -0
- package/dist/inspector/tuning.js +37 -0
- package/dist/inspector/tuning.js.map +1 -0
- package/dist/interactive-navigation/index.d.ts +44 -0
- package/dist/interactive-navigation/index.d.ts.map +1 -0
- package/dist/interactive-navigation/index.js +314 -0
- package/dist/interactive-navigation/index.js.map +1 -0
- package/dist/keyboard.d.ts +24 -0
- package/dist/keyboard.d.ts.map +1 -1
- package/dist/keyboard.js +199 -6
- package/dist/keyboard.js.map +1 -1
- package/dist/layout.d.ts +13 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +348 -0
- package/dist/layout.js.map +1 -0
- package/dist/live-spring-driver.d.ts +52 -0
- package/dist/live-spring-driver.d.ts.map +1 -0
- package/dist/live-spring-driver.js +104 -0
- package/dist/live-spring-driver.js.map +1 -0
- package/dist/mixer.d.ts +55 -0
- package/dist/mixer.d.ts.map +1 -0
- package/dist/mixer.js +278 -0
- package/dist/mixer.js.map +1 -0
- package/dist/motion-scope.d.ts +10 -2
- package/dist/motion-scope.d.ts.map +1 -1
- package/dist/motion-scope.js +30 -3
- package/dist/motion-scope.js.map +1 -1
- package/dist/motion-states.d.ts +19 -7
- package/dist/motion-states.d.ts.map +1 -1
- package/dist/motion-states.js +116 -26
- package/dist/motion-states.js.map +1 -1
- package/dist/motion-value.d.ts +227 -0
- package/dist/motion-value.d.ts.map +1 -0
- package/dist/motion-value.js +1074 -0
- package/dist/motion-value.js.map +1 -0
- package/dist/native/index.d.ts +10 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +6 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native-properties.d.ts +28 -0
- package/dist/native-properties.d.ts.map +1 -0
- package/dist/native-properties.js +154 -0
- package/dist/native-properties.js.map +1 -0
- package/dist/native-property-driver.d.ts +19 -0
- package/dist/native-property-driver.d.ts.map +1 -0
- package/dist/native-property-driver.js +69 -0
- package/dist/native-property-driver.js.map +1 -0
- package/dist/native-property.d.ts +37 -0
- package/dist/native-property.d.ts.map +1 -0
- package/dist/native-property.js +285 -0
- package/dist/native-property.js.map +1 -0
- package/dist/particles.d.ts +5 -2
- package/dist/particles.d.ts.map +1 -1
- package/dist/particles.js +16 -10
- package/dist/particles.js.map +1 -1
- package/dist/path.d.ts.map +1 -1
- package/dist/path.js +2 -2
- package/dist/path.js.map +1 -1
- package/dist/physics/index.d.ts +116 -0
- package/dist/physics/index.d.ts.map +1 -0
- package/dist/physics/index.js +306 -0
- package/dist/physics/index.js.map +1 -0
- package/dist/physics/native.d.ts +53 -0
- package/dist/physics/native.d.ts.map +1 -0
- package/dist/physics/native.js +58 -0
- package/dist/physics/native.js.map +1 -0
- package/dist/playback-group.d.ts.map +1 -1
- package/dist/playback-group.js +17 -1
- package/dist/playback-group.js.map +1 -1
- package/dist/playback.d.ts +15 -0
- package/dist/playback.d.ts.map +1 -1
- package/dist/playback.js +23 -0
- package/dist/playback.js.map +1 -1
- package/dist/predictive-back/index.d.ts +45 -0
- package/dist/predictive-back/index.d.ts.map +1 -0
- package/dist/predictive-back/index.js +220 -0
- package/dist/predictive-back/index.js.map +1 -0
- package/dist/predictive-back/presentation.d.ts +4 -0
- package/dist/predictive-back/presentation.d.ts.map +1 -0
- package/dist/predictive-back/presentation.js +3 -0
- package/dist/predictive-back/presentation.js.map +1 -0
- package/dist/reorder/handle.d.ts +6 -0
- package/dist/reorder/handle.d.ts.map +1 -0
- package/dist/reorder/handle.js +10 -0
- package/dist/reorder/handle.js.map +1 -0
- package/dist/reorder/index.d.ts +10 -0
- package/dist/reorder/index.d.ts.map +1 -0
- package/dist/reorder/index.js +233 -0
- package/dist/reorder/index.js.map +1 -0
- package/dist/reorder/list-view.d.ts +5 -0
- package/dist/reorder/list-view.d.ts.map +1 -0
- package/dist/reorder/list-view.js +238 -0
- package/dist/reorder/list-view.js.map +1 -0
- package/dist/reorder/model.d.ts +6 -0
- package/dist/reorder/model.d.ts.map +1 -0
- package/dist/reorder/model.js +30 -0
- package/dist/reorder/model.js.map +1 -0
- package/dist/reorder/surface.d.ts +6 -0
- package/dist/reorder/surface.d.ts.map +1 -0
- package/dist/reorder/surface.js +10 -0
- package/dist/reorder/surface.js.map +1 -0
- package/dist/reorder/types.d.ts +92 -0
- package/dist/reorder/types.d.ts.map +1 -0
- package/dist/reorder/types.js +2 -0
- package/dist/reorder/types.js.map +1 -0
- package/dist/sampling.d.ts +35 -0
- package/dist/sampling.d.ts.map +1 -0
- package/dist/sampling.js +123 -0
- package/dist/sampling.js.map +1 -0
- package/dist/scene-appearance.d.ts +14 -0
- package/dist/scene-appearance.d.ts.map +1 -0
- package/dist/scene-appearance.js +68 -0
- package/dist/scene-appearance.js.map +1 -0
- package/dist/scene-camera.d.ts +5 -0
- package/dist/scene-camera.d.ts.map +1 -0
- package/dist/scene-camera.js +23 -0
- package/dist/scene-camera.js.map +1 -0
- package/dist/scene-shader.d.ts +18 -0
- package/dist/scene-shader.d.ts.map +1 -0
- package/dist/scene-shader.js +76 -0
- package/dist/scene-shader.js.map +1 -0
- package/dist/scroll-header/geometry.d.ts +18 -0
- package/dist/scroll-header/geometry.d.ts.map +1 -0
- package/dist/scroll-header/geometry.js +46 -0
- package/dist/scroll-header/geometry.js.map +1 -0
- package/dist/scroll-header/index.d.ts +48 -0
- package/dist/scroll-header/index.d.ts.map +1 -0
- package/dist/scroll-header/index.js +373 -0
- package/dist/scroll-header/index.js.map +1 -0
- package/dist/scroll-header/native.d.ts +28 -0
- package/dist/scroll-header/native.d.ts.map +1 -0
- package/dist/scroll-header/native.js +43 -0
- package/dist/scroll-header/native.js.map +1 -0
- package/dist/sensors/index.d.ts +69 -0
- package/dist/sensors/index.d.ts.map +1 -0
- package/dist/sensors/index.js +149 -0
- package/dist/sensors/index.js.map +1 -0
- package/dist/sensors/native.d.ts +20 -0
- package/dist/sensors/native.d.ts.map +1 -0
- package/dist/sensors/native.js +48 -0
- package/dist/sensors/native.js.map +1 -0
- package/dist/sequence.d.ts +24 -0
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +181 -19
- package/dist/sequence.js.map +1 -1
- package/dist/shapes/android.d.ts +3 -0
- package/dist/shapes/android.d.ts.map +1 -0
- package/dist/shapes/android.js +51 -0
- package/dist/shapes/android.js.map +1 -0
- package/dist/shapes/index.d.ts +6 -0
- package/dist/shapes/index.d.ts.map +1 -0
- package/dist/shapes/index.js +238 -0
- package/dist/shapes/index.js.map +1 -0
- package/dist/shapes/ios.d.ts +3 -0
- package/dist/shapes/ios.d.ts.map +1 -0
- package/dist/shapes/ios.js +164 -0
- package/dist/shapes/ios.js.map +1 -0
- package/dist/shapes/native.d.ts +18 -0
- package/dist/shapes/native.d.ts.map +1 -0
- package/dist/shapes/native.js +10 -0
- package/dist/shapes/native.js.map +1 -0
- package/dist/shapes/path.d.ts +10 -0
- package/dist/shapes/path.d.ts.map +1 -0
- package/dist/shapes/path.js +106 -0
- package/dist/shapes/path.js.map +1 -0
- package/dist/shapes/types.d.ts +55 -0
- package/dist/shapes/types.d.ts.map +1 -0
- package/dist/shapes/types.js +11 -0
- package/dist/shapes/types.js.map +1 -0
- package/dist/shared-layout/index.d.ts +40 -0
- package/dist/shared-layout/index.d.ts.map +1 -0
- package/dist/shared-layout/index.js +267 -0
- package/dist/shared-layout/index.js.map +1 -0
- package/dist/shared-layout/native.d.ts +15 -0
- package/dist/shared-layout/native.d.ts.map +1 -0
- package/dist/shared-layout/native.js +79 -0
- package/dist/shared-layout/native.js.map +1 -0
- package/dist/shared-layout/timing.d.ts +9 -0
- package/dist/shared-layout/timing.d.ts.map +1 -0
- package/dist/shared-layout/timing.js +68 -0
- package/dist/shared-layout/timing.js.map +1 -0
- package/dist/shared-navigation/entry.d.ts +51 -0
- package/dist/shared-navigation/entry.d.ts.map +1 -0
- package/dist/shared-navigation/entry.js +619 -0
- package/dist/shared-navigation/entry.js.map +1 -0
- package/dist/shared-navigation/index.d.ts +58 -0
- package/dist/shared-navigation/index.d.ts.map +1 -0
- package/dist/shared-navigation/index.js +318 -0
- package/dist/shared-navigation/index.js.map +1 -0
- package/dist/shared-navigation/return-signal.d.ts +16 -0
- package/dist/shared-navigation/return-signal.d.ts.map +1 -0
- package/dist/shared-navigation/return-signal.js +35 -0
- package/dist/shared-navigation/return-signal.js.map +1 -0
- package/dist/shared-navigation/return-target.d.ts +32 -0
- package/dist/shared-navigation/return-target.d.ts.map +1 -0
- package/dist/shared-navigation/return-target.js +168 -0
- package/dist/shared-navigation/return-target.js.map +1 -0
- package/dist/shared-navigation/scope.d.ts +4 -0
- package/dist/shared-navigation/scope.d.ts.map +1 -0
- package/dist/shared-navigation/scope.js +2 -0
- package/dist/shared-navigation/scope.js.map +1 -0
- package/dist/shared-navigation/targets.d.ts +6 -0
- package/dist/shared-navigation/targets.d.ts.map +1 -0
- package/dist/shared-navigation/targets.js +36 -0
- package/dist/shared-navigation/targets.js.map +1 -0
- package/dist/size-layout.d.ts +19 -0
- package/dist/size-layout.d.ts.map +1 -0
- package/dist/size-layout.js +216 -0
- package/dist/size-layout.js.map +1 -0
- package/dist/size.d.ts +19 -0
- package/dist/size.d.ts.map +1 -0
- package/dist/size.js +251 -0
- package/dist/size.js.map +1 -0
- package/dist/spring.d.ts +2 -0
- package/dist/spring.d.ts.map +1 -1
- package/dist/spring.js +11 -0
- package/dist/spring.js.map +1 -1
- package/dist/svg-path.d.ts +18 -0
- package/dist/svg-path.d.ts.map +1 -1
- package/dist/svg-path.js +3 -2
- package/dist/svg-path.js.map +1 -1
- package/dist/testing/clock.d.ts +40 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +116 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/handoff-recorder.d.ts +8 -0
- package/dist/testing/handoff-recorder.d.ts.map +1 -0
- package/dist/testing/handoff-recorder.js +77 -0
- package/dist/testing/handoff-recorder.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/native.d.ts +46 -0
- package/dist/testing/native.d.ts.map +1 -0
- package/dist/testing/native.js +313 -0
- package/dist/testing/native.js.map +1 -0
- package/dist/testing/presentation.d.ts +11 -0
- package/dist/testing/presentation.d.ts.map +1 -0
- package/dist/testing/presentation.js +45 -0
- package/dist/testing/presentation.js.map +1 -0
- package/dist/testing/replay.d.ts +39 -0
- package/dist/testing/replay.d.ts.map +1 -0
- package/dist/testing/replay.js +99 -0
- package/dist/testing/replay.js.map +1 -0
- package/dist/testing/scroll-handoff-native.d.ts +10 -0
- package/dist/testing/scroll-handoff-native.d.ts.map +1 -0
- package/dist/testing/scroll-handoff-native.js +151 -0
- package/dist/testing/scroll-handoff-native.js.map +1 -0
- package/dist/testing/scroll-handoff.d.ts +25 -0
- package/dist/testing/scroll-handoff.d.ts.map +1 -0
- package/dist/testing/scroll-handoff.js +127 -0
- package/dist/testing/scroll-handoff.js.map +1 -0
- package/dist/testing/sensors.d.ts +13 -0
- package/dist/testing/sensors.d.ts.map +1 -0
- package/dist/testing/sensors.js +26 -0
- package/dist/testing/sensors.js.map +1 -0
- package/dist/testing/trace.d.ts +101 -0
- package/dist/testing/trace.d.ts.map +1 -0
- package/dist/testing/trace.js +263 -0
- package/dist/testing/trace.js.map +1 -0
- package/dist/timed-animation.d.ts +38 -0
- package/dist/timed-animation.d.ts.map +1 -0
- package/dist/timed-animation.js +177 -0
- package/dist/timed-animation.js.map +1 -0
- package/dist/track.d.ts +3 -0
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +281 -40
- package/dist/track.js.map +1 -1
- package/dist/transition.d.ts +54 -2
- package/dist/transition.d.ts.map +1 -1
- package/dist/transition.js +128 -8
- package/dist/transition.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/value-observers.d.ts +22 -0
- package/dist/value-observers.d.ts.map +1 -0
- package/dist/value-observers.js +122 -0
- package/dist/value-observers.js.map +1 -0
- package/dist/value-track.d.ts +13 -0
- package/dist/value-track.d.ts.map +1 -0
- package/dist/value-track.js +59 -0
- package/dist/value-track.js.map +1 -0
- package/dist/vue/index.d.ts +33 -3
- package/dist/vue/index.d.ts.map +1 -1
- package/dist/vue/index.js +118 -3
- package/dist/vue/index.js.map +1 -1
- package/dist/zoomable.d.ts +1 -1
- package/dist/zoomable.d.ts.map +1 -1
- package/package.json +68 -3
- package/platforms/android/include.gradle +10 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/BlurEffect.java +89 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/CircleMath.java +151 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/CircleWorld.java +210 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +227 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +54 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +224 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +277 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/MotionProbe.java +70 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ParticleEmitter.java +192 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ParticleSimulation.java +114 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/PredictiveBackSession.java +212 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ReorderHandle.java +25 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSession.java +213 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSurface.java +27 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +84 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SensorMath.java +28 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SensorSource.java +217 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ShapeLayer.java +120 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SharedLayoutFlight.java +287 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SharedNavigationScene.java +115 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
- package/platforms/android/proguard-rules.pro +20 -0
- package/platforms/ios/build.xcconfig +1 -1
- package/platforms/ios/src/JoltBlur.h +14 -0
- package/platforms/ios/src/JoltBlur.m +86 -0
- package/platforms/ios/src/JoltCircleMath.h +183 -0
- package/platforms/ios/src/JoltCircleWorld.h +17 -0
- package/platforms/ios/src/JoltCircleWorld.m +203 -0
- package/platforms/ios/src/JoltGestureSession.h +23 -0
- package/platforms/ios/src/JoltGestureSession.m +251 -0
- package/platforms/ios/src/JoltInteractiveNavigation.h +23 -0
- package/platforms/ios/src/JoltInteractiveNavigation.m +255 -0
- package/platforms/ios/src/JoltLiveSpring.h +29 -0
- package/platforms/ios/src/JoltLiveSpring.m +243 -0
- package/platforms/ios/src/JoltMotionProbe.h +9 -0
- package/platforms/ios/src/JoltMotionProbe.m +72 -0
- package/platforms/ios/src/JoltReorderSession.h +15 -0
- package/platforms/ios/src/JoltReorderSession.m +205 -0
- package/platforms/ios/src/JoltScrollHeader.h +13 -0
- package/platforms/ios/src/JoltScrollHeader.m +93 -0
- package/platforms/ios/src/JoltSensorMath.h +39 -0
- package/platforms/ios/src/JoltSensorSource.h +13 -0
- package/platforms/ios/src/JoltSensorSource.m +201 -0
- package/platforms/ios/src/JoltSharedLayoutFlight.h +19 -0
- package/platforms/ios/src/JoltSharedLayoutFlight.m +250 -0
- package/platforms/ios/src/JoltSpringState.h +35 -0
- package/platforms/ios/src/module.modulemap +10 -0
- package/src/android-plugin.d.ts +463 -0
- package/src/animate.ts +129 -15
- package/src/blur/index.ts +195 -0
- package/src/blur/native.ts +70 -0
- package/src/blur/types.ts +32 -0
- package/src/bottom-sheet/geometry.ts +84 -0
- package/src/bottom-sheet/index.ts +536 -0
- package/src/bottom-sheet/native.ts +214 -0
- package/src/config.ts +39 -1
- package/src/decay.ts +9 -0
- package/src/drag.ts +67 -21
- package/src/driver/android-gradient.ts +116 -0
- package/src/driver/android-particles.ts +118 -0
- package/src/driver/android.ts +69 -1
- package/src/driver/frame.ts +10 -0
- package/src/driver/index.ts +15 -0
- package/src/driver/ios-gradient.ts +136 -0
- package/src/driver/ios-layout.ts +63 -0
- package/src/driver/ios-scroll-delegate.ts +23 -0
- package/src/driver/ios.ts +70 -17
- package/src/easing.ts +21 -1
- package/src/engine.ts +226 -59
- package/src/gesture-native.ts +139 -0
- package/src/gestures/index.ts +365 -0
- package/src/glass/index.ts +218 -0
- package/src/gradient-binding.ts +158 -0
- package/src/gradient.ts +663 -0
- package/src/gravity.ts +107 -0
- package/src/haptics.ts +106 -28
- package/src/image-effect.ts +10 -2
- package/src/index.ts +59 -7
- package/src/inspector/index.ts +523 -0
- package/src/inspector/plot.ts +27 -0
- package/src/inspector/probe.ts +50 -0
- package/src/inspector/tuning.ts +51 -0
- package/src/interactive-navigation/index.ts +398 -0
- package/src/ios-plugin.d.ts +279 -0
- package/src/keyboard.ts +231 -7
- package/src/layout.ts +408 -0
- package/src/live-spring-driver.ts +181 -0
- package/src/mixer.ts +306 -0
- package/src/motion-scope.ts +53 -6
- package/src/motion-states.ts +149 -42
- package/src/motion-value.ts +1289 -0
- package/src/native/index.ts +30 -0
- package/src/native-properties.ts +188 -0
- package/src/native-property-driver.ts +123 -0
- package/src/native-property.ts +366 -0
- package/src/particles.ts +18 -17
- package/src/path.ts +2 -1
- package/src/physics/index.ts +443 -0
- package/src/physics/native.ts +110 -0
- package/src/playback-group.ts +17 -1
- package/src/playback.ts +41 -0
- package/src/predictive-back/index.ts +280 -0
- package/src/predictive-back/presentation.ts +6 -0
- package/src/reorder/handle.ts +9 -0
- package/src/reorder/index.ts +243 -0
- package/src/reorder/list-view.ts +262 -0
- package/src/reorder/model.ts +47 -0
- package/src/reorder/surface.ts +10 -0
- package/src/reorder/types.ts +87 -0
- package/src/sampling.ts +173 -0
- package/src/scene-appearance.ts +92 -0
- package/src/scene-camera.ts +30 -0
- package/src/scene-shader.ts +139 -0
- package/src/scroll-header/geometry.ts +88 -0
- package/src/scroll-header/index.ts +504 -0
- package/src/scroll-header/native.ts +89 -0
- package/src/sensors/index.ts +246 -0
- package/src/sensors/native.ts +72 -0
- package/src/sequence.ts +209 -20
- package/src/shapes/android.ts +63 -0
- package/src/shapes/index.ts +267 -0
- package/src/shapes/ios.ts +194 -0
- package/src/shapes/native.ts +27 -0
- package/src/shapes/path.ts +127 -0
- package/src/shapes/types.ts +63 -0
- package/src/shared-layout/index.ts +343 -0
- package/src/shared-layout/native.ts +138 -0
- package/src/shared-layout/timing.ts +87 -0
- package/src/shared-navigation/entry.ts +695 -0
- package/src/shared-navigation/index.ts +414 -0
- package/src/shared-navigation/return-signal.ts +41 -0
- package/src/shared-navigation/return-target.ts +197 -0
- package/src/shared-navigation/scope.ts +3 -0
- package/src/shared-navigation/targets.ts +38 -0
- package/src/size-layout.ts +237 -0
- package/src/size.ts +302 -0
- package/src/spring.ts +18 -0
- package/src/svg-path.ts +8 -3
- package/src/testing/clock.ts +128 -0
- package/src/testing/handoff-recorder.ts +98 -0
- package/src/testing/index.ts +4 -0
- package/src/testing/native.ts +386 -0
- package/src/testing/presentation.ts +46 -0
- package/src/testing/replay.ts +149 -0
- package/src/testing/scroll-handoff-native.ts +201 -0
- package/src/testing/scroll-handoff.ts +140 -0
- package/src/testing/sensors.ts +41 -0
- package/src/testing/trace.ts +340 -0
- package/src/timed-animation.ts +192 -0
- package/src/track.ts +334 -38
- package/src/transition.ts +197 -9
- package/src/types.ts +11 -1
- package/src/value-observers.ts +147 -0
- package/src/value-track.ts +71 -0
- package/src/vue/index.ts +147 -1
- package/src/zoomable.ts +1 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
package org.rafaelaugusto.jolt;
|
|
2
|
+
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.graphics.Canvas;
|
|
5
|
+
import android.graphics.Paint;
|
|
6
|
+
import android.graphics.ColorFilter;
|
|
7
|
+
import android.graphics.PixelFormat;
|
|
8
|
+
import android.graphics.drawable.Drawable;
|
|
9
|
+
import android.app.Application;
|
|
10
|
+
import android.os.Bundle;
|
|
11
|
+
import android.os.SystemClock;
|
|
12
|
+
import android.view.Choreographer;
|
|
13
|
+
import android.view.MotionEvent;
|
|
14
|
+
import android.view.VelocityTracker;
|
|
15
|
+
import android.view.View;
|
|
16
|
+
import java.util.HashSet;
|
|
17
|
+
import org.json.JSONArray;
|
|
18
|
+
import org.json.JSONException;
|
|
19
|
+
import org.json.JSONObject;
|
|
20
|
+
|
|
21
|
+
/** Native touch, collision stepping and view writes. No per-event/per-frame JS callback exists. */
|
|
22
|
+
public final class CircleWorld implements Choreographer.FrameCallback, View.OnAttachStateChangeListener {
|
|
23
|
+
private static final HashSet<CircleWorld> worlds=new HashSet<>();
|
|
24
|
+
private final CircleMath state;
|
|
25
|
+
private View container;
|
|
26
|
+
private final View[] views;
|
|
27
|
+
private final CircleGuide[] guides;
|
|
28
|
+
private final boolean[] clickable;
|
|
29
|
+
private final double[] initialX,initialY,initialVX,initialVY,originalX,originalY;
|
|
30
|
+
private final float density;
|
|
31
|
+
private final int[] location=new int[2];
|
|
32
|
+
private Application application;
|
|
33
|
+
private Application.ActivityLifecycleCallbacks lifecycle;
|
|
34
|
+
private boolean enabled,disposed,background,fits,scheduled;
|
|
35
|
+
private double previous,accumulator,processingMs,droppedMs,offsetX,offsetY;
|
|
36
|
+
private long frames,dragStarts,dragMoves,dragEnds,dragCancels,lastMove;
|
|
37
|
+
private int dragging=-1;
|
|
38
|
+
private VelocityTracker velocity;
|
|
39
|
+
public static int worldCount(){return worlds.size();}
|
|
40
|
+
public static int activeCount(){int count=0;for(CircleWorld w:worlds)if(w.scheduled)count++;return count;}
|
|
41
|
+
public CircleWorld(View host,String options){
|
|
42
|
+
container=host;density=host.getResources().getDisplayMetrics().density;
|
|
43
|
+
try {
|
|
44
|
+
JSONObject config=new JSONObject(options);JSONArray data=config.getJSONArray("bodies");
|
|
45
|
+
int count=data.length();if(count<1||count>16)throw new IllegalArgumentException("Physics needs 1–16 circles");
|
|
46
|
+
state=new CircleMath(count);views=new View[count];guides=new CircleGuide[count];clickable=new boolean[count];
|
|
47
|
+
initialX=new double[count];initialY=new double[count];initialVX=new double[count];initialVY=new double[count];originalX=new double[count];originalY=new double[count];
|
|
48
|
+
state.width=config.getDouble("width");state.height=config.getDouble("height");
|
|
49
|
+
state.gx=config.getJSONObject("gravity").getDouble("x");state.gy=config.getJSONObject("gravity").getDouble("y");
|
|
50
|
+
state.restitution=config.getDouble("restitution");state.damping=config.getDouble("damping");
|
|
51
|
+
for(int i=0;i<count;i++){
|
|
52
|
+
JSONObject v=data.getJSONObject(i);CircleMath.Body b=state.bodies[i];
|
|
53
|
+
b.x=v.getDouble("x");b.y=v.getDouble("y");b.r=v.getDouble("radius");b.m=v.getDouble("mass");b.vx=v.getDouble("vx");b.vy=v.getDouble("vy");
|
|
54
|
+
initialX[i]=b.x/state.width;initialY[i]=b.y/state.height;initialVX[i]=b.vx;initialVY[i]=b.vy;
|
|
55
|
+
configureAttachment(i,v.optJSONObject("attachment"));
|
|
56
|
+
JSONObject snap=v.optJSONObject("snap");
|
|
57
|
+
if(snap!=null){
|
|
58
|
+
JSONArray points=snap.getJSONArray("points");if(points.length()>CircleMath.SNAP_LIMIT)throw new IllegalArgumentException("Too many snap points");
|
|
59
|
+
b.snap.count=points.length();b.snap.stiffness=snap.getDouble("stiffness");b.snap.damping=snap.getDouble("damping");b.snap.projection=snap.getDouble("projection");
|
|
60
|
+
for(int j=0;j<points.length();j++){JSONObject point=points.getJSONObject(j);b.snap.u[j]=point.getDouble("x")/state.width;b.snap.v[j]=point.getDouble("y")/state.height;}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}catch(JSONException e){throw new IllegalArgumentException(e);}
|
|
64
|
+
fits=state.fits(state.width,state.height);
|
|
65
|
+
host.addOnAttachStateChangeListener(this);
|
|
66
|
+
if(host.getContext().getApplicationContext() instanceof Application){
|
|
67
|
+
application=(Application)host.getContext().getApplicationContext();
|
|
68
|
+
lifecycle=new Application.ActivityLifecycleCallbacks(){
|
|
69
|
+
private boolean owns(Activity a){return container!=null && container.getRootView()==a.getWindow().getDecorView();}
|
|
70
|
+
@Override public void onActivityPaused(Activity a){if(owns(a)){background=true;cancelDrag();refresh();}}
|
|
71
|
+
@Override public void onActivityResumed(Activity a){if(owns(a)){background=false;refresh();}}
|
|
72
|
+
@Override public void onActivityCreated(Activity a,Bundle b){}
|
|
73
|
+
@Override public void onActivityStarted(Activity a){}
|
|
74
|
+
@Override public void onActivityStopped(Activity a){}
|
|
75
|
+
@Override public void onActivitySaveInstanceState(Activity a,Bundle b){}
|
|
76
|
+
@Override public void onActivityDestroyed(Activity a){}
|
|
77
|
+
};
|
|
78
|
+
application.registerActivityLifecycleCallbacks(lifecycle);
|
|
79
|
+
}
|
|
80
|
+
worlds.add(this);
|
|
81
|
+
}
|
|
82
|
+
private final class CircleGuide extends Drawable {
|
|
83
|
+
private final int index;
|
|
84
|
+
private final Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
85
|
+
CircleGuide(int index,int color,double width){this.index=index;paint.setColor(0xff000000|color);paint.setStrokeWidth((float)width*density);paint.setStyle(Paint.Style.STROKE);paint.setStrokeCap(Paint.Cap.ROUND);}
|
|
86
|
+
@Override public void draw(Canvas canvas){
|
|
87
|
+
CircleMath.Body b=state.bodies[index];
|
|
88
|
+
double x=b.snap.active?state.snapX(b,b.snap.index):b.attachment.u*state.width;
|
|
89
|
+
double y=b.snap.active?state.snapY(b,b.snap.index):b.attachment.v*state.height;
|
|
90
|
+
double dx=b.x-x,dy=b.y-y,d=Math.hypot(dx,dy);
|
|
91
|
+
if(d>b.r){canvas.drawLine((float)x*density,(float)y*density,(float)(b.x-dx/d*b.r)*density,(float)(b.y-dy/d*b.r)*density,paint);canvas.drawCircle((float)x*density,(float)y*density,2.5f*density,paint);}
|
|
92
|
+
}
|
|
93
|
+
@Override public void setAlpha(int alpha){paint.setAlpha(alpha);invalidateSelf();}
|
|
94
|
+
@Override public void setColorFilter(ColorFilter filter){paint.setColorFilter(filter);invalidateSelf();}
|
|
95
|
+
@Override public int getOpacity(){return PixelFormat.TRANSLUCENT;}
|
|
96
|
+
}
|
|
97
|
+
private void configureAttachment(int index,JSONObject options) throws JSONException {
|
|
98
|
+
if(options==null)state.attach(index,false,0,0,0,180,24);
|
|
99
|
+
else state.attach(index,true,options.getDouble("x"),options.getDouble("y"),options.getDouble("length"),options.getDouble("stiffness"),options.getDouble("damping"));
|
|
100
|
+
if(guides[index]!=null){container.getOverlay().remove(guides[index]);guides[index]=null;}
|
|
101
|
+
JSONObject line=options==null?null:options.optJSONObject("line");
|
|
102
|
+
if(line!=null){guides[index]=new CircleGuide(index,line.getInt("color"),line.getDouble("width"));container.getOverlay().add(guides[index]);}
|
|
103
|
+
}
|
|
104
|
+
public void attach(int index,String options){
|
|
105
|
+
if(disposed||index<0||index>=views.length)return;
|
|
106
|
+
try{configureAttachment(index,options.equals("null")?null:new JSONObject(options));}catch(JSONException e){throw new IllegalArgumentException(e);}
|
|
107
|
+
apply();refresh();
|
|
108
|
+
}
|
|
109
|
+
public void snapTo(int index,int target){if(disposed||index<0||index>=views.length)return;state.snapTo(index,target);apply();refresh();}
|
|
110
|
+
public void connect(View view,int index){
|
|
111
|
+
if(disposed||index<0||index>=views.length)return;
|
|
112
|
+
if(view.getParent()!=container)throw new IllegalArgumentException("Physics circles must be direct native children");
|
|
113
|
+
views[index]=view;originalX[index]=view.getTranslationX();originalY[index]=view.getTranslationY();clickable[index]=view.isClickable();
|
|
114
|
+
view.setClickable(true);view.setOnTouchListener((v,event)->touch(index,event));apply();
|
|
115
|
+
}
|
|
116
|
+
private boolean ready(){return enabled&&!disposed&&!background&&fits&&container.isAttachedToWindow();}
|
|
117
|
+
private void refresh(){
|
|
118
|
+
if(ready()&&!state.sleeping){if(!scheduled){scheduled=true;Choreographer.getInstance().postFrameCallback(this);}}
|
|
119
|
+
else {if(scheduled)Choreographer.getInstance().removeFrameCallback(this);scheduled=false;previous=0;accumulator=0;}
|
|
120
|
+
}
|
|
121
|
+
@Override public void doFrame(long nanos){
|
|
122
|
+
scheduled=false;
|
|
123
|
+
if(!ready()){cancelDrag();refresh();return;}
|
|
124
|
+
long started=System.nanoTime();double now=nanos/1e9,elapsed=previous>0?Math.max(0,now-previous):0;previous=now;
|
|
125
|
+
droppedMs+=Math.max(0,elapsed-1.0/15)*1000;accumulator+=Math.min(elapsed,1.0/15);
|
|
126
|
+
int budget=16;
|
|
127
|
+
while(accumulator+1e-10>=CircleMath.DT&&budget-->0&&!state.sleeping){state.step();accumulator-=CircleMath.DT;}
|
|
128
|
+
apply();frames++;processingMs+=(System.nanoTime()-started)/1e6;refresh();
|
|
129
|
+
}
|
|
130
|
+
private void apply(){
|
|
131
|
+
for(int i=0;i<views.length;i++)if(views[i]!=null){
|
|
132
|
+
View v=views[i];if(v.getParent()!=container){enabled=false;continue;}
|
|
133
|
+
v.setTranslationX((float)(state.bodies[i].x*density-v.getLeft()-v.getWidth()/2.0));
|
|
134
|
+
v.setTranslationY((float)(state.bodies[i].y*density-v.getTop()-v.getHeight()/2.0));
|
|
135
|
+
}
|
|
136
|
+
for(CircleGuide guide:guides)if(guide!=null){guide.setBounds(0,0,container.getWidth(),container.getHeight());guide.invalidateSelf();}
|
|
137
|
+
}
|
|
138
|
+
private void sampleVelocity(MotionEvent event){
|
|
139
|
+
if(velocity==null)return;
|
|
140
|
+
MotionEvent raw=MotionEvent.obtain(event);raw.offsetLocation(event.getRawX()-event.getX(),event.getRawY()-event.getY());velocity.addMovement(raw);raw.recycle();
|
|
141
|
+
}
|
|
142
|
+
private boolean touch(int index,MotionEvent event){
|
|
143
|
+
if(!ready())return false;
|
|
144
|
+
int action=event.getActionMasked();container.getLocationOnScreen(location);
|
|
145
|
+
double x=(event.getRawX()-location[0])/density,y=(event.getRawY()-location[1])/density;
|
|
146
|
+
if(action==MotionEvent.ACTION_DOWN){
|
|
147
|
+
if(dragging>=0)return false;
|
|
148
|
+
CircleMath.Body b=state.bodies[index];if(Math.hypot(x-b.x,y-b.y)>b.r)return false;
|
|
149
|
+
dragging=index;offsetX=b.x-x;offsetY=b.y-y;velocity=VelocityTracker.obtain();lastMove=SystemClock.uptimeMillis();dragStarts++;
|
|
150
|
+
container.getParent().requestDisallowInterceptTouchEvent(true);state.drag(index,b.x,b.y);sampleVelocity(event);refresh();return true;
|
|
151
|
+
}
|
|
152
|
+
if(dragging!=index)return false;
|
|
153
|
+
if(action==MotionEvent.ACTION_POINTER_DOWN||action==MotionEvent.ACTION_CANCEL){cancelDrag();refresh();return true;}
|
|
154
|
+
sampleVelocity(event);
|
|
155
|
+
if(action==MotionEvent.ACTION_MOVE){state.drag(index,x+offsetX,y+offsetY);lastMove=SystemClock.uptimeMillis();dragMoves++;refresh();}
|
|
156
|
+
else if(action==MotionEvent.ACTION_UP){
|
|
157
|
+
velocity.computeCurrentVelocity(1000,(float)CircleMath.SPEED*density);
|
|
158
|
+
boolean fresh=SystemClock.uptimeMillis()-lastMove<=80;
|
|
159
|
+
state.release(index,fresh?velocity.getXVelocity()/density:0,fresh?velocity.getYVelocity()/density:0);
|
|
160
|
+
dragging=-1;dragEnds++;releaseTracker();refresh();
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
private void releaseTracker(){
|
|
165
|
+
if(velocity!=null){velocity.recycle();velocity=null;}
|
|
166
|
+
if(container!=null&&container.getParent()!=null)container.getParent().requestDisallowInterceptTouchEvent(false);
|
|
167
|
+
}
|
|
168
|
+
private void cancelDrag(){if(dragging>=0){state.cancel(dragging);dragging=-1;dragCancels++;apply();}releaseTracker();}
|
|
169
|
+
public void setEnabled(boolean active){if(disposed)return;boolean changed=enabled!=active;enabled=active;if(!active)cancelDrag();else if(changed)state.wake();refresh();}
|
|
170
|
+
public void resize(double width,double height){
|
|
171
|
+
if(disposed)return;fits=state.fits(width,height);
|
|
172
|
+
if(!fits){cancelDrag();refresh();return;}
|
|
173
|
+
if(Math.abs(width-state.width)>.1||Math.abs(height-state.height)>.1){cancelDrag();state.resize(width,height);}
|
|
174
|
+
apply();refresh();
|
|
175
|
+
}
|
|
176
|
+
public void impulse(int index,double x,double y){
|
|
177
|
+
if(!ready()||index<0||index>=views.length||state.bodies[index].held||!Double.isFinite(x)||!Double.isFinite(y))return;
|
|
178
|
+
CircleMath.Body b=state.bodies[index];b.vx+=x/b.m;b.vy+=y/b.m;CircleMath.limit(b);state.wake();refresh();
|
|
179
|
+
}
|
|
180
|
+
public void reset(){
|
|
181
|
+
if(disposed)return;cancelDrag();
|
|
182
|
+
for(int i=0;i<views.length;i++){CircleMath.Body b=state.bodies[i];b.x=initialX[i]*state.width;b.y=initialY[i]*state.height;b.vx=initialVX[i];b.vy=initialVY[i];b.snap.active=b.snap.previousActive=false;b.released=false;}
|
|
183
|
+
state.contacts(false,64);state.wake();apply();refresh();
|
|
184
|
+
}
|
|
185
|
+
@Override public void onViewAttachedToWindow(View v){refresh();}
|
|
186
|
+
@Override public void onViewDetachedFromWindow(View v){cancelDrag();refresh();}
|
|
187
|
+
public String snapshot(){
|
|
188
|
+
try {
|
|
189
|
+
int guideCount=0;for(CircleGuide guide:guides)if(guide!=null)guideCount++;
|
|
190
|
+
JSONArray bodies=new JSONArray();
|
|
191
|
+
for(CircleMath.Body b:state.bodies){
|
|
192
|
+
Object attachment=b.attachment.enabled?new JSONObject().put("anchor",new JSONObject().put("x",b.attachment.u*state.width).put("y",b.attachment.v*state.height)).put("length",b.attachment.length).put("stiffness",b.attachment.stiffness).put("damping",b.attachment.damping):JSONObject.NULL;
|
|
193
|
+
Object snap=JSONObject.NULL;
|
|
194
|
+
if(b.snap.active){double x=state.snapX(b,b.snap.index),y=state.snapY(b,b.snap.index);snap=new JSONObject().put("index",b.snap.index).put("point",new JSONObject().put("x",x).put("y",y)).put("settled",Math.hypot(b.x-x,b.y-y)<=.25&&Math.hypot(b.vx,b.vy)<=4&&!b.held);}
|
|
195
|
+
Object release=b.released?new JSONObject().put("x",b.releaseX).put("y",b.releaseY).put("vx",b.releaseVX).put("vy",b.releaseVY):JSONObject.NULL;
|
|
196
|
+
bodies.put(new JSONObject().put("x",b.x).put("y",b.y).put("vx",b.vx).put("vy",b.vy).put("radius",b.r).put("held",b.held).put("attachment",attachment).put("snap",snap).put("release",release));
|
|
197
|
+
}
|
|
198
|
+
String status=disposed?"disposed":!enabled?"paused":background||!container.isAttachedToWindow()?"detached":!fits?"invalid-bounds":state.sleeping?"sleeping":"running";
|
|
199
|
+
return new JSONObject().put("status",status).put("guides",guideCount).put("bodies",bodies).put("frames",frames).put("steps",state.steps).put("contacts",state.contacts).put("dragStarts",dragStarts).put("dragMoves",dragMoves).put("dragEnds",dragEnds).put("dragCancels",dragCancels).put("processingMs",processingMs).put("droppedMs",droppedMs).put("clock",scheduled).toString();
|
|
200
|
+
}catch(JSONException e){throw new IllegalStateException(e);}
|
|
201
|
+
}
|
|
202
|
+
public void dispose(){
|
|
203
|
+
if(disposed)return;enabled=false;cancelDrag();disposed=true;refresh();
|
|
204
|
+
if(application!=null)application.unregisterActivityLifecycleCallbacks(lifecycle);application=null;lifecycle=null;
|
|
205
|
+
container.removeOnAttachStateChangeListener(this);
|
|
206
|
+
for(int i=0;i<views.length;i++)if(views[i]!=null){View v=views[i];v.setOnTouchListener(null);v.setClickable(clickable[i]);v.setTranslationX((float)originalX[i]);v.setTranslationY((float)originalY[i]);views[i]=null;}
|
|
207
|
+
for(int i=0;i<guides.length;i++)if(guides[i]!=null){container.getOverlay().remove(guides[i]);guides[i]=null;}
|
|
208
|
+
container=null;worlds.remove(this);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
package org.rafaelaugusto.jolt;
|
|
2
|
+
|
|
3
|
+
import android.graphics.Rect;
|
|
4
|
+
import android.view.GestureDetector;
|
|
5
|
+
import android.view.MotionEvent;
|
|
6
|
+
import android.view.VelocityTracker;
|
|
7
|
+
import android.view.View;
|
|
8
|
+
import org.json.JSONObject;
|
|
9
|
+
import org.json.JSONException;
|
|
10
|
+
|
|
11
|
+
/** Native arbitration, pointer rebasing and NestedScrollView consumption. */
|
|
12
|
+
public final class GestureSession {
|
|
13
|
+
public interface Listener { void onState(int state, double velocityX, double velocityY); }
|
|
14
|
+
private final GestureSurface surface;
|
|
15
|
+
private final View scroll;
|
|
16
|
+
private final LiveSpring x, y, scale, rotation;
|
|
17
|
+
private final Listener listener;
|
|
18
|
+
private final GestureDetector taps;
|
|
19
|
+
private final double density, threshold, failOffset;
|
|
20
|
+
private final int axis;
|
|
21
|
+
private final boolean pinch, rotate, tapEnabled, doubleEnabled, contactEvents, replayOnly;
|
|
22
|
+
private double minX, maxX, minY, maxY, minScale, maxScale;
|
|
23
|
+
private double downX, downY, lastX, lastY, lastSpan, lastAngle, velocityX, velocityY, replayRemainder;
|
|
24
|
+
private boolean enabled = true, disposed, active, rejected, fromScroll, contact, ending;
|
|
25
|
+
private VelocityTracker velocity;
|
|
26
|
+
|
|
27
|
+
public GestureSession(GestureSurface surface, View scroll, LiveSpring x, LiveSpring y, LiveSpring scale, LiveSpring rotation, String options, Listener listener) {
|
|
28
|
+
if (scroll != null && !(scroll instanceof androidx.core.view.NestedScrollingChild3))
|
|
29
|
+
throw new IllegalArgumentException("Scroll handoff requires NativeScript's NestedScrollView implementation");
|
|
30
|
+
this.surface = surface; this.scroll = scroll; this.x = x; this.y = y; this.scale = scale; this.rotation = rotation; this.listener = listener;
|
|
31
|
+
density = surface.getResources().getDisplayMetrics().density;
|
|
32
|
+
try {
|
|
33
|
+
JSONObject config = new JSONObject(options);
|
|
34
|
+
axis = config.getInt("axis"); threshold = config.getDouble("threshold"); failOffset = config.getDouble("failOffset");
|
|
35
|
+
pinch = config.getBoolean("pinch"); rotate = config.getBoolean("rotate");
|
|
36
|
+
tapEnabled = config.getBoolean("tap"); doubleEnabled = config.getBoolean("doubleTap");
|
|
37
|
+
contactEvents = config.optBoolean("contactEvents", false);
|
|
38
|
+
replayOnly = config.optBoolean("replay", false);
|
|
39
|
+
minX = config.getDouble("minX"); maxX = config.getDouble("maxX"); minY = config.getDouble("minY"); maxY = config.getDouble("maxY");
|
|
40
|
+
minScale = config.getDouble("minScale"); maxScale = config.getDouble("maxScale");
|
|
41
|
+
} catch (JSONException error) { throw new IllegalArgumentException(error); }
|
|
42
|
+
taps = new GestureDetector(surface.getContext(), new GestureDetector.SimpleOnGestureListener() {
|
|
43
|
+
@Override public boolean onDown(MotionEvent event) { return true; }
|
|
44
|
+
@Override public boolean onSingleTapUp(MotionEvent event) { if (tapEnabled && !doubleEnabled) emit(4); return true; }
|
|
45
|
+
@Override public boolean onSingleTapConfirmed(MotionEvent event) { if (tapEnabled) emit(4); return true; }
|
|
46
|
+
@Override public boolean onDoubleTapEvent(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP) emit(5); return true; }
|
|
47
|
+
});
|
|
48
|
+
if (!doubleEnabled) taps.setOnDoubleTapListener(null);
|
|
49
|
+
if (replayOnly && surface.hasSession())
|
|
50
|
+
throw new IllegalStateException("Replay requires an unowned gesture surface");
|
|
51
|
+
surface.setSession(this);
|
|
52
|
+
}
|
|
53
|
+
public static boolean supportsContactEvents() { return true; }
|
|
54
|
+
public boolean isActive() { return active; }
|
|
55
|
+
boolean intercepts() { return enabled && active && !fromScroll; }
|
|
56
|
+
boolean accepts(View target) { return enabled && !disposed && target == scroll; }
|
|
57
|
+
private static double clamp(double value, double min, double max) { return Math.max(min, Math.min(max, value)); }
|
|
58
|
+
private void emit(int state) { if (!disposed && listener != null) listener.onState(state, velocityX, velocityY); }
|
|
59
|
+
private void begin() {
|
|
60
|
+
if (active || !enabled || disposed) return;
|
|
61
|
+
active = true;
|
|
62
|
+
x.holdInput(x.getPosition(), 0); y.holdInput(y.getPosition(), 0);
|
|
63
|
+
scale.holdInput(scale.getPosition(), 0); rotation.holdInput(rotation.getPosition(), 0);
|
|
64
|
+
if (surface.getParent() != null) surface.getParent().requestDisallowInterceptTouchEvent(true);
|
|
65
|
+
emit(1);
|
|
66
|
+
}
|
|
67
|
+
void before(MotionEvent event) {
|
|
68
|
+
if (replayOnly || !enabled || disposed) return;
|
|
69
|
+
if (!surface.isEnabled()) { cancel(); return; }
|
|
70
|
+
int action = event.getActionMasked();
|
|
71
|
+
if (action == MotionEvent.ACTION_DOWN) {
|
|
72
|
+
cancel(); if (disposed || !enabled) return;
|
|
73
|
+
contact = true; rejected = false; velocityX = velocityY = 0;
|
|
74
|
+
velocity = VelocityTracker.obtain();
|
|
75
|
+
fromScroll = false;
|
|
76
|
+
if (scroll != null) {
|
|
77
|
+
Rect bounds = new Rect(); scroll.getDrawingRect(bounds); surface.offsetDescendantRectToMyCoords(scroll, bounds);
|
|
78
|
+
fromScroll = bounds.contains((int)event.getX(), (int)event.getY());
|
|
79
|
+
}
|
|
80
|
+
rebase(event, -1); downX = lastX; downY = lastY;
|
|
81
|
+
if (contactEvents) emit(6);
|
|
82
|
+
}
|
|
83
|
+
if (!contact) return;
|
|
84
|
+
if (velocity != null) {
|
|
85
|
+
MotionEvent raw = MotionEvent.obtain(event);
|
|
86
|
+
raw.offsetLocation(event.getRawX() - event.getX(), event.getRawY() - event.getY());
|
|
87
|
+
velocity.addMovement(raw); raw.recycle();
|
|
88
|
+
if (action == MotionEvent.ACTION_UP) {
|
|
89
|
+
velocity.computeCurrentVelocity(1000);
|
|
90
|
+
velocityX = (axis & 1) != 0 ? velocity.getXVelocity(event.getPointerId(0)) / density : 0;
|
|
91
|
+
velocityY = (axis & 2) != 0 ? velocity.getYVelocity(event.getPointerId(0)) / density : 0;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (tapEnabled || doubleEnabled) taps.onTouchEvent(event);
|
|
95
|
+
if (disposed || !enabled) return;
|
|
96
|
+
if (action == MotionEvent.ACTION_POINTER_DOWN || action == MotionEvent.ACTION_POINTER_UP) {
|
|
97
|
+
rebase(event, action == MotionEvent.ACTION_POINTER_UP ? event.getActionIndex() : -1);
|
|
98
|
+
if (!active) { downX = lastX; downY = lastY; }
|
|
99
|
+
if (velocity != null) velocity.clear();
|
|
100
|
+
if (!fromScroll && (pinch || rotate) && event.getPointerCount() >= 2 && action == MotionEvent.ACTION_POINTER_DOWN) begin();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (action != MotionEvent.ACTION_MOVE) return;
|
|
104
|
+
double cx = 0, cy = 0;
|
|
105
|
+
for (int index = 0; index < event.getPointerCount(); index++) { cx += event.getX(index); cy += event.getY(index); }
|
|
106
|
+
cx /= event.getPointerCount() * density; cy /= event.getPointerCount() * density;
|
|
107
|
+
cx += (event.getRawX() - event.getX()) / density; cy += (event.getRawY() - event.getY()) / density;
|
|
108
|
+
if (velocity != null) {
|
|
109
|
+
velocity.computeCurrentVelocity(1000);
|
|
110
|
+
velocityX = (axis & 1) != 0 ? velocity.getXVelocity(event.getPointerId(0)) / density : 0;
|
|
111
|
+
velocityY = (axis & 2) != 0 ? velocity.getYVelocity(event.getPointerId(0)) / density : 0;
|
|
112
|
+
}
|
|
113
|
+
if (!active && !fromScroll && !rejected) {
|
|
114
|
+
double dx = Math.abs(cx - downX), dy = Math.abs(cy - downY);
|
|
115
|
+
if (axis == 1 && dy > failOffset || axis == 2 && dx > failOffset) rejected = true;
|
|
116
|
+
else if (axis != 0 && (axis == 1 ? dx : axis == 2 ? dy : Math.hypot(dx, dy)) >= threshold) begin();
|
|
117
|
+
}
|
|
118
|
+
if (active && !fromScroll && !disposed) {
|
|
119
|
+
if ((axis & 1) != 0) x.holdInput(clamp(x.getPosition() + cx - lastX, minX, maxX), velocityX);
|
|
120
|
+
if ((axis & 2) != 0) y.holdInput(clamp(y.getPosition() + cy - lastY, minY, maxY), velocityY);
|
|
121
|
+
if (event.getPointerCount() >= 2) {
|
|
122
|
+
double dx = event.getX(1) - event.getX(0), dy = event.getY(1) - event.getY(0);
|
|
123
|
+
double span = Math.hypot(dx, dy), angle = Math.atan2(dy, dx);
|
|
124
|
+
if (pinch && lastSpan > 0) scale.holdInput(clamp(scale.getPosition() * span / lastSpan, minScale, maxScale), 0);
|
|
125
|
+
if (rotate && lastSpan > 0) rotation.holdInput(rotation.getPosition() + Math.atan2(Math.sin(angle - lastAngle), Math.cos(angle - lastAngle)) * 180 / Math.PI, 0);
|
|
126
|
+
lastSpan = span; lastAngle = angle;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
lastX = cx; lastY = cy;
|
|
130
|
+
}
|
|
131
|
+
private void rebase(MotionEvent event, int excluding) {
|
|
132
|
+
double cx = 0, cy = 0; int count = 0, a = -1, b = -1;
|
|
133
|
+
for (int index = 0; index < event.getPointerCount(); index++) if (index != excluding) {
|
|
134
|
+
cx += event.getX(index); cy += event.getY(index); count++;
|
|
135
|
+
if (a < 0) a = index; else if (b < 0) b = index;
|
|
136
|
+
}
|
|
137
|
+
if (count > 0) { lastX = (cx / count + event.getRawX() - event.getX()) / density; lastY = (cy / count + event.getRawY() - event.getY()) / density; }
|
|
138
|
+
lastSpan = b < 0 ? 0 : Math.hypot(event.getX(b) - event.getX(a), event.getY(b) - event.getY(a));
|
|
139
|
+
lastAngle = b < 0 ? 0 : Math.atan2(event.getY(b) - event.getY(a), event.getX(b) - event.getX(a));
|
|
140
|
+
}
|
|
141
|
+
void after(MotionEvent event) {
|
|
142
|
+
if (replayOnly) return;
|
|
143
|
+
int action = event.getActionMasked();
|
|
144
|
+
if (action == MotionEvent.ACTION_UP) finish(false);
|
|
145
|
+
else if (action == MotionEvent.ACTION_CANCEL) finish(true);
|
|
146
|
+
}
|
|
147
|
+
int consume(int pixels, boolean atTop) {
|
|
148
|
+
if (!contact || pixels == 0 || pixels < 0 && !atTop) return 0;
|
|
149
|
+
double before = y.getPosition(), next = clamp(before - pixels / density, minY, maxY);
|
|
150
|
+
int consumed = (int)Math.round((before - next) * density);
|
|
151
|
+
if (consumed == 0) return 0;
|
|
152
|
+
begin();
|
|
153
|
+
if (disposed || !enabled || !active) return 0;
|
|
154
|
+
y.holdInput(before - consumed / density, velocityY);
|
|
155
|
+
return consumed;
|
|
156
|
+
}
|
|
157
|
+
boolean preFling(float vx, float vy) {
|
|
158
|
+
if (!active) return false;
|
|
159
|
+
velocityX = 0; velocityY = -vy / density;
|
|
160
|
+
return y.getPosition() > minY + .01 || vy < 0 && !scroll.canScrollVertically(-1);
|
|
161
|
+
}
|
|
162
|
+
private void finish(boolean cancelled) {
|
|
163
|
+
boolean hadContact = contact;
|
|
164
|
+
contact = false;
|
|
165
|
+
if (velocity != null) { velocity.recycle(); velocity = null; }
|
|
166
|
+
if (!active) { if (hadContact && contactEvents) emit(7); return; }
|
|
167
|
+
active = false;
|
|
168
|
+
x.releaseInput(x.getPosition(), 0); y.releaseInput(y.getPosition(), 0);
|
|
169
|
+
scale.releaseInput(scale.getPosition(), 0); rotation.releaseInput(rotation.getPosition(), 0);
|
|
170
|
+
if (surface.getParent() != null) surface.getParent().requestDisallowInterceptTouchEvent(false);
|
|
171
|
+
ending = !cancelled;
|
|
172
|
+
try { emit(cancelled ? 3 : 2); } finally { ending = false; }
|
|
173
|
+
if (hadContact && contactEvents) emit(7);
|
|
174
|
+
}
|
|
175
|
+
public static boolean supportsScrollReplay() { return true; }
|
|
176
|
+
/** Semantic replay uses the same pre-scroll / child / post-scroll consumption as GestureSurface. */
|
|
177
|
+
public void replayScroll(int phase, double delta, double speed) {
|
|
178
|
+
if (!replayOnly || disposed || scroll == null || !Double.isFinite(delta) || !Double.isFinite(speed))
|
|
179
|
+
throw new IllegalStateException("Scroll replay needs an isolated replay session and finite input");
|
|
180
|
+
if (phase == 1) {
|
|
181
|
+
cancel(); contact = true; fromScroll = true; velocityX = velocityY = replayRemainder = 0; begin();
|
|
182
|
+
} else if (phase == 2 && contact) {
|
|
183
|
+
velocityY = speed;
|
|
184
|
+
// Carry fractions between samples, just as a cumulative OS coordinate does.
|
|
185
|
+
double pixels = -delta * density + replayRemainder;
|
|
186
|
+
int remaining = (int)Math.round(pixels);
|
|
187
|
+
replayRemainder = pixels - remaining;
|
|
188
|
+
remaining -= consume(remaining, !scroll.canScrollVertically(-1));
|
|
189
|
+
int before = scroll.getScrollY();
|
|
190
|
+
scroll.scrollBy(0, remaining);
|
|
191
|
+
remaining -= scroll.getScrollY() - before;
|
|
192
|
+
consume(remaining, true);
|
|
193
|
+
} else if (phase == 3 || phase == 4) finish(phase == 4);
|
|
194
|
+
}
|
|
195
|
+
public void replayScrollOffset(double offset) {
|
|
196
|
+
if (!replayOnly || disposed || !Double.isFinite(offset))
|
|
197
|
+
throw new IllegalStateException("Invalid scroll replay offset");
|
|
198
|
+
scroll.scrollTo(scroll.getScrollX(), (int)Math.round(offset * density));
|
|
199
|
+
}
|
|
200
|
+
public void cancel() {
|
|
201
|
+
if (active) finish(true);
|
|
202
|
+
else {
|
|
203
|
+
finish(true);
|
|
204
|
+
x.releaseInput(x.getPosition(), 0); y.releaseInput(y.getPosition(), 0);
|
|
205
|
+
scale.releaseInput(scale.getPosition(), 0); rotation.releaseInput(rotation.getPosition(), 0);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
public void setEnabled(boolean value) { enabled = value; if (!value) cancel(); }
|
|
209
|
+
public void settle(double tx, double ty, double ts, double tr, boolean animated) {
|
|
210
|
+
if (disposed) return;
|
|
211
|
+
double vx = ending ? velocityX : x.getVelocity(), vy = ending ? velocityY : y.getVelocity();
|
|
212
|
+
cancel();
|
|
213
|
+
double[] targets = {clamp(tx, minX, maxX), clamp(ty, minY, maxY), clamp(ts, minScale, maxScale), tr};
|
|
214
|
+
LiveSpring[] nodes = {x, y, scale, rotation};
|
|
215
|
+
for (int index = 0; index < nodes.length; index++) {
|
|
216
|
+
if (!animated) nodes[index].holdInput(targets[index], 0);
|
|
217
|
+
nodes[index].releaseInput(targets[index], animated ? index == 0 ? vx : index == 1 ? vy : 0 : 0);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
public void updateBounds(double left, double right, double top, double bottom) { minX = left; maxX = right; minY = top; maxY = bottom; }
|
|
221
|
+
public void dispose() {
|
|
222
|
+
if (disposed) return;
|
|
223
|
+
cancel(); disposed = true; surface.setSession(null);
|
|
224
|
+
MotionEvent cancel = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0);
|
|
225
|
+
taps.onTouchEvent(cancel); cancel.recycle();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
package org.rafaelaugusto.jolt;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
import android.view.MotionEvent;
|
|
5
|
+
import android.view.View;
|
|
6
|
+
import androidx.core.view.NestedScrollingParent3;
|
|
7
|
+
import androidx.core.view.NestedScrollingParentHelper;
|
|
8
|
+
import androidx.core.view.ViewCompat;
|
|
9
|
+
|
|
10
|
+
/** A GridLayout dispatch boundary; it does not replace NativeScript's touch listener. */
|
|
11
|
+
public final class GestureSurface extends org.nativescript.widgets.GridLayout implements NestedScrollingParent3 {
|
|
12
|
+
private GestureSession session;
|
|
13
|
+
private final NestedScrollingParentHelper nested = new NestedScrollingParentHelper(this);
|
|
14
|
+
public GestureSurface(Context context) { super(context); }
|
|
15
|
+
public void setSession(GestureSession value) { session = value; }
|
|
16
|
+
public boolean hasSession() { return session != null; }
|
|
17
|
+
@Override public boolean dispatchTouchEvent(MotionEvent event) {
|
|
18
|
+
GestureSession current = session;
|
|
19
|
+
if (current != null) current.before(event);
|
|
20
|
+
boolean handled = super.dispatchTouchEvent(event);
|
|
21
|
+
if (current != null) current.after(event);
|
|
22
|
+
return handled || current != null;
|
|
23
|
+
}
|
|
24
|
+
@Override public boolean onInterceptTouchEvent(MotionEvent event) {
|
|
25
|
+
return session != null && session.intercepts() || super.onInterceptTouchEvent(event);
|
|
26
|
+
}
|
|
27
|
+
@Override public boolean onTouchEvent(MotionEvent event) {
|
|
28
|
+
return session != null || super.onTouchEvent(event);
|
|
29
|
+
}
|
|
30
|
+
@Override public boolean onStartNestedScroll(View child, View target, int axes, int type) {
|
|
31
|
+
return session != null && type == ViewCompat.TYPE_TOUCH && (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0 && session.accepts(target);
|
|
32
|
+
}
|
|
33
|
+
@Override public void onNestedScrollAccepted(View child, View target, int axes, int type) { nested.onNestedScrollAccepted(child, target, axes, type); }
|
|
34
|
+
@Override public void onStopNestedScroll(View target, int type) { nested.onStopNestedScroll(target, type); }
|
|
35
|
+
@Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed, int type) {
|
|
36
|
+
if (session != null && type == ViewCompat.TYPE_TOUCH && session.accepts(target)) consumed[1] += session.consume(dy, !target.canScrollVertically(-1));
|
|
37
|
+
}
|
|
38
|
+
@Override public void onNestedScroll(View target, int dx, int dy, int remainingX, int remainingY, int type, int[] consumed) {
|
|
39
|
+
if (session != null && type == ViewCompat.TYPE_TOUCH && session.accepts(target)) consumed[1] += session.consume(remainingY, true);
|
|
40
|
+
}
|
|
41
|
+
@Override public boolean onNestedPreFling(View target, float vx, float vy) { return session != null && session.accepts(target) && session.preFling(vx, vy); }
|
|
42
|
+
@Override public boolean onNestedFling(View target, float vx, float vy, boolean consumed) { return false; }
|
|
43
|
+
@Override public int getNestedScrollAxes() { return nested.getNestedScrollAxes(); }
|
|
44
|
+
@Override public boolean onStartNestedScroll(View child, View target, int axes) { return onStartNestedScroll(child, target, axes, ViewCompat.TYPE_TOUCH); }
|
|
45
|
+
@Override public void onNestedScrollAccepted(View child, View target, int axes) { onNestedScrollAccepted(child, target, axes, ViewCompat.TYPE_TOUCH); }
|
|
46
|
+
@Override public void onStopNestedScroll(View target) { onStopNestedScroll(target, ViewCompat.TYPE_TOUCH); }
|
|
47
|
+
@Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { onNestedPreScroll(target, dx, dy, consumed, ViewCompat.TYPE_TOUCH); }
|
|
48
|
+
@Override public void onNestedScroll(View target, int dx, int dy, int rx, int ry) { onNestedScroll(target, dx, dy, rx, ry, ViewCompat.TYPE_TOUCH); }
|
|
49
|
+
@Override public void onNestedScroll(View target, int dx, int dy, int rx, int ry, int type) { onNestedScroll(target, dx, dy, rx, ry, type, new int[2]); }
|
|
50
|
+
@Override protected void onDetachedFromWindow() {
|
|
51
|
+
if (session != null) session.cancel();
|
|
52
|
+
super.onDetachedFromWindow();
|
|
53
|
+
}
|
|
54
|
+
}
|