@react-native-oh-tpl/react-native-gesture-handler 2.12.9 → 2.14.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/DrawerLayout/index.ts +2 -0
- package/Swipeable/index.ts +2 -0
- package/harmony/gesture_handler.har +0 -0
- package/lib/commonjs/RNGestureHandlerModule.js +2 -3
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerRootView.js +3 -3
- package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +15 -18
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/index.js +94 -137
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/NativeRNGestureHandlerModule.js +1 -2
- package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js +2 -3
- package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js +2 -3
- package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.js.map +1 -1
- package/lib/module/components/GestureHandlerRootView.js.map +1 -1
- package/lib/module/handlers/createHandler.js +12 -15
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/index.js +10 -141
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
- package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/module/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/typescript/RNGestureHandlerModule.d.ts +2 -2
- package/lib/typescript/components/GestureHandlerRootView.d.ts +6 -6
- package/lib/typescript/handlers/createHandler.d.ts +11 -11
- package/lib/typescript/index.d.ts +42 -9
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +14 -14
- package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +14 -14
- package/lib/typescript/specs/RNGestureHandlerRootViewNativeComponent.d.ts +6 -6
- package/package.json +74 -66
- package/src/RNGestureHandlerModule.ts +4 -4
- package/src/components/GestureHandlerRootView.tsx +23 -23
- package/src/handlers/createHandler.tsx +534 -534
- package/src/index.ts +172 -172
- package/src/specs/NativeRNGestureHandlerModule.ts +26 -26
- package/src/specs/RNGestureHandlerButtonNativeComponent.ts +18 -18
- package/src/specs/RNGestureHandlerRootViewNativeComponent.ts +6 -6
- package/harmony/gesture_handler/BuildProfile.ets +0 -5
- package/harmony/gesture_handler/build-profile.json5 +0 -19
- package/harmony/gesture_handler/hvigorfile.ts +0 -2
- package/harmony/gesture_handler/index.ets +0 -3
- package/harmony/gesture_handler/oh-package-lock.json5 +0 -17
- package/harmony/gesture_handler/oh-package.json5 +0 -12
- package/harmony/gesture_handler/src/main/cpp/CMakeLists.txt +0 -8
- package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.cpp +0 -103
- package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +0 -21
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentDescriptor.h +0 -36
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentInstance.h +0 -27
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonJSIBinder.h +0 -32
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.cpp +0 -22
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.h +0 -15
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerPackage.h +0 -72
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentDescriptor.h +0 -36
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentInstance.h +0 -78
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewJSIBinder.h +0 -25
- package/harmony/gesture_handler/src/main/ets/CircularBuffer.ts +0 -42
- package/harmony/gesture_handler/src/main/ets/Event.ts +0 -68
- package/harmony/gesture_handler/src/main/ets/EventDispatcher.ts +0 -53
- package/harmony/gesture_handler/src/main/ets/GestureHandler.ts +0 -663
- package/harmony/gesture_handler/src/main/ets/GestureHandlerArkUIAdapter.ts +0 -203
- package/harmony/gesture_handler/src/main/ets/GestureHandlerFactory.ts +0 -45
- package/harmony/gesture_handler/src/main/ets/GestureHandlerOrchestrator.ts +0 -280
- package/harmony/gesture_handler/src/main/ets/GestureHandlerPackage.ts +0 -22
- package/harmony/gesture_handler/src/main/ets/GestureHandlerRegistry.ts +0 -28
- package/harmony/gesture_handler/src/main/ets/InteractionManager.ts +0 -109
- package/harmony/gesture_handler/src/main/ets/LeastSquareSolver.ts +0 -182
- package/harmony/gesture_handler/src/main/ets/NativeViewGestureHandler.ts +0 -115
- package/harmony/gesture_handler/src/main/ets/OutgoingEvent.ts +0 -34
- package/harmony/gesture_handler/src/main/ets/PanGestureHandler.ts +0 -328
- package/harmony/gesture_handler/src/main/ets/PointerTracker.ts +0 -239
- package/harmony/gesture_handler/src/main/ets/RNGHError.ts +0 -5
- package/harmony/gesture_handler/src/main/ets/RNGHLogger.ts +0 -48
- package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandlerArkTS.ts +0 -60
- package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandlerCAPI.ts +0 -87
- package/harmony/gesture_handler/src/main/ets/RNGestureHandlerButton.ets +0 -38
- package/harmony/gesture_handler/src/main/ets/RNGestureHandlerModule.ts +0 -183
- package/harmony/gesture_handler/src/main/ets/RNGestureHandlerRootView.ets +0 -53
- package/harmony/gesture_handler/src/main/ets/RNOHScrollLocker.ts +0 -23
- package/harmony/gesture_handler/src/main/ets/State.ts +0 -47
- package/harmony/gesture_handler/src/main/ets/TapGestureHandler.ts +0 -206
- package/harmony/gesture_handler/src/main/ets/Vector2D.ts +0 -36
- package/harmony/gesture_handler/src/main/ets/VelocityTracker.ts +0 -98
- package/harmony/gesture_handler/src/main/ets/View.ts +0 -71
- package/harmony/gesture_handler/src/main/ets/ViewRegistry.ts +0 -43
- package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerButton.ts +0 -140
- package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerModule.ts +0 -25
- package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerRootView.ts +0 -101
- package/harmony/gesture_handler/src/main/ets/namespace/ts.ts +0 -3
- package/harmony/gesture_handler/src/main/ets/pages/Index.ets +0 -17
- package/harmony/gesture_handler/src/main/ets/types.ts +0 -25
- package/harmony/gesture_handler/src/main/ets/webviewability/WebviewAbility.ts +0 -41
- package/harmony/gesture_handler/src/main/module.json5 +0 -7
- package/harmony/gesture_handler/src/main/resources/base/element/color.json +0 -8
- package/harmony/gesture_handler/src/main/resources/base/element/string.json +0 -16
- package/harmony/gesture_handler/src/main/resources/base/media/icon.png +0 -0
- package/harmony/gesture_handler/src/main/resources/base/profile/main_pages.json +0 -5
- package/harmony/gesture_handler/src/main/resources/en_US/element/string.json +0 -16
- package/harmony/gesture_handler/src/main/resources/zh_CN/element/string.json +0 -16
- package/harmony/gesture_handler/ts.ts +0 -2
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { RNOHContext, RNViewBase, ComponentBuilderContext, RNComponentFactory, Tag } from "@rnoh/react-native-openharmony"
|
|
2
|
-
import { RNGestureHandlerRootView as RNC } from "./namespace/RNGestureHandlerRootView"
|
|
3
|
-
import { RNGHRootTouchHandlerArkTS as RNGHRootTouchHandler } from "./RNGHRootTouchHandlerArkTS"
|
|
4
|
-
import { RNGestureHandlerModule } from "./RNGestureHandlerModule"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export type RNGestureHandlerRootViewDescriptor = RNC.Descriptor
|
|
8
|
-
|
|
9
|
-
@Component
|
|
10
|
-
export struct RNGestureHandlerRootView {
|
|
11
|
-
static readonly NAME = RNC.NAME
|
|
12
|
-
ctx!: RNOHContext
|
|
13
|
-
tag: number = -1
|
|
14
|
-
@BuilderParam buildCustomComponent: (componentBuilderContext: ComponentBuilderContext) => void
|
|
15
|
-
@State descriptor: RNGestureHandlerRootViewDescriptor = {} as RNGestureHandlerRootViewDescriptor
|
|
16
|
-
private unsubscribes: (() => void)[] = []
|
|
17
|
-
private touchHandler: RNGHRootTouchHandler | undefined = undefined
|
|
18
|
-
|
|
19
|
-
aboutToAppear() {
|
|
20
|
-
const rnGestureHandlerModule = this.ctx.rnInstance.getTurboModule<RNGestureHandlerModule>(RNGestureHandlerModule.NAME)
|
|
21
|
-
const rootTag = this.ctx.descriptorRegistry.getDescriptorLineage(this.tag)[0].tag
|
|
22
|
-
this.touchHandler = new RNGHRootTouchHandler(rootTag, rnGestureHandlerModule.getViewRegistry(), rnGestureHandlerModule.getGestureHandlerRegistry(), rnGestureHandlerModule.getLogger())
|
|
23
|
-
this.handleDescriptorChange(this.ctx.descriptorRegistry.getDescriptor<RNGestureHandlerRootViewDescriptor>(this.tag))
|
|
24
|
-
this.unsubscribes.push(this.ctx.descriptorRegistry.subscribeToDescriptorChanges(this.tag, (d) => {
|
|
25
|
-
this.handleDescriptorChange(d as RNGestureHandlerRootViewDescriptor)
|
|
26
|
-
}))
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
aboutToDisappear() {
|
|
30
|
-
this.unsubscribes.forEach(unsubscribe => unsubscribe())
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
handleDescriptorChange(newDescriptor: RNGestureHandlerRootViewDescriptor) {
|
|
34
|
-
this.descriptor = newDescriptor
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
build() {
|
|
38
|
-
RNViewBase({ ctx: this.ctx, tag: this.tag }) {
|
|
39
|
-
ForEach(this.descriptor.childrenTags, (childrenTag: Tag) => {
|
|
40
|
-
RNComponentFactory({ ctx: this.ctx, tag: childrenTag, buildCustomComponent: this.buildCustomComponent })
|
|
41
|
-
})
|
|
42
|
-
Stack() {
|
|
43
|
-
}
|
|
44
|
-
.width("100%")
|
|
45
|
-
.height("100%")
|
|
46
|
-
.onTouch((e) => {
|
|
47
|
-
this.touchHandler?.handleTouch(e)
|
|
48
|
-
})
|
|
49
|
-
.hitTestBehavior(HitTestMode.Transparent)
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { RNInstance } from "@rnoh/react-native-openharmony/ts"
|
|
2
|
-
import { ScrollLocker } from "./GestureHandler"
|
|
3
|
-
|
|
4
|
-
export class RNOHScrollLockerArkTS implements ScrollLocker {
|
|
5
|
-
constructor(private rnInstance: RNInstance) {
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
lockScrollContainingViewTag(viewTag: number) {
|
|
9
|
-
return this.rnInstance.blockComponentsGestures(viewTag)
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class RNOHScrollLockerCAPI implements ScrollLocker {
|
|
14
|
-
constructor(private rnInstance: RNInstance) {
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
lockScrollContainingViewTag(viewTag: number) {
|
|
18
|
-
this.rnInstance.postMessageToCpp("RNGH::SET_NATIVE_RESPONDERS_BLOCK", { targetTag: viewTag, shouldBlock: true });
|
|
19
|
-
return () => {
|
|
20
|
-
this.rnInstance.postMessageToCpp("RNGH::SET_NATIVE_RESPONDERS_BLOCK", { targetTag: viewTag, shouldBlock: false });
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
export enum State {
|
|
2
|
-
/** This is the initial state of each handler and it goes into this state after it's done recognizing a gesture. */
|
|
3
|
-
UNDETERMINED,
|
|
4
|
-
|
|
5
|
-
/** A handler received some touches but for some reason didn't recognize them. For example, if a finger travels more
|
|
6
|
-
* distance than a defined maxDist property allows, then the handler won't become active but will fail instead.
|
|
7
|
-
* Afterwards, it's state will be reset to UNDETERMINED. */
|
|
8
|
-
FAILED,
|
|
9
|
-
|
|
10
|
-
/** Handler has started receiving touch stream but hasn't yet received enough data to either fail or activate. */
|
|
11
|
-
BEGAN,
|
|
12
|
-
|
|
13
|
-
/** The gesture recognizer has received a signal (possibly new touches or a command from the touch system controller)
|
|
14
|
-
* resulting in the cancellation of a continuous gesture. The gesture's state will become CANCELLED until it is
|
|
15
|
-
* finally reset to the initial state, UNDETERMINED. */
|
|
16
|
-
CANCELLED,
|
|
17
|
-
|
|
18
|
-
/** Handler has recognized a gesture. It will become and stay in the ACTIVE state until the gesture finishes
|
|
19
|
-
* (e.g. when user lifts the finger) or gets cancelled by the touch system. Under normal circumstances the state will
|
|
20
|
-
* then turn into END. In the case that a gesture is cancelled by the touch system, its state would then become
|
|
21
|
-
* CANCELLED. Learn about discrete and continuous handlers here to understand how long a handler can be kept in the
|
|
22
|
-
* ACTIVE state.
|
|
23
|
-
* */
|
|
24
|
-
ACTIVE,
|
|
25
|
-
|
|
26
|
-
/** The gesture recognizer has received touches signalling the end of a gesture. Its state will become END until it is
|
|
27
|
-
* reset to UNDETERMINED.
|
|
28
|
-
* */
|
|
29
|
-
END,
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function getStateName(state: State): string {
|
|
33
|
-
switch (state) {
|
|
34
|
-
case State.UNDETERMINED:
|
|
35
|
-
return "UNDETERMINED"
|
|
36
|
-
case State.FAILED:
|
|
37
|
-
return "FAILED"
|
|
38
|
-
case State.BEGAN:
|
|
39
|
-
return "BEGAN"
|
|
40
|
-
case State.CANCELLED:
|
|
41
|
-
return "CANCELLED"
|
|
42
|
-
case State.ACTIVE:
|
|
43
|
-
return "ACTIVE"
|
|
44
|
-
case State.END:
|
|
45
|
-
return "END"
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { GestureHandler, GestureHandlerDependencies } from "./GestureHandler"
|
|
2
|
-
import { AdaptedEvent, EventType } from "./Event"
|
|
3
|
-
import { State, getStateName } from "./State"
|
|
4
|
-
|
|
5
|
-
const DEFAULT_MAX_DURATION_MS = 500;
|
|
6
|
-
const DEFAULT_NUMBER_OF_TAPS = 1;
|
|
7
|
-
const DEFAULT_MAX_DELAY_MS = 500;
|
|
8
|
-
|
|
9
|
-
export class TapGestureHandler extends GestureHandler {
|
|
10
|
-
private startX = 0;
|
|
11
|
-
private startY = 0;
|
|
12
|
-
private offsetX = 0;
|
|
13
|
-
private offsetY = 0;
|
|
14
|
-
private lastX = 0;
|
|
15
|
-
private lastY = 0;
|
|
16
|
-
private maxNumberOfPointersSoFar = 0;
|
|
17
|
-
private numberOfTapsSoFar: number = 0;
|
|
18
|
-
private waitTimeout: number | undefined;
|
|
19
|
-
private delayTimeout: number | undefined;
|
|
20
|
-
|
|
21
|
-
constructor(deps: GestureHandlerDependencies) {
|
|
22
|
-
super({...deps, logger: deps.logger.cloneWithPrefix("TapGestureHandler")})
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
onPointerDown(event) {
|
|
26
|
-
this.tracker.addToTracker(event);
|
|
27
|
-
super.onPointerDown(event);
|
|
28
|
-
this.trySettingPosition(event);
|
|
29
|
-
this.lastX = event.x;
|
|
30
|
-
this.lastY = event.y;
|
|
31
|
-
this.updateState(event);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
onAdditionalPointerAdd(event: AdaptedEvent): void {
|
|
35
|
-
super.onAdditionalPointerAdd(event);
|
|
36
|
-
this.tracker.addToTracker(event);
|
|
37
|
-
this.trySettingPosition(event);
|
|
38
|
-
|
|
39
|
-
this.offsetX += this.lastX - this.startX;
|
|
40
|
-
this.offsetY += this.lastY - this.startY;
|
|
41
|
-
|
|
42
|
-
this.lastX = this.tracker.getLastAvgX();
|
|
43
|
-
this.lastY = this.tracker.getLastAvgY();
|
|
44
|
-
|
|
45
|
-
this.startX = this.tracker.getLastAvgX();
|
|
46
|
-
this.startY = this.tracker.getLastAvgY();
|
|
47
|
-
|
|
48
|
-
this.updateState(event);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
onPointerUp(event: AdaptedEvent): void {
|
|
52
|
-
super.onPointerUp(event);
|
|
53
|
-
this.lastX = this.tracker.getLastAvgX();
|
|
54
|
-
this.lastY = this.tracker.getLastAvgY();
|
|
55
|
-
|
|
56
|
-
this.tracker.removeFromTracker(event.pointerId);
|
|
57
|
-
|
|
58
|
-
this.updateState(event);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
onAdditionalPointerRemove(event: AdaptedEvent): void {
|
|
62
|
-
super.onAdditionalPointerRemove(event);
|
|
63
|
-
this.tracker.removeFromTracker(event.pointerId);
|
|
64
|
-
|
|
65
|
-
this.offsetX += this.lastX - this.startX;
|
|
66
|
-
this.offsetY += this.lastY = this.startY;
|
|
67
|
-
|
|
68
|
-
this.lastX = this.tracker.getLastAvgX();
|
|
69
|
-
this.lastY = this.tracker.getLastAvgY();
|
|
70
|
-
|
|
71
|
-
this.startX = this.lastX;
|
|
72
|
-
this.startY = this.lastY;
|
|
73
|
-
|
|
74
|
-
this.updateState(event);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
onPointerMove(event: AdaptedEvent): void {
|
|
78
|
-
this.trySettingPosition(event);
|
|
79
|
-
this.tracker.track(event);
|
|
80
|
-
|
|
81
|
-
this.lastX = this.tracker.getLastAvgX();
|
|
82
|
-
this.lastY = this.tracker.getLastAvgY();
|
|
83
|
-
|
|
84
|
-
this.updateState(event);
|
|
85
|
-
|
|
86
|
-
super.onPointerMove(event);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
onPointerOutOfBounds(event: AdaptedEvent): void {
|
|
90
|
-
this.trySettingPosition(event);
|
|
91
|
-
this.tracker.track(event);
|
|
92
|
-
|
|
93
|
-
this.lastX = this.tracker.getLastAvgX();
|
|
94
|
-
this.lastY = this.tracker.getLastAvgY();
|
|
95
|
-
|
|
96
|
-
this.updateState(event);
|
|
97
|
-
|
|
98
|
-
super.onPointerOutOfBounds(event);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
getDefaultConfig() {
|
|
102
|
-
return {}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private trySettingPosition(event: AdaptedEvent): void {
|
|
106
|
-
if (this.currentState !== State.UNDETERMINED) return;
|
|
107
|
-
this.offsetX = 0;
|
|
108
|
-
this.offsetY = 0;
|
|
109
|
-
this.startX = event.x;
|
|
110
|
-
this.startY = event.y;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private updateState(event: AdaptedEvent): void {
|
|
114
|
-
const logger = this.logger.cloneWithPrefix("updateState")
|
|
115
|
-
if (this.maxNumberOfPointersSoFar < this.tracker.getTrackedPointersCount()) {
|
|
116
|
-
this.maxNumberOfPointersSoFar = this.tracker.getTrackedPointersCount()
|
|
117
|
-
}
|
|
118
|
-
if (this.shouldFail()) {
|
|
119
|
-
logger.info("fail")
|
|
120
|
-
this.fail()
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
switch (this.currentState) {
|
|
124
|
-
case State.UNDETERMINED:
|
|
125
|
-
if (event.eventType === EventType.DOWN) {
|
|
126
|
-
this.begin()
|
|
127
|
-
}
|
|
128
|
-
this.startTap();
|
|
129
|
-
break;
|
|
130
|
-
case State.BEGAN:
|
|
131
|
-
if (event.eventType === EventType.UP) {
|
|
132
|
-
logger.info("endTap")
|
|
133
|
-
this.endTap();
|
|
134
|
-
}
|
|
135
|
-
if (event.eventType === EventType.DOWN) {
|
|
136
|
-
this.startTap();
|
|
137
|
-
}
|
|
138
|
-
break;
|
|
139
|
-
default:
|
|
140
|
-
logger.info(`default case - currentState ${getStateName(this.currentState)}`)
|
|
141
|
-
break;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
private shouldFail(): boolean {
|
|
146
|
-
const maxDeltaX = this.config.maxDeltaX ?? Number.MIN_SAFE_INTEGER
|
|
147
|
-
const maxDeltaY = this.config.maxDeltaY ?? Number.MIN_SAFE_INTEGER
|
|
148
|
-
const maxDistSq = this.config.maxDistSq ?? Number.MIN_SAFE_INTEGER
|
|
149
|
-
|
|
150
|
-
const dx = this.lastX - this.startX + this.offsetX;
|
|
151
|
-
if (
|
|
152
|
-
maxDeltaX !== Number.MIN_SAFE_INTEGER &&
|
|
153
|
-
Math.abs(dx) > maxDeltaX
|
|
154
|
-
) {
|
|
155
|
-
return true;
|
|
156
|
-
}
|
|
157
|
-
const dy = this.lastY - this.startY + this.offsetY;
|
|
158
|
-
if (
|
|
159
|
-
maxDeltaY !== Number.MIN_SAFE_INTEGER &&
|
|
160
|
-
Math.abs(dy) > maxDeltaY
|
|
161
|
-
) {
|
|
162
|
-
return true;
|
|
163
|
-
}
|
|
164
|
-
const distSq = dy * dy + dx * dx;
|
|
165
|
-
const result = maxDistSq !== Number.MIN_SAFE_INTEGER && distSq > maxDistSq
|
|
166
|
-
return result;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
private startTap() {
|
|
170
|
-
this.clearTimeouts();
|
|
171
|
-
this.waitTimeout = setTimeout(() => this.fail(), this.config.maxDurationMs ?? DEFAULT_MAX_DURATION_MS);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
private clearTimeouts() {
|
|
175
|
-
clearTimeout(this.waitTimeout);
|
|
176
|
-
clearTimeout(this.delayTimeout);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
private endTap() {
|
|
180
|
-
this.clearTimeouts();
|
|
181
|
-
if (
|
|
182
|
-
++this.numberOfTapsSoFar === (this.config.numberOfTaps ?? DEFAULT_NUMBER_OF_TAPS) &&
|
|
183
|
-
this.maxNumberOfPointersSoFar >= (this.config.minNumberOfPointers ?? 0)
|
|
184
|
-
) {
|
|
185
|
-
this.activate();
|
|
186
|
-
} else {
|
|
187
|
-
this.delayTimeout = setTimeout(() => this.fail(), this.config.maxDelayMs ?? DEFAULT_MAX_DELAY_MS);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
public activate(): void {
|
|
192
|
-
super.activate();
|
|
193
|
-
this.end();
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
protected onCancel() {
|
|
197
|
-
super.onCancel()
|
|
198
|
-
this.resetProgress()
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
protected resetProgress(): void {
|
|
202
|
-
this.clearTimeouts();
|
|
203
|
-
this.numberOfTapsSoFar = 0;
|
|
204
|
-
this.maxNumberOfPointersSoFar = 0;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export class Vector2D {
|
|
2
|
-
constructor(
|
|
3
|
-
private val: {
|
|
4
|
-
x: number;
|
|
5
|
-
y: number;
|
|
6
|
-
} = {x: 0, y: 0},
|
|
7
|
-
) {}
|
|
8
|
-
|
|
9
|
-
get x() {
|
|
10
|
-
return this.val.x;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
get y() {
|
|
14
|
-
return this.val.y;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
get value() {
|
|
18
|
-
return {...this.val};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public clone() {
|
|
22
|
-
return new Vector2D({...this.val});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public subtract(vec: Vector2D) {
|
|
26
|
-
this.val.x -= vec.x;
|
|
27
|
-
this.val.y -= vec.y;
|
|
28
|
-
return this;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public add(vec: Vector2D) {
|
|
32
|
-
this.val.x += vec.x;
|
|
33
|
-
this.val.y += vec.y;
|
|
34
|
-
return this;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { AdaptedEvent } from './Event';
|
|
2
|
-
import { CircularBuffer } from './CircularBuffer';
|
|
3
|
-
import { LeastSquareSolver } from './LeastSquareSolver';
|
|
4
|
-
|
|
5
|
-
export default class VelocityTracker {
|
|
6
|
-
private assumePointerMoveStoppedMilliseconds = 40;
|
|
7
|
-
private historySize = 20;
|
|
8
|
-
private horizonMilliseconds = 300;
|
|
9
|
-
private minSampleSize = 3;
|
|
10
|
-
|
|
11
|
-
private samples: CircularBuffer<AdaptedEvent>;
|
|
12
|
-
|
|
13
|
-
constructor() {
|
|
14
|
-
this.samples = new CircularBuffer<AdaptedEvent>(this.historySize);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
public add(event: AdaptedEvent): void {
|
|
18
|
-
this.samples.push(event);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/// Returns an estimate of the velocity of the object being tracked by the
|
|
22
|
-
/// tracker given the current information available to the tracker.
|
|
23
|
-
///
|
|
24
|
-
/// Information is added using [addPosition].
|
|
25
|
-
///
|
|
26
|
-
/// Returns null if there is no data on which to base an estimate.
|
|
27
|
-
private getVelocityEstimate(): [number, number] | null {
|
|
28
|
-
const x = [];
|
|
29
|
-
const y = [];
|
|
30
|
-
const w = [];
|
|
31
|
-
const time = [];
|
|
32
|
-
|
|
33
|
-
let sampleCount = 0;
|
|
34
|
-
let index = this.samples.size - 1;
|
|
35
|
-
const newestSample = this.samples.get(index);
|
|
36
|
-
if (!newestSample) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
let previousSample = newestSample;
|
|
41
|
-
|
|
42
|
-
// Starting with the most recent PointAtTime sample, iterate backwards while
|
|
43
|
-
// the samples represent continuous motion.
|
|
44
|
-
while (sampleCount < this.samples.size) {
|
|
45
|
-
const sample = this.samples.get(index);
|
|
46
|
-
|
|
47
|
-
const age = newestSample.time - sample.time;
|
|
48
|
-
const delta = Math.abs(sample.time - previousSample.time);
|
|
49
|
-
previousSample = sample;
|
|
50
|
-
|
|
51
|
-
if (
|
|
52
|
-
age > this.horizonMilliseconds ||
|
|
53
|
-
delta > this.assumePointerMoveStoppedMilliseconds
|
|
54
|
-
) {
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
x.push(sample.x);
|
|
59
|
-
y.push(sample.y);
|
|
60
|
-
w.push(1);
|
|
61
|
-
time.push(-age);
|
|
62
|
-
|
|
63
|
-
sampleCount++;
|
|
64
|
-
index--;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (sampleCount >= this.minSampleSize) {
|
|
68
|
-
const xSolver = new LeastSquareSolver(time, x, w);
|
|
69
|
-
const xFit = xSolver.solve(2);
|
|
70
|
-
|
|
71
|
-
if (xFit !== null) {
|
|
72
|
-
const ySolver = new LeastSquareSolver(time, y, w);
|
|
73
|
-
const yFit = ySolver.solve(2);
|
|
74
|
-
|
|
75
|
-
if (yFit !== null) {
|
|
76
|
-
const xVelocity = xFit.coefficients[1] * 1000;
|
|
77
|
-
const yVelocity = yFit.coefficients[1] * 1000;
|
|
78
|
-
|
|
79
|
-
return [xVelocity, yVelocity];
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
public getVelocity(): [number, number] {
|
|
88
|
-
const estimate = this.getVelocityEstimate();
|
|
89
|
-
if (estimate !== null) {
|
|
90
|
-
return estimate;
|
|
91
|
-
}
|
|
92
|
-
return [0, 0];
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
public reset(): void {
|
|
96
|
-
this.samples.clear();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { DescriptorRegistry, Descriptor, Tag } from "@rnoh/react-native-openharmony/ts"
|
|
2
|
-
import { Vector2D } from "./Vector2D"
|
|
3
|
-
|
|
4
|
-
export type BoundingBox = {
|
|
5
|
-
x: number,
|
|
6
|
-
y: number,
|
|
7
|
-
width: number,
|
|
8
|
-
height: number
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class View {
|
|
12
|
-
constructor(private descriptorRegistry: DescriptorRegistry, private viewTag: number) {
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public getChildren() {
|
|
16
|
-
return this.getDescriptor().childrenTags.map(childrenTag => {
|
|
17
|
-
return new View(this.descriptorRegistry, childrenTag)
|
|
18
|
-
})
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public getTag(): Tag {
|
|
22
|
-
return this.viewTag
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public isPositionInBounds({x, y}: {
|
|
26
|
-
x: number,
|
|
27
|
-
y: number
|
|
28
|
-
}): boolean {
|
|
29
|
-
const rect = this.getBoundingRect()
|
|
30
|
-
return x >= rect.x && x <= (rect.x + rect.width) && y >= rect.y && y <= (rect.y + rect.height);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public getBoundingRect(): BoundingBox {
|
|
34
|
-
const d = this.getDescriptor()
|
|
35
|
-
if (!d) {
|
|
36
|
-
return { x: 0, y: 0, width: 0, height: 0 }
|
|
37
|
-
}
|
|
38
|
-
const offsetToAbsolutePosition = this.getOffsetToAbsolutePosition()
|
|
39
|
-
return {
|
|
40
|
-
x: d.layoutMetrics.frame.origin.x - offsetToAbsolutePosition.x,
|
|
41
|
-
y: d.layoutMetrics.frame.origin.y - offsetToAbsolutePosition.y,
|
|
42
|
-
width: d.layoutMetrics.frame.size.width,
|
|
43
|
-
height: d.layoutMetrics.frame.size.height
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
private getDescriptor() {
|
|
48
|
-
return this.descriptorRegistry.getDescriptor(this.viewTag)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
private getOffsetToAbsolutePosition(): Vector2D {
|
|
53
|
-
const currentOffset = new Vector2D()
|
|
54
|
-
let parentTag = this.getDescriptor()?.parentTag
|
|
55
|
-
while (parentTag !== undefined) {
|
|
56
|
-
const d = this.descriptorRegistry.getDescriptor(parentTag)
|
|
57
|
-
currentOffset.add(this.extractScrollOffsetFromDescriptor(d))
|
|
58
|
-
currentOffset.subtract(new Vector2D(d.layoutMetrics.frame.origin))
|
|
59
|
-
parentTag = d.parentTag
|
|
60
|
-
}
|
|
61
|
-
return currentOffset
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
private extractScrollOffsetFromDescriptor(descriptor: Descriptor<any>) {
|
|
65
|
-
if (descriptor.type !== "ScrollView") {
|
|
66
|
-
return new Vector2D();
|
|
67
|
-
}
|
|
68
|
-
const scrollViewState: any = descriptor.state;
|
|
69
|
-
return new Vector2D({ x: scrollViewState.contentOffsetX, y: scrollViewState.contentOffsetY })
|
|
70
|
-
}
|
|
71
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { DescriptorRegistry, ComponentManagerRegistry, Tag } from "@rnoh/react-native-openharmony/ts"
|
|
2
|
-
import { View } from "./View"
|
|
3
|
-
|
|
4
|
-
export class ViewRegistry {
|
|
5
|
-
constructor(private descriptorRegistry: DescriptorRegistry, private componentManagerRegistry: ComponentManagerRegistry) {
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
public getViewByTag(viewTag: Tag) {
|
|
9
|
-
return this.createView(viewTag)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
private createView(tag: Tag): View {
|
|
13
|
-
return new View(this.descriptorRegistry, tag)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
public getTouchableViewsAt(pos: {
|
|
17
|
-
x: number,
|
|
18
|
-
y: number
|
|
19
|
-
}, rootTag: Tag): View[] {
|
|
20
|
-
const rootView = this.createView(rootTag)
|
|
21
|
-
const results: View[] = []
|
|
22
|
-
for (const view of this.getTouchableViewsAtPosInView(pos, rootView)) {
|
|
23
|
-
results.push(view)
|
|
24
|
-
}
|
|
25
|
-
return results
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
private getTouchableViewsAtPosInView(pos: {
|
|
29
|
-
x: number,
|
|
30
|
-
y: number
|
|
31
|
-
}, view: View) {
|
|
32
|
-
if (!view.isPositionInBounds(pos))
|
|
33
|
-
return [];
|
|
34
|
-
const results: View[] = []
|
|
35
|
-
results.push(view)
|
|
36
|
-
for (const child of view.getChildren()) {
|
|
37
|
-
for (const result of this.getTouchableViewsAtPosInView(pos, child)) {
|
|
38
|
-
results.push(result)
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return results
|
|
42
|
-
}
|
|
43
|
-
}
|