工作原理
当动画开始时,Jolt 解析起始值并计算源曲线。数字弹簧、衰减和补间使用 自适应关键帧,将细节集中在线性插值需要的地方。创作的关键帧时间保持精确,直线数字段仅保留其端点。春季结算、中断速度和序列到达保留了之前的计时合同。颜色混合和组合动画值映射保持其单独的采样策略。
样本一口气上平台:
- iOS:视图图层上的每个属性一个
CAKeyframeAnimation(opacity、transform.translation.x、transform.scale.y、transform.rotation.z...)。 Core Animation 组合它们,因此x和scale可以属于不同的动画,并在渲染服务器中播放它们。 - Android:在视图的
alpha、translationX、scaleY、rotation上,每个属性有一个ObjectAnimator,带有Keyframe和线性插值器...
Solid 颜色 在 iOS 上使用 CGColor 关键帧,并通过 Android 上的原生 Java 目标使用 int 关键帧。 iOS 文本使用 UILabel Alpha 遮罩,因此在颜色层动画时字形位置保持固定。
播放前,会像 view.animate() 一样先将最终值写入 NativeScript 视图,因此动画运行时,view.translateX 已经保存目标值。停止时则写回屏幕上当前显示的值。
每个运行属性都会记住其曲线和开始时间。在 Android 上,中断读取显示值和动画师的当前播放时间,因此继承的速度遵循系统的动画师持续时间比例。早春到来使用仅带有完成回调的原生计时标记;其他序列在原生完成的基础上前进。延迟、重复和禁用动画遵循相同的平台时钟,无需每帧运行 JavaScript。
animateSize() 具有不同的执行路径:实际尺寸和文本回流需要 NativeScript 每帧在 UI 线程上进行测量/布局。其库拥有的帧回调运行 JavaScript;它不是渲染服务器播放。 animateLayout() 仍然测量一次并使用原生变换轨道。选择加入动画值订阅者、滚动输入和时间线回调激活也保留其记录的 JS 成本。
springValue() 使用单独的实时路径:持久 C/Java spring 状态、共享原生显示回调和原生映射/层组合。它不会在每次目标更新时重建关键帧动画。这些回调共享 UI 线程;它们不是与繁忙的 JavaScript 渲染服务器隔离。固定目标动画保留上述采样路径。
可选的 gestures() 条目可识别平移/收缩/旋转并以原生代码协调 ScrollView。保留的输出驱动绑定,无需每次移动的 JS 回调;请求的回调和现有的 Core 侦听器仍然执行 JavaScript。识别和实时弹簧共享 UI 线程。
测试
测试使用自己的时钟针对假平台驱动程序 (test/helpers.ts) 运行引擎:它记录它将播放的关键帧,并在时钟结束时结束它们。 iOS 和 Android 驱动程序根据平台类型进行类型检查。
原生 CI 装置还读取 iOS 和 Android 上的表示层/视图值,检查实际尺寸和实时跟随者生命周期,并验证故意的几何故障。 C 和 Java spring 内核在确定性轨迹测试中进行编译和比较。