跳过主要内容

track

返回值 : VelocityTracker

一个负责执行跟踪的VelocityTracker对象。


细节

允许你自动跟踪特定属性的速度,这样InertiaPlugin的tween就可以在内部访问这些数据,而无需手动计算并逐个提供给每个tween。例如,假设有一个对象,用户通过拖动与之交互,或者它正在被tween处理,然后在某个时刻你想创建一个throwPropstween来平滑地延续该动作并缓停下来。通常情况下,你需要编写自己的跟踪代码来记录该对象的xy属性和时间戳,以便在需要将数据velocity提供给throwPropstween时能有必要的数据进行计算。但让我们面对现实:手动操作起来会很麻烦,而这正是track()方法存在的原因。

只需传入目标以及你希望跟踪的其属性逗号分隔列表即可,如下所示:

InertiaPlugin.track(obj, "x,y");

然后,在核心tween引擎每次更新(以你所运行的任何帧率)时,都会记录xy值(或你定义的任意属性)及其时间戳(它最多保留2个值,并不断覆盖之前的值,因此不用担心内存积压)。这甚至适用于基于函数的属性如getter和setter。

接着,在至少经过100毫秒且核心引擎经历了2次“tick”(以确保已记录一些数据)之后,你可以创建throwProps补间动画,并省略掉velocity值,它会在内部自动为你填充这些值。例如:

//first, start tracking "x" and "y":
InertiaPlugin.track(obj, "x,y");

//then, after at least 100ms, let's smoothly tween to EXACTLY x:200, y:300
gsap.to(obj, {duration: 2, throwProps: {x: {end: 200}, y: {end: 300}}, ease: "Strong.easeOut"});

//and if you want things to use the defaults and have obj.x and obj.y glide to a stop based on the velocity rather than setting any destination values, just use "auto":
gsap.to(obj, {duration: 2, throwProps: {x: "auto", y: "auto"}, ease: "Strong.easeOut"});

注意到"auto"在你跟踪属性的同时也是一个有效的选项,但这只适用于被跟踪的属性。

可以跟踪哪些类型的属性?

几乎任何对象的数字类型属性都可以被跟踪,包括基于函数的属性。比如:obj.x或者obj.rotation或者甚至obj.myCustomProp()操作的实例。实际上,对于以单词“get”或“set”开头的 getter 和 setter 方法(例如getCustomProp()setCustomProp()),它会自动找到对应的同名方法并正确使用getter,因此你可以跟踪getter或setter,它们都能正常工作。但是,你无法跟踪诸如directionalRotation, autoAlpha,或者physics2D这样的自定义插件相关值不能被跟踪,因为它们并不是对象的真实属性。你应该跟踪那些插件所影响的真实属性,比如:rotation, alpha, x,或者y.

重要

当不再需要跟踪某些untrack()属性时,你应该停止跟踪以最大限度提升性能并确保资源得到释放以便垃圾回收。要取消跟踪,只需使用untrack()方法快速转换任何坐标。