@react-native-oh-tpl/react-native-gesture-handler 2.12.9 → 2.14.1-2.14.8
Sign up to get free protection for your applications and to get access to all the features.
- 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 +70 -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
|
-
}
|