@rafaelaugusto/jolt 0.1.0-beta.1 → 0.1.0-beta.11
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 +385 -18
- package/dist/animate.d.ts +19 -3
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +186 -14
- package/dist/animate.js.map +1 -1
- package/dist/color.d.ts +11 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +73 -0
- package/dist/color.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/decay.d.ts +11 -0
- package/dist/decay.d.ts.map +1 -0
- package/dist/decay.js +22 -0
- package/dist/decay.js.map +1 -0
- package/dist/decoration.d.ts +18 -0
- package/dist/decoration.d.ts.map +1 -0
- package/dist/decoration.js +155 -0
- package/dist/decoration.js.map +1 -0
- package/dist/drag-input.d.ts +15 -0
- package/dist/drag-input.d.ts.map +1 -0
- package/dist/drag-input.js +66 -0
- package/dist/drag-input.js.map +1 -0
- package/dist/drag-physics.d.ts +20 -0
- package/dist/drag-physics.d.ts.map +1 -0
- package/dist/drag-physics.js +75 -0
- package/dist/drag-physics.js.map +1 -0
- package/dist/drag.d.ts +58 -0
- package/dist/drag.d.ts.map +1 -0
- package/dist/drag.js +324 -0
- package/dist/drag.js.map +1 -0
- package/dist/driver/android-color.d.ts +20 -0
- package/dist/driver/android-color.d.ts.map +1 -0
- package/dist/driver/android-color.js +136 -0
- package/dist/driver/android-color.js.map +1 -0
- package/dist/driver/android-decoration.d.ts +22 -0
- package/dist/driver/android-decoration.d.ts.map +1 -0
- package/dist/driver/android-decoration.js +139 -0
- package/dist/driver/android-decoration.js.map +1 -0
- package/dist/driver/android-gradient.d.ts +5 -0
- package/dist/driver/android-gradient.d.ts.map +1 -0
- package/dist/driver/android-gradient.js +89 -0
- package/dist/driver/android-gradient.js.map +1 -0
- package/dist/driver/android-playback.d.ts +13 -0
- package/dist/driver/android-playback.d.ts.map +1 -0
- package/dist/driver/android-playback.js +141 -0
- package/dist/driver/android-playback.js.map +1 -0
- package/dist/driver/android.d.ts +1 -1
- package/dist/driver/android.d.ts.map +1 -1
- package/dist/driver/android.js +165 -13
- package/dist/driver/android.js.map +1 -1
- package/dist/driver/index.d.ts +25 -2
- package/dist/driver/index.d.ts.map +1 -1
- package/dist/driver/index.js.map +1 -1
- package/dist/driver/ios-color.d.ts +16 -0
- package/dist/driver/ios-color.d.ts.map +1 -0
- package/dist/driver/ios-color.js +392 -0
- package/dist/driver/ios-color.js.map +1 -0
- package/dist/driver/ios-decoration.d.ts +17 -0
- package/dist/driver/ios-decoration.d.ts.map +1 -0
- package/dist/driver/ios-decoration.js +271 -0
- package/dist/driver/ios-decoration.js.map +1 -0
- package/dist/driver/ios-gradient.d.ts +5 -0
- package/dist/driver/ios-gradient.d.ts.map +1 -0
- package/dist/driver/ios-gradient.js +109 -0
- package/dist/driver/ios-gradient.js.map +1 -0
- package/dist/driver/ios-layout.d.ts +9 -0
- package/dist/driver/ios-layout.d.ts.map +1 -0
- package/dist/driver/ios-layout.js +52 -0
- package/dist/driver/ios-layout.js.map +1 -0
- package/dist/driver/ios-playback.d.ts +10 -0
- package/dist/driver/ios-playback.d.ts.map +1 -0
- package/dist/driver/ios-playback.js +47 -0
- package/dist/driver/ios-playback.js.map +1 -0
- package/dist/driver/ios-shadow.d.ts +6 -0
- package/dist/driver/ios-shadow.d.ts.map +1 -0
- package/dist/driver/ios-shadow.js +52 -0
- package/dist/driver/ios-shadow.js.map +1 -0
- package/dist/driver/ios.d.ts.map +1 -1
- package/dist/driver/ios.js +163 -28
- package/dist/driver/ios.js.map +1 -1
- package/dist/engine.d.ts +75 -5
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +293 -23
- package/dist/engine.js.map +1 -1
- package/dist/gradient.d.ts +90 -0
- package/dist/gradient.d.ts.map +1 -0
- package/dist/gradient.js +247 -0
- package/dist/gradient.js.map +1 -0
- package/dist/haptics.d.ts +21 -0
- package/dist/haptics.d.ts.map +1 -0
- package/dist/haptics.js +120 -0
- package/dist/haptics.js.map +1 -0
- package/dist/image-effect-native.d.ts +26 -0
- package/dist/image-effect-native.d.ts.map +1 -0
- package/dist/image-effect-native.js +73 -0
- package/dist/image-effect-native.js.map +1 -0
- package/dist/image-effect.d.ts +50 -0
- package/dist/image-effect.d.ts.map +1 -0
- package/dist/image-effect.js +290 -0
- package/dist/image-effect.js.map +1 -0
- package/dist/image-owner.d.ts +3 -0
- package/dist/image-owner.d.ts.map +1 -0
- package/dist/image-owner.js +11 -0
- package/dist/image-owner.js.map +1 -0
- package/dist/index.d.ts +47 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/interaction-surface.d.ts +12 -0
- package/dist/interaction-surface.d.ts.map +1 -0
- package/dist/interaction-surface.js +36 -0
- package/dist/interaction-surface.js.map +1 -0
- package/dist/items.d.ts +20 -0
- package/dist/items.d.ts.map +1 -0
- package/dist/items.js +109 -0
- package/dist/items.js.map +1 -0
- package/dist/keyboard.d.ts +41 -0
- package/dist/keyboard.d.ts.map +1 -0
- package/dist/keyboard.js +256 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/label.d.ts +7 -0
- package/dist/label.d.ts.map +1 -0
- package/dist/label.js +60 -0
- package/dist/label.js.map +1 -0
- package/dist/layout.d.ts +13 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +348 -0
- package/dist/layout.js.map +1 -0
- package/dist/liquid-grid.d.ts +3 -0
- package/dist/liquid-grid.d.ts.map +1 -0
- package/dist/liquid-grid.js +24 -0
- package/dist/liquid-grid.js.map +1 -0
- package/dist/liquid.d.ts +18 -0
- package/dist/liquid.d.ts.map +1 -0
- package/dist/liquid.js +234 -0
- package/dist/liquid.js.map +1 -0
- package/dist/loader.d.ts +19 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +173 -0
- package/dist/loader.js.map +1 -0
- package/dist/motion-scope.d.ts +39 -0
- package/dist/motion-scope.d.ts.map +1 -0
- package/dist/motion-scope.js +238 -0
- package/dist/motion-scope.js.map +1 -0
- package/dist/motion-states.d.ts +43 -0
- package/dist/motion-states.d.ts.map +1 -0
- package/dist/motion-states.js +220 -0
- package/dist/motion-states.js.map +1 -0
- package/dist/particles.d.ts +39 -0
- package/dist/particles.d.ts.map +1 -0
- package/dist/particles.js +265 -0
- package/dist/particles.js.map +1 -0
- package/dist/path.d.ts +12 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +90 -0
- package/dist/path.js.map +1 -0
- package/dist/playback-group.d.ts +6 -0
- package/dist/playback-group.d.ts.map +1 -0
- package/dist/playback-group.js +141 -0
- package/dist/playback-group.js.map +1 -0
- package/dist/playback.d.ts +25 -0
- package/dist/playback.d.ts.map +1 -0
- package/dist/playback.js +35 -0
- package/dist/playback.js.map +1 -0
- package/dist/press.d.ts.map +1 -1
- package/dist/press.js +23 -7
- package/dist/press.js.map +1 -1
- package/dist/properties.d.ts +6 -3
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +26 -2
- package/dist/properties.js.map +1 -1
- package/dist/reveal.d.ts +25 -0
- package/dist/reveal.d.ts.map +1 -0
- package/dist/reveal.js +294 -0
- package/dist/reveal.js.map +1 -0
- package/dist/roll-diff.d.ts +22 -0
- package/dist/roll-diff.d.ts.map +1 -0
- package/dist/roll-diff.js +36 -0
- package/dist/roll-diff.js.map +1 -0
- package/dist/roll.d.ts +29 -0
- package/dist/roll.d.ts.map +1 -0
- package/dist/roll.js +442 -0
- package/dist/roll.js.map +1 -0
- package/dist/scroll-linked.d.ts +10 -0
- package/dist/scroll-linked.d.ts.map +1 -0
- package/dist/scroll-linked.js +58 -0
- package/dist/scroll-linked.js.map +1 -0
- package/dist/sequence.d.ts +10 -5
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +208 -14
- package/dist/sequence.js.map +1 -1
- package/dist/shimmer.d.ts +12 -0
- package/dist/shimmer.d.ts.map +1 -0
- package/dist/shimmer.js +161 -0
- package/dist/shimmer.js.map +1 -0
- package/dist/svg-path.d.ts +14 -0
- package/dist/svg-path.d.ts.map +1 -0
- package/dist/svg-path.js +281 -0
- package/dist/svg-path.js.map +1 -0
- package/dist/symbol-effect.d.ts +23 -0
- package/dist/symbol-effect.d.ts.map +1 -0
- package/dist/symbol-effect.js +187 -0
- package/dist/symbol-effect.js.map +1 -0
- package/dist/text-layout.d.ts +30 -0
- package/dist/text-layout.d.ts.map +1 -0
- package/dist/text-layout.js +185 -0
- package/dist/text-layout.js.map +1 -0
- package/dist/text.d.ts +17 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +263 -0
- package/dist/text.js.map +1 -0
- package/dist/track.d.ts +3 -1
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +266 -13
- package/dist/track.js.map +1 -1
- package/dist/transition.d.ts +32 -1
- package/dist/transition.d.ts.map +1 -1
- package/dist/transition.js +58 -6
- package/dist/transition.js.map +1 -1
- package/dist/types.d.ts +48 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/vue/index.d.ts +95 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +163 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/zoom-native.d.ts +30 -0
- package/dist/zoom-native.d.ts.map +1 -0
- package/dist/zoom-native.js +56 -0
- package/dist/zoom-native.js.map +1 -0
- package/dist/zoomable.d.ts +48 -0
- package/dist/zoomable.d.ts.map +1 -0
- package/dist/zoomable.js +249 -0
- package/dist/zoomable.js.map +1 -0
- package/package.json +29 -5
- package/platforms/android/include.gradle +7 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ColorTarget.java +102 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/DecorationTarget.java +154 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +195 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ImageEffect.java +288 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFollower.java +91 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/NumberRoll.java +190 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/PhotoZoom.java +250 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/TextReveal.java +180 -0
- package/platforms/android/proguard-rules.pro +21 -0
- package/platforms/ios/build.xcconfig +1 -0
- package/platforms/ios/src/JoltImageEffect.h +25 -0
- package/platforms/ios/src/JoltImageEffect.mm +242 -0
- package/platforms/ios/src/JoltInteractiveAnimation.h +18 -0
- package/platforms/ios/src/JoltInteractiveAnimation.m +123 -0
- package/platforms/ios/src/JoltPhotoZoom.h +23 -0
- package/platforms/ios/src/JoltPhotoZoom.m +229 -0
- package/platforms/ios/src/module.modulemap +6 -0
- package/src/android-plugin.d.ts +184 -0
- package/src/animate.ts +249 -36
- package/src/color.ts +101 -0
- package/src/config.ts +84 -0
- package/src/decay.ts +45 -0
- package/src/decoration.ts +180 -0
- package/src/drag-input.ts +74 -0
- package/src/drag-physics.ts +110 -0
- package/src/drag.ts +395 -0
- package/src/driver/android-color.ts +170 -0
- package/src/driver/android-decoration.ts +182 -0
- package/src/driver/android-gradient.ts +109 -0
- package/src/driver/android-playback.ts +157 -0
- package/src/driver/android.ts +208 -20
- package/src/driver/index.ts +37 -2
- package/src/driver/ios-color.ts +441 -0
- package/src/driver/ios-decoration.ts +332 -0
- package/src/driver/ios-gradient.ts +114 -0
- package/src/driver/ios-layout.ts +63 -0
- package/src/driver/ios-playback.ts +51 -0
- package/src/driver/ios-shadow.ts +50 -0
- package/src/driver/ios.ts +193 -33
- package/src/engine.ts +321 -27
- package/src/gradient.ts +372 -0
- package/src/haptics.ts +148 -0
- package/src/image-effect-native.ts +129 -0
- package/src/image-effect.ts +336 -0
- package/src/image-owner.ts +12 -0
- package/src/index.ts +75 -4
- package/src/interaction-surface.ts +41 -0
- package/src/ios-plugin.d.ts +81 -0
- package/src/items.ts +140 -0
- package/src/keyboard.ts +291 -0
- package/src/label.ts +76 -0
- package/src/layout.ts +408 -0
- package/src/liquid-grid.ts +28 -0
- package/src/liquid.ts +287 -0
- package/src/loader.ts +202 -0
- package/src/motion-scope.ts +279 -0
- package/src/motion-states.ts +269 -0
- package/src/particles.ts +323 -0
- package/src/path.ts +124 -0
- package/src/playback-group.ts +143 -0
- package/src/playback.ts +62 -0
- package/src/press.ts +26 -10
- package/src/properties.ts +32 -6
- package/src/reveal.ts +374 -0
- package/src/roll-diff.ts +57 -0
- package/src/roll.ts +515 -0
- package/src/scroll-linked.ts +73 -0
- package/src/sequence.ts +204 -14
- package/src/shimmer.ts +180 -0
- package/src/svg-path.ts +355 -0
- package/src/symbol-effect.ts +226 -0
- package/src/text-layout.ts +228 -0
- package/src/text.ts +279 -0
- package/src/track.ts +347 -12
- package/src/transition.ts +93 -6
- package/src/types.ts +49 -1
- package/src/vue/index.ts +231 -0
- package/src/zoom-native.ts +124 -0
- package/src/zoomable.ts +330 -0
package/src/driver/android.ts
CHANGED
|
@@ -1,11 +1,82 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
androidPlayback,
|
|
3
|
+
androidClockFactory,
|
|
4
|
+
type AndroidPlayback,
|
|
5
|
+
} from './android-playback.js'
|
|
6
|
+
import { isDecorationProperty } from '../decoration.js'
|
|
7
|
+
import {
|
|
8
|
+
syncAndroidDecoration,
|
|
9
|
+
playAndroidDecoration,
|
|
10
|
+
presentedAndroidDecoration,
|
|
11
|
+
} from './android-decoration.js'
|
|
12
|
+
import { Application, Utils, type View } from '@nativescript/core'
|
|
13
|
+
import type { NumericProperty } from '../properties.js'
|
|
14
|
+
import type { Driver } from './index.js'
|
|
15
|
+
import { isColorProperty } from '../color.js'
|
|
16
|
+
import {
|
|
17
|
+
playAndroidColor,
|
|
18
|
+
presentedAndroidColor,
|
|
19
|
+
syncAndroidColor,
|
|
20
|
+
} from './android-color.js'
|
|
4
21
|
|
|
5
22
|
type NativeView = android.view.View
|
|
6
23
|
|
|
24
|
+
type Handle = AndroidPlayback
|
|
25
|
+
|
|
26
|
+
/** Own only layers we create; keep app-configured hardware/software layers and paints intact. */
|
|
27
|
+
function fadeLayer(view: View, nativeView: NativeView): (() => void) | undefined {
|
|
28
|
+
const { View, ViewGroup } = android.view
|
|
29
|
+
if (
|
|
30
|
+
!view.isLoaded ||
|
|
31
|
+
view.nativeViewProtected !== nativeView ||
|
|
32
|
+
!(nativeView instanceof ViewGroup) ||
|
|
33
|
+
nativeView.getChildCount() === 0 ||
|
|
34
|
+
!nativeView.getClipChildren() ||
|
|
35
|
+
!nativeView.isHardwareAccelerated() ||
|
|
36
|
+
nativeView.getLayerType() !== View.LAYER_TYPE_NONE
|
|
37
|
+
)
|
|
38
|
+
return undefined
|
|
39
|
+
|
|
40
|
+
// Do not cache an entire oversized scrolling/content tree into a GPU texture.
|
|
41
|
+
const { widthPixels, heightPixels } = nativeView.getResources().getDisplayMetrics()
|
|
42
|
+
const width = nativeView.getWidth()
|
|
43
|
+
const height = nativeView.getHeight()
|
|
44
|
+
if (width <= 0 || height <= 0 || width > widthPixels || height > heightPixels)
|
|
45
|
+
return undefined
|
|
46
|
+
|
|
47
|
+
nativeView.setLayerType(View.LAYER_TYPE_HARDWARE, null)
|
|
48
|
+
let active = true
|
|
49
|
+
const restore = () => {
|
|
50
|
+
if (!active) return
|
|
51
|
+
active = false
|
|
52
|
+
view.off('unloaded', restore)
|
|
53
|
+
if (nativeView.getLayerType() === View.LAYER_TYPE_HARDWARE) {
|
|
54
|
+
nativeView.setLayerType(View.LAYER_TYPE_NONE, null)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
view.on('unloaded', restore)
|
|
58
|
+
return restore
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A translucent view is drawn into a buffer of its own size, which cuts off children
|
|
63
|
+
* that draw outside it. Fade those children one by one instead.
|
|
64
|
+
*/
|
|
65
|
+
function keepOverflow(nativeView: NativeView) {
|
|
66
|
+
if (
|
|
67
|
+
android.os.Build.VERSION.SDK_INT >= 24 &&
|
|
68
|
+
nativeView instanceof android.view.ViewGroup &&
|
|
69
|
+
!nativeView.getClipChildren() &&
|
|
70
|
+
nativeView.getHasOverlappingRendering()
|
|
71
|
+
) {
|
|
72
|
+
nativeView.forceHasOverlappingRendering(false)
|
|
73
|
+
// The render node only picks the flag up when the view draws again.
|
|
74
|
+
nativeView.invalidate()
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
7
78
|
const accessors: Record<
|
|
8
|
-
|
|
79
|
+
NumericProperty,
|
|
9
80
|
{ get(view: NativeView): number; set(view: NativeView, value: number): void }
|
|
10
81
|
> = {
|
|
11
82
|
opacity: { get: (v) => v.getAlpha(), set: (v, value) => v.setAlpha(value) },
|
|
@@ -18,7 +89,7 @@ const accessors: Record<
|
|
|
18
89
|
rotateY: { get: (v) => v.getRotationY(), set: (v, value) => v.setRotationY(value) },
|
|
19
90
|
}
|
|
20
91
|
|
|
21
|
-
const unit = (property:
|
|
92
|
+
const unit = (property: NumericProperty) =>
|
|
22
93
|
property === 'x' || property === 'y' ? Utils.layout.getDisplayDensity() : 1
|
|
23
94
|
|
|
24
95
|
export function createAndroidDriver(): Driver {
|
|
@@ -32,16 +103,30 @@ export function createAndroidDriver(): Driver {
|
|
|
32
103
|
rotate: View.ROTATION,
|
|
33
104
|
rotateX: View.ROTATION_X,
|
|
34
105
|
rotateY: View.ROTATION_Y,
|
|
35
|
-
} satisfies Record<
|
|
106
|
+
} satisfies Record<NumericProperty, unknown>
|
|
107
|
+
const clock = androidClockFactory()
|
|
36
108
|
const interpolator = new android.view.animation.LinearInterpolator()
|
|
37
109
|
|
|
38
110
|
return {
|
|
39
111
|
now: () => android.os.SystemClock.uptimeMillis(),
|
|
112
|
+
clock,
|
|
113
|
+
control(_view, handle, elapsed, paused, command) {
|
|
114
|
+
;(handle as Handle).control(elapsed, paused, command)
|
|
115
|
+
},
|
|
40
116
|
|
|
41
117
|
play(view, track, _startedAt, onEnd) {
|
|
118
|
+
if (isDecorationProperty(track.property))
|
|
119
|
+
return playAndroidDecoration(view, track, onEnd)
|
|
120
|
+
if (isColorProperty(track.property)) return playAndroidColor(view, track, onEnd)
|
|
42
121
|
const nativeView = view.nativeViewProtected as NativeView
|
|
43
122
|
const scale = unit(track.property)
|
|
44
123
|
|
|
124
|
+
if (track.property === 'rotateX' || track.property === 'rotateY') {
|
|
125
|
+
nativeView.setCameraDistance(
|
|
126
|
+
(view.perspective || 300) * Utils.layout.getDisplayDensity(),
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
|
|
45
130
|
const keyframes = Array.create(android.animation.Keyframe, track.values.length)
|
|
46
131
|
track.values.forEach((value, i) => {
|
|
47
132
|
keyframes[i] = android.animation.Keyframe.ofFloat(track.times[i]!, value * scale)
|
|
@@ -56,6 +141,11 @@ export function createAndroidDriver(): Driver {
|
|
|
56
141
|
nativeView,
|
|
57
142
|
holders,
|
|
58
143
|
)
|
|
144
|
+
let restoreLayer: (() => void) | undefined
|
|
145
|
+
const releaseLayer = () => {
|
|
146
|
+
restoreLayer?.()
|
|
147
|
+
restoreLayer = undefined
|
|
148
|
+
}
|
|
59
149
|
animator.setDuration(Math.max(track.duration, 1))
|
|
60
150
|
animator.setStartDelay(track.delay)
|
|
61
151
|
animator.setInterpolator(interpolator)
|
|
@@ -71,31 +161,129 @@ export function createAndroidDriver(): Driver {
|
|
|
71
161
|
: android.animation.ValueAnimator.RESTART,
|
|
72
162
|
)
|
|
73
163
|
}
|
|
74
|
-
|
|
164
|
+
if (track.property === 'opacity' && track.values.some((value) => value < 1))
|
|
165
|
+
keepOverflow(nativeView)
|
|
166
|
+
accessors[track.property].set(nativeView, track.values[0]! * scale)
|
|
167
|
+
return androidPlayback(
|
|
168
|
+
animator,
|
|
169
|
+
track,
|
|
170
|
+
onEnd,
|
|
171
|
+
() => {
|
|
172
|
+
if (
|
|
173
|
+
track.property === 'opacity' &&
|
|
174
|
+
track.values.some((value) => value !== track.values[0])
|
|
175
|
+
)
|
|
176
|
+
restoreLayer = fadeLayer(view, nativeView)
|
|
177
|
+
},
|
|
178
|
+
releaseLayer,
|
|
179
|
+
)
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
stop(_view, handle) {
|
|
183
|
+
;(handle as Handle).cancel()
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
sync(view) {
|
|
187
|
+
syncAndroidDecoration(view)
|
|
188
|
+
syncAndroidColor(view)
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
elapsed: (handle) => (handle as Handle).elapsed(),
|
|
192
|
+
|
|
193
|
+
presented(view, property) {
|
|
194
|
+
if (isDecorationProperty(property))
|
|
195
|
+
return presentedAndroidDecoration(view, property)
|
|
196
|
+
if (isColorProperty(property)) return presentedAndroidColor(view, property)
|
|
197
|
+
const nativeView = view.nativeViewProtected as NativeView | undefined
|
|
198
|
+
return nativeView ? accessors[property].get(nativeView) / unit(property) : undefined
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
layoutFrame(view) {
|
|
202
|
+
const native = view.nativeViewProtected as android.view.View | undefined
|
|
203
|
+
if (!native) return undefined
|
|
204
|
+
const dip = Utils.layout.toDeviceIndependentPixels
|
|
205
|
+
return {
|
|
206
|
+
x: dip(native.getLeft()),
|
|
207
|
+
y: dip(native.getTop()),
|
|
208
|
+
width: dip(native.getWidth()),
|
|
209
|
+
height: dip(native.getHeight()),
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
afterLayout(view, callback) {
|
|
214
|
+
const native = view.nativeViewProtected as android.view.View
|
|
215
|
+
const observer = native.getViewTreeObserver()
|
|
216
|
+
let active = true
|
|
217
|
+
const detach = () => {
|
|
218
|
+
if (!active) return
|
|
219
|
+
active = false
|
|
220
|
+
if (observer.isAlive()) observer.removeOnPreDrawListener(listener)
|
|
221
|
+
else {
|
|
222
|
+
const current = native.getViewTreeObserver()
|
|
223
|
+
if (current.isAlive()) current.removeOnPreDrawListener(listener)
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const listener = new android.view.ViewTreeObserver.OnPreDrawListener({
|
|
227
|
+
onPreDraw() {
|
|
228
|
+
if (active) {
|
|
229
|
+
detach()
|
|
230
|
+
callback()
|
|
231
|
+
}
|
|
232
|
+
return true
|
|
233
|
+
},
|
|
234
|
+
})
|
|
235
|
+
observer.addOnPreDrawListener(listener)
|
|
236
|
+
return detach
|
|
237
|
+
},
|
|
238
|
+
|
|
239
|
+
after(ms, callback) {
|
|
240
|
+
// A native marker follows animator duration scale, including changes during playback.
|
|
241
|
+
// Only completion crosses the bridge; there is no JavaScript update listener.
|
|
242
|
+
const values = Array.create('float', 2)
|
|
243
|
+
values[0] = 0
|
|
244
|
+
values[1] = 1
|
|
245
|
+
const marker = android.animation.ValueAnimator.ofFloat(values)
|
|
246
|
+
marker.setDuration(ms)
|
|
247
|
+
let active = true
|
|
248
|
+
marker.addListener(
|
|
75
249
|
new android.animation.Animator.AnimatorListener({
|
|
76
250
|
onAnimationStart() {},
|
|
77
251
|
onAnimationRepeat() {},
|
|
78
|
-
onAnimationCancel() {
|
|
252
|
+
onAnimationCancel() {
|
|
253
|
+
active = false
|
|
254
|
+
},
|
|
79
255
|
onAnimationEnd() {
|
|
80
|
-
|
|
256
|
+
if (!active) return
|
|
257
|
+
active = false
|
|
258
|
+
callback()
|
|
81
259
|
},
|
|
82
260
|
}),
|
|
83
261
|
)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
262
|
+
marker.start()
|
|
263
|
+
return () => {
|
|
264
|
+
active = false
|
|
265
|
+
marker.cancel()
|
|
266
|
+
}
|
|
88
267
|
},
|
|
89
268
|
|
|
90
|
-
|
|
91
|
-
|
|
269
|
+
reducedMotion() {
|
|
270
|
+
// Remove animations sets the animator duration scale to zero.
|
|
271
|
+
if (android.os.Build.VERSION.SDK_INT >= 26)
|
|
272
|
+
return !android.animation.ValueAnimator.areAnimatorsEnabled()
|
|
273
|
+
const { Global } = android.provider.Settings
|
|
274
|
+
return (
|
|
275
|
+
Global.getFloat(
|
|
276
|
+
Utils.android.getApplicationContext().getContentResolver(),
|
|
277
|
+
Global.ANIMATOR_DURATION_SCALE,
|
|
278
|
+
1,
|
|
279
|
+
) === 0
|
|
280
|
+
)
|
|
92
281
|
},
|
|
93
282
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
283
|
+
watchReducedMotion(callback) {
|
|
284
|
+
// Android has no broadcast for the animator scale; it can only change in Settings.
|
|
285
|
+
Application.on(Application.resumeEvent, callback)
|
|
286
|
+
return () => Application.off(Application.resumeEvent, callback)
|
|
97
287
|
},
|
|
98
|
-
|
|
99
|
-
after,
|
|
100
288
|
}
|
|
101
289
|
}
|
package/src/driver/index.ts
CHANGED
|
@@ -1,19 +1,54 @@
|
|
|
1
|
+
import type { PlaybackClock, PlaybackCommand } from '../playback.js'
|
|
1
2
|
import { isAndroid, type View } from '@nativescript/core'
|
|
2
3
|
import type { Property } from '../properties.js'
|
|
3
4
|
import type { Track } from '../track.js'
|
|
4
5
|
import { createAndroidDriver } from './android.js'
|
|
5
6
|
import { createIOSDriver } from './ios.js'
|
|
6
7
|
|
|
8
|
+
export interface LayoutFrame {
|
|
9
|
+
x: number
|
|
10
|
+
y: number
|
|
11
|
+
width: number
|
|
12
|
+
height: number
|
|
13
|
+
}
|
|
14
|
+
|
|
7
15
|
export interface Driver {
|
|
8
16
|
/** Milliseconds, on the clock the platform's animations run on. */
|
|
9
17
|
now(): number
|
|
10
18
|
/** Starts the track at `startedAt + track.delay` and calls `onEnd` once, however it ends. */
|
|
11
|
-
play(
|
|
19
|
+
play(
|
|
20
|
+
view: View,
|
|
21
|
+
track: Track,
|
|
22
|
+
startedAt: number,
|
|
23
|
+
onEnd: (finished?: boolean) => void,
|
|
24
|
+
): unknown
|
|
12
25
|
stop(view: View, handle: unknown): void
|
|
26
|
+
/** A native elapsed-time marker when system animation speed affects time. */
|
|
27
|
+
clock?(duration: number): PlaybackClock
|
|
28
|
+
/** Move only this native track to an elapsed time, optionally holding it. */
|
|
29
|
+
control?(
|
|
30
|
+
view: View,
|
|
31
|
+
handle: unknown,
|
|
32
|
+
elapsed: number,
|
|
33
|
+
paused: boolean,
|
|
34
|
+
command?: PlaybackCommand,
|
|
35
|
+
): void
|
|
36
|
+
/** Reapply native presentation after a Core model write rebuilds its drawable/layers. */
|
|
37
|
+
sync?(view: View, excluding?: Property): void
|
|
38
|
+
/** Track time, including its delay, when the native clock differs from `now()`. */
|
|
39
|
+
elapsed?(handle: unknown): number
|
|
13
40
|
/** The value on screen, when the platform knows it better than the track does. */
|
|
14
41
|
presented(view: View, property: Property): number | undefined
|
|
15
|
-
/** Calls back after `ms`
|
|
42
|
+
/** Calls back after `ms` of animation time, respecting platform speed settings. */
|
|
16
43
|
after(ms: number, callback: () => void): () => void
|
|
44
|
+
/** Untransformed native layout bounds in parent DIPs. */
|
|
45
|
+
layoutFrame?(view: View): LayoutFrame | undefined
|
|
46
|
+
/** One callback after layout, before drawing; caller requests layout and owns cancellation. */
|
|
47
|
+
afterLayout?(view: View, callback: () => void): () => void
|
|
48
|
+
/** The platform's accessibility setting: Reduce Motion on iOS, Remove animations on Android. */
|
|
49
|
+
reducedMotion?(): boolean
|
|
50
|
+
/** Calls back when that setting may have changed; returns a cleanup function. */
|
|
51
|
+
watchReducedMotion?(callback: () => void): () => void
|
|
17
52
|
}
|
|
18
53
|
|
|
19
54
|
export function after(ms: number, callback: () => void) {
|