摘要:Property(属性及方法)组中的方法和属性,可用于查看或操作属性的关键帧、取值、时间采样、循环与平滑等方面的信息。通过这些方法,可以实现复杂的动画逻辑和自定义行为,例如通过 loop* 系列方法重复关键帧动画,通过 wiggle 或 smooth 制作随机
Property(属性及方法)组中的方法和属性,可用于查看或操作属性的关键帧、取值、时间采样、循环与平滑等方面的信息。通过这些方法,可以实现复杂的动画逻辑和自定义行为,例如通过 loop* 系列方法重复关键帧动画,通过 wiggle 或 smooth 制作随机或平滑的动态效果,通过 valueAtTime 和 velocityAtTime 等进行更精确的时间操作,等等。
value
获取属性在当前时间的值。
返回值 :Number、Array 或 String,具体取决于属性类型。例如,位置属性通常返回二维或三维数组,旋转属性返回数值,不透明度返回数值,文本属性可能返回字符串。
应用:
// 示例 1:获取当前属性并加以改动value + 10;//示例 2:使用另一个属性进行混合value * thisComp.layer("Control").effect("滑块控制")("滑块");valueAtTime(t)
获取属性在指定时间点的值。
参数 :
t :Number,要采样的时间,以秒为单位。
返回值 :与 value 相同类型,可以是 Number、Array 或 String,具体取决于属性类型。
应用:
// 示例 1:假设在 0、1、2、3 秒处设置了四个关键帧,随机在这四个时间点的关键帧中选择属性值。randomValue = Math.floor(Math.random * 4);ransform.rotation.valueAtTime(randomValue);// 示例 2:让属性等于1秒前的值valueAtTime(time - 1);// 示例 3:为形状图层设置“旋转”关键帧动画并添加表达式,。之后,复制图层多次。valueAtTime(time - index/10)velocity
获取属性在当前时间的“速度”或“速率”值。
对于时域属性(如透明度),它表示数值随时间的变化速率。
对于空间属性(如位置),它表示切线向量(X、Y、Z 的变化速率)。
返回值 :Number 或 Array 。如果是数值属性(如不透明度),返回一个数值;如果是空间属性(如位置),返回一个与其维度对应的数组。结果与属性的维度相同,且根据运动方向会出现负值的速度。
应用:
// 示例 1:返回在 x 轴上的运动速度thisComp.layer("mediaTEA").transform.position.velocity[0]// 示例 2:可以根据当前属性的速度进一步调整动画,从而实现惯性或动力学效果。var v = velocity;value + v; // 根据速度来改变属性,比如给位置增加动力学效果velocityAtTime(t)
获取属性在指定时间点的“速度”或“速率”值。
参数 :
t :Number,要采样的时间,以秒为单位。
返回值 :与 velocity 返回相同类型,可为 Number 或 Array,取决于属性类型。
应用:
// 示例 1:取比当前时间早 0.1 秒处的速度,用于延迟动画velocityAtTime(time - 0.1);// 示例 2:检测一段时间前属性的变化速率prevVel = velocityAtTime(time - 0.5);// 如果在 0.5 秒前速度较大,当前做某些处理preVelspeed
获取属性在当前时间的“速度标量”,即一个正数值表示属性变化的速率。仅适用于空间属性(如位置) 。
返回值 :Number,表示属性在当前时间的变化速率(标量),不含方向信息。
应用:
// 示例 1:让缩放属性随着位置属性的速度而变化,速度越快,变得越小。var s = position.speed/20;value - [s,s]// 示例 2:在速度较小时添加缓动if (speedspeedAtTime(t)
获取属性在指定时间点的速度标量(正数),仅适用于空间属性(如位置)。
参数 :
t :Number,要采样的时间,以秒为单位。
返回值:Number,表示指定时间点的属性变化速率。
应用:
// 示例 1:统计过去某时刻的运动速度var spd = speedAtTime(time - 0.2);// 根据过去的速度决定当前操作spd > 10 ? 100 : 50;// 示例 2:将属性按照过去速度的2倍进行延后动画效果,适用于惯性或拖尾动画speedAtTime(time - 0.1) * 2;wiggle(freq, amp, octaves=1, amp_mult=0.5, t=time)
让属性值随时间按指定的频率和幅度进行随机变化。
参数 :
freq :Number,频率,即,每秒抖动的次数。
amp :Number,振幅,即,每次抖动的最大偏移量。
基于原属性值进行正、负摆动。比如,旋转属性值为 100,当 amp 设为 50 时,旋转属性值将在 50 ~ 150 之间随机摆动。
octaves :可选,Number,叠加噪声的层数,默认值 1。
用于控制抖动的复杂程度。每增加一个 octave,都会在 freq 上叠加更高频率的细节噪声,使得 wiggle 看起来更不规则。
amp_mult :可选,Number,叠加噪声衰减,默认值 0.5。
指的是每增加一层 octave,振幅递减的倍数。范围在 0 ~ 1 之间。接近 1 时,细节越多,变化更突兀。接近 0 时则细节越少,抖动更平滑。
t :可选,Number,计算起点的时间,默认为 time,表示随时间变化。
如果希望输出成为在不同时间采样的属性值的摆动,请使用此参数。比如设为 5 时,将仅使用第 5 秒的属性值来摆动。
返回值: 与属性的类型一致,可为 Number 或 Array。
应用:
//示例 1:每秒5次抖动,抖动幅度约20单位,可用于位置等二维或三维属性 wiggle(5, 20); //示例 2:按相同值摆动两个维度v = wiggle(5, 10); [v[0], v[0]] //示例 3:只在 Y 轴上摇摆w = wiggle(3,50); [value[0],w[1]]; //示例 4:每秒产生约 5 次摆动,平均大小约 20 像素。除了主要摆动之外,其他两个级别的详细摆动发生的频率为每秒 10 次和 20 次摆动,各自的大小为 5 和 10 像素position.wiggle(5, 20, 3, .5)temporalWiggle(freq, amp, octaves=1, amp_mult=0.5, t=time)
temporalWiggle 并非对属性的值进行抖动,而是对时间采样进行抖动。也就是说,属性本身必须已经动画化,否则无意义。
参数 :
freq :频率,即,每秒抖动的次数。
amp :振幅,表示时间范围。
octaves :附加噪声层数。
amp_mult :每增加一层噪声,振幅的递减倍数。
t :可选,时间起点,默认当前时间 time。
返回值 : 与属性类型相同,可为 Number 或 Array 。 因为它采样了“随机化时间”的属性值。
应用:
//示例 1:只更改采样时间而不是值。scale.temporalWiggle(5, .2)//示例 2:在关键帧基础上随机化时间采样scale.temporalWiggle(5, .2);// 示例 3:让透明度在关键帧时间周围随机波动opacity.temporalWiggle(2, 0.5);smooth(width=.2, samples=5, t=time)
平滑属性在一定时间范围内的值,过滤掉短时尖峰。
参数 :
width :Number,以秒为单位的时间范围,默认为 0.2。
samples :Number,取样次数,默认为 5。为更大的平滑度可使用更大的值,但性能会下降。
t :Number,可选,表示时间起点,默认当前时间 time。
返回值 : 与属性和类型一致,返回平滑后的值,可能是 Number 或 Array 。
应用:
//示例 1:在 0.1 秒的时间窗口内,取 5 次样本,对位置进行平均过滤,减少抖动position.smooth(.1, 5)//示例 2:对音频振幅进行平滑,防止过于尖锐的音频峰值影响动画var amp = thisComp.layer("音频振幅").effect("两个通道")("滑块");amp.smooth(0.2, 5);loopIn(type="cycle", numKeyframes=0)
用于设置关键帧动画的入点循环。即,从图层的入点开始重复播放指定的动画段,直到第一个关键帧。
指定动画段的界定方法是:从第一个关键帧开始数,比如 loopIn("cycle", 1) 表示从第 1 个关键帧到第 2( numKeyframes + 1 )个关键帧之间为要重复播放的指定动画段。
参数 :
type :String,可选,指定循环方法,默认值为"cycle"。
-- "cycle" : 重复播放指定动画段,类似于 4321 4321 的循环播放。
-- "pingpong" :往返 播放指定动画段,类似于 1234 4321 的循环播放。
-- "offset" :将第一个关键帧与 第二个关键帧的变化(偏移)值重复叠加到每次循环,从入点开始并从最后一次循环开始播放,类似于 (1+1.3n)(1+1.2n)(1+1.1n)(1)的递减循环。
-- "contiune" :此方法下,无 numKeyframes 参数,动画会按照第一个动画段的速度和方向并以其变化量(前面两个关键帧)持续循环,从入点开始并从最后一次循环开始播放,类似于 (1+1.3)(1+1.2)(1+1.1)(1)。
numKeyframes :Number,可选,指定要参与循环的动画段数,0(默认)表示从第 1 个关键帧到最后一个关键帧之间的动画段。1 表示从第 1 个关键帧到第 2 个关键帧之间的 1 段动画,2 表示从第 1 个关键帧到第 3 个关键帧之间的 2 段动画。
返回值:与属性类型一致,返回基于指定循环规则的属性值。
应用:
为确保入点循环动画结束后与第一个关键帧无缝衔接,loopIn 会根据参数的设置计算出入点时属性的值。
//示例 1:以下写法,意义一致。不断重复从第一个关键帧到最后一个关键帧的动画loopIn(type="cycle", numKeyframes=0);loopIn(type="cycle");loopIn("cycle");loopIn;//示例 2:从图层入点开始,循环播放第1个关键键到第2个关键帧之间动画段落loopIn("cycle", 1);//示例 3:从图层入点开始,往返播放第1个关键键到第3个关键帧之间动画段落loopIn("pingpong",2);loopOut(type="cycle", numKeyframes=0)
用于设置关键帧动画的出点循环。即,从最后一个关键帧开始重复播放指定动画段,直到图层出点。
指定动画段的界定方法是:从最后一个关键帧往回数,比如 loopOut("cycle", 1) 表示从倒数第 2 (numKeyframes + 1)个关键帧到最后一个关键帧之间为要重复播放的指定动画段。
参数:
type :指定循环方法,默认值为"cycle"。
-- "cycle" :重复播放指定动画段,类似于 1234 1234 的循环。
-- "pingpong" :往返播放指定动画段,类似于 4321234 的来回循环。
-- "contiune" :此方法下,无 numKeyframes 参数。以最后一个动画段的速度和方向并以其变化量(最后两个关键帧)持续循环。即,类似于 1234 (4+4.1)(4+4.2)(4+4.3) ... 的重复。
-- "offset" :第一次循环时会叠加从倒数第 2 个关键帧到最后一个关键帧的变化(偏移)值,第二次循环时再叠加,依次类推,循环动画遵循从倒数第 2 个关键帧到最后一个关键帧同样的速度与方向,类似于 1234(4+4.1n)(4+4.2n)(4+4.3n)...的递增循环。
numKeyframes :Number,可选,指定要参与循环的动画段数,0(默认)表示从第 1 个关键帧到最后一个关键帧之间的动画段。1 表示从倒数第 2 个关键帧到最后一个关键帧之间的 1 段动画,2 表示从倒数第 3 个关键帧到最后一个关键帧之间的 2 段动画。
返回值:与属性类型一致,返回基于指定循环规则的属性值。
应用:
// 示例 1:循环倒数第2个关键帧到最后一个关键帧之间的动画段落loopOut("cycle", 1);// 示例 2:往返循环所有关键帧动画段loopOut("pingpong");// 示例 3:按最后一个动画段的方向和速度持续循环loopOut("continue")// 示例 3:按最后两个动画段递增循环loopOut("offset",2)loopInDuration(type="cycle", duration=0)
用于设置关键帧动画的入点循环。即,从图层的入点开始重复播放指定动画段,直到第一个关键帧。
指定动画段的界定方法是:从第1个关键帧开始计算,比如 loopInDuration("cycle",1),表示从第 1 个关键帧到其后的 1 秒处的范围作为要重复播放的指定动画段。
参数:
type :String,选项同 loopIn 方法。
duration :Number,要循环的时间长度,以秒为单位。默认值为 0,意味着要重复的指定动画段是,从第 1 个关键帧到图层出点。为 2 时,表示第 1 个关键帧到它之后两秒的范围。
返回值:与属性类型一致,返回基于指定循环规则的属性值。
应用:
为确保入点循环动画结束后与第一个关键帧无缝衔接,loopInDuration 会根据参数的设置计算出入点时属性的值。
// 示例 1:重复播放从第一个关键帧开始的 1 秒范围内的动画段loopInDuration("cycle", 1);// 示例 2:将第一个关键帧开始的 2 秒范围内的动画段落进行 “乒乓” 循环loopInDuration("pingpong", 2);loopOutDuration(type, duration)
用于设置关键帧动画的出点循环。即,从最后一个关键帧开始重复播放指定动画段,直到图层出点。
指定动画段的界定方法是:从最后一个关键帧往回计时,比如 loopOutDuration("cycle", 2) 表示从最后一个关键帧开始倒数 2 秒处到最后一个关键帧之间作为要重复播放的指定动画段。
参数:
type :String,选项同 loopOut 方法。
duration :Number,要循环的时间长度,以秒为单位。默认值为 0,意味着要重复的指定动画段是,从图层入点到最后一个关键帧。为 1 时,表示从最后一个关键帧倒数 1 秒处到最后一个关键帧之间的范围。
返回值:与属性类型一致,返回基于指定循环规则的属性值。
应用:
// 示例 1:反复循环最后一个关键帧往前 1 秒区间的动画段loopOutDuration("cycle", 1);// 示例 2:将最后一个关键帧往前 2 秒区间的动画段按递增方式进行循环loopOutDuration("offset", 2);key(index)
获取属性在某个关键帧(或标记)的信息对象。
参数:
index :Number,指定关键帧的序号(从 1 开始)。
返回值:Object。对于标记(Marker)属性,会返回 MarkerKey 对象;对于数值属性,会返回 Key 对象。
应用:
//示例 1:返回位置属性的第一个关键帧的时间transform.position.key(1).time;//示例 2:返回位置属性的第一个关键帧的值thisLayer.position.key(1).value//示例 3:图层的第2个标记的时间thisLayer.marker.key(2).timekey(markerName)
仅适用于标记属性,根据标记名来获取对应的 MarkerKey 对象。
参数:
markerName :String,标记的名称。其实就是标记的注释内容。
返回值:返回一个 MarkerKey 对象,包含此标记的信息(如时间、注释等)。
应用:
//示例:获取名为 “图层标记1” 的时间thisLayer.marker.key("图层标记1").timenearestKey(t)
获取在指定时间点 t 附近的关键帧(或标记)对象。即找到最接近 t 时刻的关键帧或标记。
参数:
t :Number,指定时间点,以秒为单位。
返回值:对于标记(Marker)属性,会返回 MarkerKey 对象;对于数值属性,会返回 Key 对象。
应用:
// 示例 1:获得最接近1秒时的关键帧的值thisLayer.transform.position.nearestKey(1).value// 示例 2:持续获得最接近的标记的注释thisLayer.marker.nearestKey(time).comment// 示例 3:检测是否接近某个关键帧,并作相应处理var result = value; // 默认使用当前属性值if (thisProperty.numKeys > 0) {var nKey = thisProperty.nearestKey(time); // 获取最近的关键帧if (Math.abs(nKey.time - time)numKeys
返回某个属性的关键帧总数,或者对于标记属性则返回标记的总数。
返回值:Number,表示关键帧或标记数量。
应用:
// 示例 1:返回当前属性的关键帧数目x = thisProperty.numKeys;// 示例 2:循环读取所有关键帧的时间并把它们拼接为字符串var n = transform.position.numKeys;var times = "";for (var i = 1; i 0) {// 有关键帧时的处理}else {// 没有关键帧时的处理}name
获取当前属性或属性组的名称字符串。
返回值:String,当前属性或属性组的名称。
应用:
// 示例 1:输出当前属性的名称thisProperty.name;// 示例 2:根据属性名称来执行不同的表达式逻辑if(transform.rotation.name.trim === "旋转"){// 如果名称是 "旋转",执行某些操作}检查属性是否在当前上下文中处于激活状态。
返回值:Boolean。true 表示激活,false 表示未激活。
应用:
// 示例:thisProperty.activeenabled
检查属性是否启用。
返回值:Boolean。true 表示启用,false 表示禁用。
应用:
// 示例:thisComp.layer("形状图层 1").effect("高斯模糊")("重复边缘像素").enabledpropertyGroup(countUp=1)
获取相对于当前属性所在的父级(或更高层级)属性组对象。适用于在表达式中进行层级引用时使用。
参数:
countUp :Number,表示向上查找多少级的属性组。默认值为 1,表示向上查找一层。为 2 时返回其上一级的属性组(上二级对象),以此类推。
返回值:返回一个 Group 对象,表示属性所处的父级属性组。
应用:
//示例 1:propertyGroup 的 numProperties 方法返回属性组中属性的数目。var pGroup = thisProperty.propertyGroup(1);pGroup.numProperties;//示例 2:可用于在表达式中相对地引用到父级或更高层级的属性,适合在复杂图层层级里。var pGroup = thisProperty.propertyGroup(2);pGroup.transform.rotationpropertyIndex
返回当前属性在其父属性组中的索引值(以 1 为开始)。
返回值:Number,表示当前属性在父属性组中的位置索引。
应用:
//示例 1:旋转属性所在上级对象依次为:变换组(1),椭圆 1 (2),内容(3) r = thisComp.layer("形状图层 1").content("椭圆 1").transform.rotationr.propertyGroup(2).propertyIndex; //椭圆 1 在“内容” 里的序号 //提示 :在图层对象(最高级别)里面的“内容” 序号总为 2,因为它前面还有一个隐藏的 Marker 属性组。//示例 2:输出当前属性在同一级属性列表中的位置var idx = thisComp.layer("形状图层 1").content("椭圆 1").transform.rotation.propertyIndex;var gName =thisComp.layer("形状图层 1").content("椭圆 1").transform.rotation.propertyGroup(1).name;"此属性是 No. " + idx + " 在" + gName + "属性组中";“点赞行美意,赞赏是鼓励”
来源:群星满天空