@rafaelaugusto/jolt 0.1.0-beta.14 → 0.1.0-beta.16
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 +11 -4
- package/dist/drag.js +1 -1
- package/dist/drag.js.map +1 -1
- package/dist/driver/android.d.ts.map +1 -1
- package/dist/driver/android.js +2 -0
- package/dist/driver/android.js.map +1 -1
- 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 +2 -0
- package/dist/driver/ios.js.map +1 -1
- package/dist/gesture-native.d.ts +27 -0
- package/dist/gesture-native.d.ts.map +1 -0
- package/dist/gesture-native.js +55 -0
- package/dist/gesture-native.js.map +1 -0
- package/dist/gestures/index.d.ts +65 -0
- package/dist/gestures/index.d.ts.map +1 -0
- package/dist/gestures/index.js +251 -0
- package/dist/gestures/index.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- 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 +6 -0
- package/dist/mixer.d.ts.map +1 -1
- package/dist/mixer.js +41 -1
- package/dist/mixer.js.map +1 -1
- package/dist/motion-scope.d.ts +2 -0
- package/dist/motion-scope.d.ts.map +1 -1
- package/dist/motion-scope.js +6 -0
- package/dist/motion-scope.js.map +1 -1
- package/dist/motion-value.d.ts +34 -2
- package/dist/motion-value.d.ts.map +1 -1
- package/dist/motion-value.js +277 -10
- package/dist/motion-value.js.map +1 -1
- package/dist/native/index.d.ts +1 -0
- package/dist/native/index.d.ts.map +1 -1
- package/dist/native/index.js +1 -0
- package/dist/native/index.js.map +1 -1
- 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/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/value-observers.d.ts +3 -1
- package/dist/value-observers.d.ts.map +1 -1
- package/dist/value-observers.js +10 -2
- package/dist/value-observers.js.map +1 -1
- package/package.json +5 -1
- package/platforms/android/include.gradle +9 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +193 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +53 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +270 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
- package/platforms/ios/src/JoltGestureSession.h +17 -0
- package/platforms/ios/src/JoltGestureSession.m +217 -0
- package/platforms/ios/src/JoltLiveSpring.h +28 -0
- package/platforms/ios/src/JoltLiveSpring.m +236 -0
- package/platforms/ios/src/JoltSpringState.h +35 -0
- package/platforms/ios/src/module.modulemap +2 -0
- package/src/android-plugin.d.ts +59 -0
- package/src/drag.ts +1 -1
- package/src/driver/android.ts +2 -0
- package/src/driver/ios-scroll-delegate.ts +23 -0
- package/src/driver/ios.ts +2 -0
- package/src/gesture-native.ts +124 -0
- package/src/gestures/index.ts +350 -0
- package/src/index.ts +5 -1
- package/src/ios-plugin.d.ts +61 -0
- package/src/live-spring-driver.ts +181 -0
- package/src/mixer.ts +43 -1
- package/src/motion-scope.ts +14 -0
- package/src/motion-value.ts +318 -11
- package/src/native/index.ts +1 -0
- package/src/scene-camera.ts +30 -0
- package/src/size-layout.ts +237 -0
- package/src/size.ts +302 -0
- package/src/value-observers.ts +12 -2
package/dist/size.js
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { Application } from '@nativescript/core';
|
|
2
|
+
import { toView } from './animate.js';
|
|
3
|
+
import { onReducedMotion, reducedMotion } from './config.js';
|
|
4
|
+
import { getDriver } from './driver/index.js';
|
|
5
|
+
import { createClock } from './playback.js';
|
|
6
|
+
import { createTrack } from './track.js';
|
|
7
|
+
import { resolveTransition, springs, } from './transition.js';
|
|
8
|
+
import { dimension, sizeLayout, } from './size-layout.js';
|
|
9
|
+
const owners = new WeakMap();
|
|
10
|
+
export function animateSize(target, dimensions, changeOrOptions, options) {
|
|
11
|
+
const view = toView(target);
|
|
12
|
+
if (!dimensions || typeof dimensions !== 'object' || Array.isArray(dimensions))
|
|
13
|
+
throw new TypeError('animateSize takes a width/height object.');
|
|
14
|
+
const axes = Object.keys(dimensions);
|
|
15
|
+
if (!axes.length || axes.some((axis) => axis !== 'width' && axis !== 'height'))
|
|
16
|
+
throw new TypeError('animateSize needs width and/or height.');
|
|
17
|
+
for (const axis of axes)
|
|
18
|
+
dimension(dimensions[axis], axis);
|
|
19
|
+
const destination = { ...dimensions };
|
|
20
|
+
const change = typeof changeOrOptions === 'function' ? changeOrOptions : undefined;
|
|
21
|
+
if (change?.constructor.name === 'AsyncFunction')
|
|
22
|
+
throw new TypeError('animateSize changes must be synchronous.');
|
|
23
|
+
const transition = normalize(change ? options : changeOrOptions);
|
|
24
|
+
// Solve before ownership changes, including custom easing/physical-spring validation.
|
|
25
|
+
const validation = createTrack('x', [0, 100], transition, 0);
|
|
26
|
+
if (!Number.isFinite(validation.end) || !validation.values.every(Number.isFinite))
|
|
27
|
+
throw new RangeError('animateSize needs a finite curve with finite samples.');
|
|
28
|
+
const previous = owners.get(view);
|
|
29
|
+
const driver = getDriver();
|
|
30
|
+
const layout = sizeLayout(view, axes, previous?.axes, () => {
|
|
31
|
+
const frame = driver.layoutFrame?.(view);
|
|
32
|
+
return frame ? { width: frame.width, height: frame.height } : view.getActualSize();
|
|
33
|
+
});
|
|
34
|
+
// Release the previous overlay only after every caller-supplied input was validated.
|
|
35
|
+
const start = layout.read();
|
|
36
|
+
previous?.animation.stop({ restore: true });
|
|
37
|
+
let resolve;
|
|
38
|
+
let reject;
|
|
39
|
+
const finished = new Promise((done, fail) => {
|
|
40
|
+
resolve = done;
|
|
41
|
+
reject = fail;
|
|
42
|
+
});
|
|
43
|
+
let settled = false;
|
|
44
|
+
let paused = false;
|
|
45
|
+
let initialized = false;
|
|
46
|
+
let cancelFrame;
|
|
47
|
+
let unwatch;
|
|
48
|
+
let clock;
|
|
49
|
+
let tracks = new Map();
|
|
50
|
+
let endpoint;
|
|
51
|
+
const cleanup = () => {
|
|
52
|
+
cancelFrame?.();
|
|
53
|
+
cancelFrame = undefined;
|
|
54
|
+
clock?.cancel();
|
|
55
|
+
clock = undefined;
|
|
56
|
+
unwatch?.();
|
|
57
|
+
layout.dispose();
|
|
58
|
+
view.off('unloaded', unloaded);
|
|
59
|
+
Application.off(Application.suspendEvent, unloaded);
|
|
60
|
+
if (owners.get(view)?.animation === animation)
|
|
61
|
+
owners.delete(view);
|
|
62
|
+
};
|
|
63
|
+
const finish = (success, error) => {
|
|
64
|
+
if (settled)
|
|
65
|
+
return;
|
|
66
|
+
settled = true;
|
|
67
|
+
cleanup();
|
|
68
|
+
if (error !== undefined)
|
|
69
|
+
reject(error);
|
|
70
|
+
else
|
|
71
|
+
resolve(success);
|
|
72
|
+
};
|
|
73
|
+
const complete = () => {
|
|
74
|
+
layout.commit(destination);
|
|
75
|
+
layout.layout();
|
|
76
|
+
finish(true);
|
|
77
|
+
};
|
|
78
|
+
const stop = (restore = false) => {
|
|
79
|
+
if (settled)
|
|
80
|
+
return;
|
|
81
|
+
layout.commit(restore ? undefined : layout.read());
|
|
82
|
+
finish(false);
|
|
83
|
+
view.requestLayout();
|
|
84
|
+
};
|
|
85
|
+
function unloaded() {
|
|
86
|
+
stop(true);
|
|
87
|
+
}
|
|
88
|
+
const schedule = () => {
|
|
89
|
+
if (!cancelFrame && !settled && !paused)
|
|
90
|
+
cancelFrame = driver.frame(tick);
|
|
91
|
+
};
|
|
92
|
+
function tick() {
|
|
93
|
+
cancelFrame = undefined;
|
|
94
|
+
if (settled || paused)
|
|
95
|
+
return;
|
|
96
|
+
try {
|
|
97
|
+
if (!view.isLoaded || view.visibility === 'collapse' || !view.nativeViewProtected) {
|
|
98
|
+
stop(true);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const next = layout.measure(destination);
|
|
102
|
+
if (settled)
|
|
103
|
+
return;
|
|
104
|
+
if (axes.some((axis) => !Number.isFinite(next[axis]) || next[axis] < 0))
|
|
105
|
+
throw new Error('animateSize measured an invalid native size.');
|
|
106
|
+
if (reducedMotion()) {
|
|
107
|
+
complete();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!initialized &&
|
|
111
|
+
axes.every((axis) => Math.abs(next[axis] - start[axis]) < 0.5)) {
|
|
112
|
+
complete();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const elapsed = clock?.time() ?? 0;
|
|
116
|
+
if (!endpoint ||
|
|
117
|
+
axes.some((axis) => Math.abs(next[axis] - endpoint[axis]) > 0.5)) {
|
|
118
|
+
const from = initialized ? layout.read() : start;
|
|
119
|
+
const fresh = new Map();
|
|
120
|
+
for (const axis of axes)
|
|
121
|
+
fresh.set(axis, createTrack('x', [from[axis], next[axis]], initialized ? { ...transition, delay: 0 } : transition, tracks.get(axis)?.velocityAt(elapsed) ?? 0));
|
|
122
|
+
tracks = fresh;
|
|
123
|
+
endpoint = next;
|
|
124
|
+
clock?.cancel();
|
|
125
|
+
const end = Math.max(...[...tracks.values()].map((track) => track.end));
|
|
126
|
+
clock = driver.clock?.(end) ?? createClock(() => driver.now());
|
|
127
|
+
initialized = true;
|
|
128
|
+
}
|
|
129
|
+
const time = clock.time();
|
|
130
|
+
if ([...tracks.values()].every((track) => time >= track.end)) {
|
|
131
|
+
complete();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const values = {};
|
|
135
|
+
for (const [axis, track] of tracks)
|
|
136
|
+
values[axis] = Math.max(0, track.valueAt(time));
|
|
137
|
+
layout.write(values);
|
|
138
|
+
layout.layout();
|
|
139
|
+
if (settled)
|
|
140
|
+
return;
|
|
141
|
+
schedule();
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
layout.commit();
|
|
145
|
+
view.requestLayout();
|
|
146
|
+
finish(false, error);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const animation = {
|
|
150
|
+
finished,
|
|
151
|
+
then: (done, fail) => finished.then(done, fail),
|
|
152
|
+
get paused() {
|
|
153
|
+
return paused;
|
|
154
|
+
},
|
|
155
|
+
stop: (options) => stop(options?.restore === true),
|
|
156
|
+
pause() {
|
|
157
|
+
if (settled || paused)
|
|
158
|
+
return;
|
|
159
|
+
paused = true;
|
|
160
|
+
clock?.pause();
|
|
161
|
+
cancelFrame?.();
|
|
162
|
+
cancelFrame = undefined;
|
|
163
|
+
},
|
|
164
|
+
play() {
|
|
165
|
+
if (settled || !paused)
|
|
166
|
+
return;
|
|
167
|
+
paused = false;
|
|
168
|
+
clock?.play();
|
|
169
|
+
schedule();
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
owners.set(view, { animation, axes });
|
|
173
|
+
try {
|
|
174
|
+
layout.watch(() => stop(true));
|
|
175
|
+
layout.write(start);
|
|
176
|
+
view.on('unloaded', unloaded);
|
|
177
|
+
Application.on(Application.suspendEvent, unloaded);
|
|
178
|
+
unwatch = onReducedMotion((reduced) => {
|
|
179
|
+
if (reduced && !settled) {
|
|
180
|
+
try {
|
|
181
|
+
complete();
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
finish(false, error);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
const result = change?.();
|
|
189
|
+
if (result && typeof result.then === 'function')
|
|
190
|
+
throw new TypeError('animateSize changes must be synchronous.');
|
|
191
|
+
if (!view.isLoaded || view.visibility === 'collapse' || !layout.ready()) {
|
|
192
|
+
layout.commit(destination);
|
|
193
|
+
finish(false);
|
|
194
|
+
}
|
|
195
|
+
else
|
|
196
|
+
schedule();
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
stop(true);
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
return animation;
|
|
203
|
+
}
|
|
204
|
+
function normalize(input) {
|
|
205
|
+
if (typeof input === 'string') {
|
|
206
|
+
if (!Object.hasOwn(springs, input))
|
|
207
|
+
throw new TypeError(`Unknown size spring "${input}".`);
|
|
208
|
+
input = springs[input];
|
|
209
|
+
}
|
|
210
|
+
if (input !== undefined &&
|
|
211
|
+
(!input || typeof input !== 'object' || Array.isArray(input)))
|
|
212
|
+
throw new TypeError('Invalid animateSize options.');
|
|
213
|
+
const allowed = new Set([
|
|
214
|
+
'type',
|
|
215
|
+
'duration',
|
|
216
|
+
'ease',
|
|
217
|
+
'stiffness',
|
|
218
|
+
'damping',
|
|
219
|
+
'mass',
|
|
220
|
+
'bounce',
|
|
221
|
+
'velocity',
|
|
222
|
+
'delay',
|
|
223
|
+
]);
|
|
224
|
+
for (const [key, value] of Object.entries(input ?? {})) {
|
|
225
|
+
if (!allowed.has(key))
|
|
226
|
+
throw new TypeError(`Unsupported animateSize option "${key}"; repeat and seek are not supported.`);
|
|
227
|
+
if (value === undefined)
|
|
228
|
+
continue;
|
|
229
|
+
if (key !== 'type' &&
|
|
230
|
+
key !== 'ease' &&
|
|
231
|
+
(typeof value !== 'number' || !Number.isFinite(value)))
|
|
232
|
+
throw new RangeError(`animateSize ${key} must be finite.`);
|
|
233
|
+
if (key === 'type' && value !== 'spring' && value !== 'tween')
|
|
234
|
+
throw new TypeError('Invalid size transition type.');
|
|
235
|
+
if (typeof value === 'number') {
|
|
236
|
+
if (['duration', 'delay', 'damping'].includes(key) && value < 0)
|
|
237
|
+
throw new RangeError(`${key} must be nonnegative.`);
|
|
238
|
+
if (['mass', 'stiffness'].includes(key) && value <= 0)
|
|
239
|
+
throw new RangeError(`${key} must be positive.`);
|
|
240
|
+
if (key === 'bounce' && (value < -1 || value > 1))
|
|
241
|
+
throw new RangeError('bounce must be between -1 and 1.');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const resolved = resolveTransition(input ?? {}, 'x', 2);
|
|
245
|
+
if (resolved.curve.type === 'spring' &&
|
|
246
|
+
input?.duration === 0 &&
|
|
247
|
+
!('stiffness' in input || 'damping' in input || 'mass' in input))
|
|
248
|
+
throw new RangeError('Use a zero-duration tween for immediate sizing.');
|
|
249
|
+
return resolved;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=size.js.map
|
package/dist/size.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size.js","sourceRoot":"","sources":["../src/size.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,12 +8,14 @@ export type ValueListener<T> = (value: T, time: number) => void;
|
|
|
8
8
|
/** Root-owned subscriptions; mappings are evaluated only for consumers that opted in. */
|
|
9
9
|
export declare class ValueObservers {
|
|
10
10
|
private readonly read;
|
|
11
|
+
private readonly isRunning?;
|
|
11
12
|
private readonly observers;
|
|
12
13
|
private running;
|
|
13
|
-
constructor(read: (time: number) => number);
|
|
14
|
+
constructor(read: (time: number) => number, isRunning?: (() => boolean) | undefined);
|
|
14
15
|
get active(): boolean;
|
|
15
16
|
subscribe(read: (value: number) => number, color: boolean, listener: ValueListener<number | Color>, options?: SubscribeOptions): () => void;
|
|
16
17
|
changed(running: boolean): void;
|
|
18
|
+
clear(): void;
|
|
17
19
|
snapshot(time: number): () => void;
|
|
18
20
|
}
|
|
19
21
|
//# sourceMappingURL=value-observers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-observers.d.ts","sourceRoot":"","sources":["../src/value-observers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAS,MAAM,oBAAoB,CAAA;AAG9D,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,4FAA4F;AAC5F,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAqE/D,yFAAyF;AACzF,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"value-observers.d.ts","sourceRoot":"","sources":["../src/value-observers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAS,MAAM,oBAAoB,CAAA;AAG9D,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,4FAA4F;AAC5F,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAqE/D,yFAAyF;AACzF,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAL7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,OAAO,CAAQ;IAEvB,YACmB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAC9B,SAAS,CAAC,GAAE,MAAM,OAAO,aAAA,EACxC;IAEJ,IAAI,MAAM,YAET;IAED,SAAS,CACP,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,EACvC,OAAO,GAAE,gBAAqB,GAC7B,MAAM,IAAI,CAeZ;IAED,OAAO,CAAC,OAAO,EAAE,OAAO,QAMvB;IAED,KAAK,SAKJ;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAYjC;CACF"}
|
package/dist/value-observers.js
CHANGED
|
@@ -59,13 +59,15 @@ function deliver(observer, value, time) {
|
|
|
59
59
|
/** Root-owned subscriptions; mappings are evaluated only for consumers that opted in. */
|
|
60
60
|
export class ValueObservers {
|
|
61
61
|
read;
|
|
62
|
+
isRunning;
|
|
62
63
|
observers = new Set();
|
|
63
64
|
running = false;
|
|
64
|
-
constructor(read) {
|
|
65
|
+
constructor(read, isRunning) {
|
|
65
66
|
this.read = read;
|
|
67
|
+
this.isRunning = isRunning;
|
|
66
68
|
}
|
|
67
69
|
get active() {
|
|
68
|
-
return this.running && this.observers.size > 0;
|
|
70
|
+
return (this.isRunning?.() ?? this.running) && this.observers.size > 0;
|
|
69
71
|
}
|
|
70
72
|
subscribe(read, color, listener, options = {}) {
|
|
71
73
|
if (typeof listener !== 'function')
|
|
@@ -92,6 +94,12 @@ export class ValueObservers {
|
|
|
92
94
|
schedule();
|
|
93
95
|
}
|
|
94
96
|
}
|
|
97
|
+
clear() {
|
|
98
|
+
this.observers.clear();
|
|
99
|
+
pending.delete(this);
|
|
100
|
+
this.running = false;
|
|
101
|
+
schedule();
|
|
102
|
+
}
|
|
95
103
|
snapshot(time) {
|
|
96
104
|
const value = this.read(time);
|
|
97
105
|
const deliveries = [...this.observers].flatMap((observer) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-observers.js","sourceRoot":"","sources":["../src/value-observers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAiB7C,gGAAgG;AAChG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;AACzC,IAAI,WAAqC,CAAA;AACzC,IAAI,SAAS,GAAG,KAAK,CAAA;AACrB,IAAI,SAAS,GAAG,KAAK,CAAA;AAErB,SAAS,OAAO;IACd,SAAS,GAAG,IAAI,CAAA;IAChB,WAAW,EAAE,EAAE,CAAA;IACf,WAAW,GAAG,SAAS,CAAA;AACzB,CAAC;AAED,SAAS,MAAM;IACb,SAAS,GAAG,KAAK,CAAA;IACjB,QAAQ,EAAE,CAAA;AACZ,CAAC;AAED,SAAS,QAAQ;IACf,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,WAAW,EAAE,EAAE,CAAA;QACf,WAAW,GAAG,SAAS,CAAA;QACvB,IAAI,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YAClD,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;YAChD,SAAS,GAAG,KAAK,CAAA;QACnB,CAAC;QACD,OAAM;IACR,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACjD,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QAC/C,SAAS,GAAG,IAAI,CAAA;IAClB,CAAC;IACD,IAAI,WAAW,IAAI,SAAS;QAAE,OAAM;IACpC,WAAW,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QACnC,WAAW,GAAG,SAAS,CAAA;QACvB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,CAAA;QAC9B,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAA;QAC5B,OAAO,CAAC,KAAK,EAAE,CAAA;QACf,+FAA+F;QAC/F,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QACjE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACpE,KAAK,MAAM,OAAO,IAAI,UAAU;YAAE,OAAO,EAAE,CAAA;QAC3C,QAAQ,EAAE,CAAA;IACZ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,QAAkB,EAAE,KAAa,EAAE,IAAY;IAC9D,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2FAA2F;QAC3F,KAAK,CAAC,KAAK,CACT,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC9F,KAAK,CAAC,UAAU,CAAC,KAAK,EACtB,KAAK,CAAC,WAAW,CAAC,KAAK,CACxB,CAAA;IACH,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"value-observers.js","sourceRoot":"","sources":["../src/value-observers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rafaelaugusto/jolt",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.16",
|
|
4
4
|
"description": "Native animations for NativeScript: presets, springs, keyframes and stagger in one call.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nativescript",
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
"default": "./dist/vue/index.js"
|
|
35
35
|
},
|
|
36
36
|
"./package.json": "./package.json",
|
|
37
|
+
"./gestures": {
|
|
38
|
+
"types": "./dist/gestures/index.d.ts",
|
|
39
|
+
"default": "./dist/gestures/index.js"
|
|
40
|
+
},
|
|
37
41
|
"./native": {
|
|
38
42
|
"types": "./dist/native/index.d.ts",
|
|
39
43
|
"default": "./dist/native/index.js"
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
// Compile against the host's widgets; the app already packages NativeScript core.
|
|
2
|
+
dependencies {
|
|
3
|
+
compileOnly 'androidx.core:core:1.13.0'
|
|
4
|
+
if (project.hasProperty('tempBuild')) {
|
|
5
|
+
def widgets = new File(project.ext.USER_PROJECT_ROOT, 'node_modules/@nativescript/core/platforms/android/widgets-release.aar')
|
|
6
|
+
compileOnly files(zipTree(widgets).matching { include 'classes.jar' })
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
1
10
|
// Applied by the NativeScript app. Preserve fields used by the native color target.
|
|
2
11
|
def joltDependency = nativescriptDependencies.find { it.name == '@rafaelaugusto/jolt' }
|
|
3
12
|
if (joltDependency != null) {
|
|
@@ -0,0 +1,193 @@
|
|
|
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;
|
|
22
|
+
private double minX, maxX, minY, maxY, minScale, maxScale;
|
|
23
|
+
private double downX, downY, lastX, lastY, lastSpan, lastAngle, velocityX, velocityY;
|
|
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
|
+
minX = config.getDouble("minX"); maxX = config.getDouble("maxX"); minY = config.getDouble("minY"); maxY = config.getDouble("maxY");
|
|
38
|
+
minScale = config.getDouble("minScale"); maxScale = config.getDouble("maxScale");
|
|
39
|
+
} catch (JSONException error) { throw new IllegalArgumentException(error); }
|
|
40
|
+
taps = new GestureDetector(surface.getContext(), new GestureDetector.SimpleOnGestureListener() {
|
|
41
|
+
@Override public boolean onDown(MotionEvent event) { return true; }
|
|
42
|
+
@Override public boolean onSingleTapUp(MotionEvent event) { if (tapEnabled && !doubleEnabled) emit(4); return true; }
|
|
43
|
+
@Override public boolean onSingleTapConfirmed(MotionEvent event) { if (tapEnabled) emit(4); return true; }
|
|
44
|
+
@Override public boolean onDoubleTapEvent(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP) emit(5); return true; }
|
|
45
|
+
});
|
|
46
|
+
if (!doubleEnabled) taps.setOnDoubleTapListener(null);
|
|
47
|
+
surface.setSession(this);
|
|
48
|
+
}
|
|
49
|
+
public boolean isActive() { return active; }
|
|
50
|
+
boolean intercepts() { return enabled && active && !fromScroll; }
|
|
51
|
+
boolean accepts(View target) { return enabled && !disposed && target == scroll; }
|
|
52
|
+
private static double clamp(double value, double min, double max) { return Math.max(min, Math.min(max, value)); }
|
|
53
|
+
private void emit(int state) { if (!disposed && listener != null) listener.onState(state, velocityX, velocityY); }
|
|
54
|
+
private void begin() {
|
|
55
|
+
if (active || !enabled || disposed) return;
|
|
56
|
+
active = true;
|
|
57
|
+
x.holdInput(x.getPosition(), 0); y.holdInput(y.getPosition(), 0);
|
|
58
|
+
scale.holdInput(scale.getPosition(), 0); rotation.holdInput(rotation.getPosition(), 0);
|
|
59
|
+
if (surface.getParent() != null) surface.getParent().requestDisallowInterceptTouchEvent(true);
|
|
60
|
+
emit(1);
|
|
61
|
+
}
|
|
62
|
+
void before(MotionEvent event) {
|
|
63
|
+
if (!enabled || disposed) return;
|
|
64
|
+
if (!surface.isEnabled()) { cancel(); return; }
|
|
65
|
+
int action = event.getActionMasked();
|
|
66
|
+
if (action == MotionEvent.ACTION_DOWN) {
|
|
67
|
+
cancel(); if (disposed || !enabled) return;
|
|
68
|
+
contact = true; rejected = false; velocityX = velocityY = 0;
|
|
69
|
+
velocity = VelocityTracker.obtain();
|
|
70
|
+
fromScroll = false;
|
|
71
|
+
if (scroll != null) {
|
|
72
|
+
Rect bounds = new Rect(); scroll.getDrawingRect(bounds); surface.offsetDescendantRectToMyCoords(scroll, bounds);
|
|
73
|
+
fromScroll = bounds.contains((int)event.getX(), (int)event.getY());
|
|
74
|
+
}
|
|
75
|
+
rebase(event, -1); downX = lastX; downY = lastY;
|
|
76
|
+
}
|
|
77
|
+
if (!contact) return;
|
|
78
|
+
if (velocity != null) {
|
|
79
|
+
MotionEvent raw = MotionEvent.obtain(event);
|
|
80
|
+
raw.offsetLocation(event.getRawX() - event.getX(), event.getRawY() - event.getY());
|
|
81
|
+
velocity.addMovement(raw); raw.recycle();
|
|
82
|
+
if (action == MotionEvent.ACTION_UP) {
|
|
83
|
+
velocity.computeCurrentVelocity(1000);
|
|
84
|
+
velocityX = (axis & 1) != 0 ? velocity.getXVelocity(event.getPointerId(0)) / density : 0;
|
|
85
|
+
velocityY = (axis & 2) != 0 ? velocity.getYVelocity(event.getPointerId(0)) / density : 0;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (tapEnabled || doubleEnabled) taps.onTouchEvent(event);
|
|
89
|
+
if (disposed || !enabled) return;
|
|
90
|
+
if (action == MotionEvent.ACTION_POINTER_DOWN || action == MotionEvent.ACTION_POINTER_UP) {
|
|
91
|
+
rebase(event, action == MotionEvent.ACTION_POINTER_UP ? event.getActionIndex() : -1);
|
|
92
|
+
if (!active) { downX = lastX; downY = lastY; }
|
|
93
|
+
if (velocity != null) velocity.clear();
|
|
94
|
+
if (!fromScroll && (pinch || rotate) && event.getPointerCount() >= 2 && action == MotionEvent.ACTION_POINTER_DOWN) begin();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (action != MotionEvent.ACTION_MOVE) return;
|
|
98
|
+
double cx = 0, cy = 0;
|
|
99
|
+
for (int index = 0; index < event.getPointerCount(); index++) { cx += event.getX(index); cy += event.getY(index); }
|
|
100
|
+
cx /= event.getPointerCount() * density; cy /= event.getPointerCount() * density;
|
|
101
|
+
cx += (event.getRawX() - event.getX()) / density; cy += (event.getRawY() - event.getY()) / density;
|
|
102
|
+
if (velocity != null) {
|
|
103
|
+
velocity.computeCurrentVelocity(1000);
|
|
104
|
+
velocityX = (axis & 1) != 0 ? velocity.getXVelocity(event.getPointerId(0)) / density : 0;
|
|
105
|
+
velocityY = (axis & 2) != 0 ? velocity.getYVelocity(event.getPointerId(0)) / density : 0;
|
|
106
|
+
}
|
|
107
|
+
if (!active && !fromScroll && !rejected) {
|
|
108
|
+
double dx = Math.abs(cx - downX), dy = Math.abs(cy - downY);
|
|
109
|
+
if (axis == 1 && dy > failOffset || axis == 2 && dx > failOffset) rejected = true;
|
|
110
|
+
else if (axis != 0 && (axis == 1 ? dx : axis == 2 ? dy : Math.hypot(dx, dy)) >= threshold) begin();
|
|
111
|
+
}
|
|
112
|
+
if (active && !fromScroll && !disposed) {
|
|
113
|
+
if ((axis & 1) != 0) x.holdInput(clamp(x.getPosition() + cx - lastX, minX, maxX), velocityX);
|
|
114
|
+
if ((axis & 2) != 0) y.holdInput(clamp(y.getPosition() + cy - lastY, minY, maxY), velocityY);
|
|
115
|
+
if (event.getPointerCount() >= 2) {
|
|
116
|
+
double dx = event.getX(1) - event.getX(0), dy = event.getY(1) - event.getY(0);
|
|
117
|
+
double span = Math.hypot(dx, dy), angle = Math.atan2(dy, dx);
|
|
118
|
+
if (pinch && lastSpan > 0) scale.holdInput(clamp(scale.getPosition() * span / lastSpan, minScale, maxScale), 0);
|
|
119
|
+
if (rotate && lastSpan > 0) rotation.holdInput(rotation.getPosition() + Math.atan2(Math.sin(angle - lastAngle), Math.cos(angle - lastAngle)) * 180 / Math.PI, 0);
|
|
120
|
+
lastSpan = span; lastAngle = angle;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
lastX = cx; lastY = cy;
|
|
124
|
+
}
|
|
125
|
+
private void rebase(MotionEvent event, int excluding) {
|
|
126
|
+
double cx = 0, cy = 0; int count = 0, a = -1, b = -1;
|
|
127
|
+
for (int index = 0; index < event.getPointerCount(); index++) if (index != excluding) {
|
|
128
|
+
cx += event.getX(index); cy += event.getY(index); count++;
|
|
129
|
+
if (a < 0) a = index; else if (b < 0) b = index;
|
|
130
|
+
}
|
|
131
|
+
if (count > 0) { lastX = (cx / count + event.getRawX() - event.getX()) / density; lastY = (cy / count + event.getRawY() - event.getY()) / density; }
|
|
132
|
+
lastSpan = b < 0 ? 0 : Math.hypot(event.getX(b) - event.getX(a), event.getY(b) - event.getY(a));
|
|
133
|
+
lastAngle = b < 0 ? 0 : Math.atan2(event.getY(b) - event.getY(a), event.getX(b) - event.getX(a));
|
|
134
|
+
}
|
|
135
|
+
void after(MotionEvent event) {
|
|
136
|
+
int action = event.getActionMasked();
|
|
137
|
+
if (action == MotionEvent.ACTION_UP) finish(false);
|
|
138
|
+
else if (action == MotionEvent.ACTION_CANCEL) finish(true);
|
|
139
|
+
}
|
|
140
|
+
int consume(int pixels, boolean atTop) {
|
|
141
|
+
if (!contact || pixels == 0 || pixels < 0 && !atTop) return 0;
|
|
142
|
+
double before = y.getPosition(), next = clamp(before - pixels / density, minY, maxY);
|
|
143
|
+
int consumed = (int)Math.round((before - next) * density);
|
|
144
|
+
if (consumed == 0) return 0;
|
|
145
|
+
begin();
|
|
146
|
+
if (disposed || !enabled || !active) return 0;
|
|
147
|
+
y.holdInput(before - consumed / density, velocityY);
|
|
148
|
+
return consumed;
|
|
149
|
+
}
|
|
150
|
+
boolean preFling(float vx, float vy) {
|
|
151
|
+
if (!active) return false;
|
|
152
|
+
velocityX = 0; velocityY = -vy / density;
|
|
153
|
+
return y.getPosition() > minY + .01 || vy < 0 && !scroll.canScrollVertically(-1);
|
|
154
|
+
}
|
|
155
|
+
private void finish(boolean cancelled) {
|
|
156
|
+
contact = false;
|
|
157
|
+
if (velocity != null) { velocity.recycle(); velocity = null; }
|
|
158
|
+
if (!active) return;
|
|
159
|
+
active = false;
|
|
160
|
+
x.releaseInput(x.getPosition(), 0); y.releaseInput(y.getPosition(), 0);
|
|
161
|
+
scale.releaseInput(scale.getPosition(), 0); rotation.releaseInput(rotation.getPosition(), 0);
|
|
162
|
+
if (surface.getParent() != null) surface.getParent().requestDisallowInterceptTouchEvent(false);
|
|
163
|
+
ending = !cancelled;
|
|
164
|
+
try { emit(cancelled ? 3 : 2); } finally { ending = false; }
|
|
165
|
+
}
|
|
166
|
+
public void cancel() {
|
|
167
|
+
if (active) finish(true);
|
|
168
|
+
else {
|
|
169
|
+
finish(true);
|
|
170
|
+
x.releaseInput(x.getPosition(), 0); y.releaseInput(y.getPosition(), 0);
|
|
171
|
+
scale.releaseInput(scale.getPosition(), 0); rotation.releaseInput(rotation.getPosition(), 0);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
public void setEnabled(boolean value) { enabled = value; if (!value) cancel(); }
|
|
175
|
+
public void settle(double tx, double ty, double ts, double tr, boolean animated) {
|
|
176
|
+
if (disposed) return;
|
|
177
|
+
double vx = ending ? velocityX : x.getVelocity(), vy = ending ? velocityY : y.getVelocity();
|
|
178
|
+
cancel();
|
|
179
|
+
double[] targets = {clamp(tx, minX, maxX), clamp(ty, minY, maxY), clamp(ts, minScale, maxScale), tr};
|
|
180
|
+
LiveSpring[] nodes = {x, y, scale, rotation};
|
|
181
|
+
for (int index = 0; index < nodes.length; index++) {
|
|
182
|
+
if (!animated) nodes[index].holdInput(targets[index], 0);
|
|
183
|
+
nodes[index].releaseInput(targets[index], animated ? index == 0 ? vx : index == 1 ? vy : 0 : 0);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
public void updateBounds(double left, double right, double top, double bottom) { minX = left; maxX = right; minY = top; maxY = bottom; }
|
|
187
|
+
public void dispose() {
|
|
188
|
+
if (disposed) return;
|
|
189
|
+
cancel(); disposed = true; surface.setSession(null);
|
|
190
|
+
MotionEvent cancel = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0);
|
|
191
|
+
taps.onTouchEvent(cancel); cancel.recycle();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
@Override public boolean dispatchTouchEvent(MotionEvent event) {
|
|
17
|
+
GestureSession current = session;
|
|
18
|
+
if (current != null) current.before(event);
|
|
19
|
+
boolean handled = super.dispatchTouchEvent(event);
|
|
20
|
+
if (current != null) current.after(event);
|
|
21
|
+
return handled || current != null;
|
|
22
|
+
}
|
|
23
|
+
@Override public boolean onInterceptTouchEvent(MotionEvent event) {
|
|
24
|
+
return session != null && session.intercepts() || super.onInterceptTouchEvent(event);
|
|
25
|
+
}
|
|
26
|
+
@Override public boolean onTouchEvent(MotionEvent event) {
|
|
27
|
+
return session != null || super.onTouchEvent(event);
|
|
28
|
+
}
|
|
29
|
+
@Override public boolean onStartNestedScroll(View child, View target, int axes, int type) {
|
|
30
|
+
return session != null && type == ViewCompat.TYPE_TOUCH && (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0 && session.accepts(target);
|
|
31
|
+
}
|
|
32
|
+
@Override public void onNestedScrollAccepted(View child, View target, int axes, int type) { nested.onNestedScrollAccepted(child, target, axes, type); }
|
|
33
|
+
@Override public void onStopNestedScroll(View target, int type) { nested.onStopNestedScroll(target, type); }
|
|
34
|
+
@Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed, int type) {
|
|
35
|
+
if (session != null && type == ViewCompat.TYPE_TOUCH && session.accepts(target)) consumed[1] += session.consume(dy, !target.canScrollVertically(-1));
|
|
36
|
+
}
|
|
37
|
+
@Override public void onNestedScroll(View target, int dx, int dy, int remainingX, int remainingY, int type, int[] consumed) {
|
|
38
|
+
if (session != null && type == ViewCompat.TYPE_TOUCH && session.accepts(target)) consumed[1] += session.consume(remainingY, true);
|
|
39
|
+
}
|
|
40
|
+
@Override public boolean onNestedPreFling(View target, float vx, float vy) { return session != null && session.accepts(target) && session.preFling(vx, vy); }
|
|
41
|
+
@Override public boolean onNestedFling(View target, float vx, float vy, boolean consumed) { return false; }
|
|
42
|
+
@Override public int getNestedScrollAxes() { return nested.getNestedScrollAxes(); }
|
|
43
|
+
@Override public boolean onStartNestedScroll(View child, View target, int axes) { return onStartNestedScroll(child, target, axes, ViewCompat.TYPE_TOUCH); }
|
|
44
|
+
@Override public void onNestedScrollAccepted(View child, View target, int axes) { onNestedScrollAccepted(child, target, axes, ViewCompat.TYPE_TOUCH); }
|
|
45
|
+
@Override public void onStopNestedScroll(View target) { onStopNestedScroll(target, ViewCompat.TYPE_TOUCH); }
|
|
46
|
+
@Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { onNestedPreScroll(target, dx, dy, consumed, ViewCompat.TYPE_TOUCH); }
|
|
47
|
+
@Override public void onNestedScroll(View target, int dx, int dy, int rx, int ry) { onNestedScroll(target, dx, dy, rx, ry, ViewCompat.TYPE_TOUCH); }
|
|
48
|
+
@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]); }
|
|
49
|
+
@Override protected void onDetachedFromWindow() {
|
|
50
|
+
if (session != null) session.cancel();
|
|
51
|
+
super.onDetachedFromWindow();
|
|
52
|
+
}
|
|
53
|
+
}
|