【AE表达式】更好的动画时间控制
对于一个兼职程序员的动画设计师(实际上就是个会 AE 的码农,还是二手的)来说,使用关键帧来设置动画是比较少的情况,虽然一开始操作的时候,使用关键帧设置可以快速上手粗略的调整出想要的动作,但是在项目实际执行过程中总是不免改来改去,关键帧打多了,修改起来就如同地狱一般。
![](/assets/blank.gif)
举一个例子,如果上面的这个动画要调整动画进入的持续时间,你要怎么修改?因为这里面实际包含了五组动画依次执行:
- 圆点缩放进入;
- 两个圆点水平位置拉开;
- 直线变长;
- 中文标题进入;
- 英文标题进入。
如果使用关键帧,并且这些属性分布在不同的图层,再去调整它们会是灾难性的,而且这里的插值还不是线性的,而是 easeOut,极有可能在操作的时候,插值方式自己发生改变。作为一个二手码农,一定要多用表达式做动画,因为表达式更具有复用性。
温馨提示:这篇教程里面不需要太多数学知识了,所以放心玩儿吧!
先看时间线,有一个大概的了解(一个关键帧也没打!):
![](/assets/blank.gif)
图形动画都在一个形状图层里面,时间线设置了合成 Marker,这个区间标记方法是之前一篇文章有同学在评论中问过,你可以设置一个标记,然后按住 Alt 拖拽成区间标记,通过表达式可以读取 time 和 duration 属性,time 就是开始时间,duration 就是持续时间,没有结束时间,因为结束时间 = time + duration,时间单位为秒。
通过这两属性可以设置总体的动画进入时间,还有持续时间,然后每一个动作的执行时间使用 duration 的百分比来控制。
![](/assets/blank.gif)
首先看两个圆点。在形状图层添加两个表达式控制效果,它并不产生实际效果,只是用来为表达式提供索引的值,这里使用的是滑块控制,它可以设置单一维度的值。
![](/assets/blank.gif)
圆点的缩放动画是第一个动画,就是出现的时候先让它从无到有,直接看代码:
![](/assets/blank.gif)
// 读取合成 marker 的开始时间,作为动画的开始
let _start = thisComp.marker.key(1).time
// 读取合成 marker 的持续时间
let _duration = thisComp.marker.key(1).duration
// easeOut(t, tMin, tMax, value1, value2) 是插值方法,_start 就是当前动画开始的时间(tMin)
// _duration * .05 就是这个动画持续的时间,它的意思是按照总动画时长的百分之五执行
// 然后需要加上开始时间 _start 才能得到当前动画的结束时间(tMax)
// 参数 t = time 即保持与合成时间同步
// value1 设置为 0,作为第一个关键帧,第二个关键帧直接使用当前设置的值
// 这样就可以不需要设置关键帧,直接设定结束的值就可以
easeOut(time, _start, _start + _duration * .05, 0, value)
在椭圆路径的大小属性上调用的时候,因为是一个正圆形,因此可以直接简写为:
// Array(2) 即建立一个长度为 2 的空数组,然后使用 fill() 方法填充值为上面设定的值
// 将插值方法写在索引值里面也是避免每一次引用都要重新写一次,非常方便
Array(2).fill(effect("圆点尺寸")("滑块"))
直线动画中,直线延长的时候,两个圆点的位置也同步变化,实际上是圆点位置变化生成了一条直线。先看设置:
![](/assets/blank.gif)
let _start = thisComp.marker.key(1).time
let _duration = thisComp.marker.key(1).duration
// 这个动画紧接着上一个动画执行,然后在 35% 处结束
// 线长的取值能容纳文本就可以了,而且可以根据不同的文本字符数量实际调整
easeOut(time, _start + _duration * .05, _start + _duration * .35, 0, value)
AE 比较麻烦的一点是变量作用域比较小,只能在当前属性表达式中调用,一旦跨属性,则需要重新定义,当然之前也讲过一些全局变量的设置方法,但是实测中稳定性并不是很好,坑比较多。
下面我们来看看两个圆点和直线路径的生成方式:
![](/assets/blank.gif)
两个圆点使用了中继器,原始的圆点从原点向左水平运动:
[effect("线长度")("滑块").value * -0.5, 0]
中继器复制的圆点以原始路径为参照,所以它距离原始路径的距离始终等于设置的“线长度”,因此要向右移动:
[effect("线长度")("滑块").value, 0]
直线路径使用 Path createPath() 方法绘制,路径的两个点分别是两个圆点的位置:
![](/assets/blank.gif)
// 第一个点是圆点的原始路径位置,第二个点是以原点为中心的镜像,
// 因为 y 值一直设置为 0 ,所以直接使用矢量数学方法中的矢量乘法 mul() 方法
createPath(points = [content("圆点").content("椭圆路径 1").position, mul(content("圆点").content("椭圆路径 1").position, -1)], inTangents = [], outTangents = [], isClosed = false
)
描边宽度设置为原点尺寸的 10%(这个不重要,你愿意怎么设置都可以):
effect("圆点尺寸")("滑块").value * .1
到这里,所有图形动画设置完成,占用动画成体时长的 35%。
![](/assets/blank.gif)
主标题文本动画是按字符,每个字位置向上运动到目标位置,文本动画的设置方式比较简单,只需要设置偏移位置,然后使用范围选择器就可以完成。
let _start = thisComp.marker.key(1).time
let _duration = thisComp.marker.key(1).duration
// 35% 至 75%
easeOut(time, _start + _duration * .35, _start + _duration * .75, 0, value)
便宜位置使用了文本字体尺寸做了一个简单的处理,因为大部分文本的基线位置并不在正下方,因此乘以 1.25 的偏移系数可以避免错误。
[0, text.sourceText.style.fontSize * 1.25]
动画做好以后,还需要使用蒙版隐藏直线下面的部分,蒙版一般我习惯用形状图层而非路径蒙版,主要还是设置比较方便,你可以像这样直接使用表达式设置参数:
![](/assets/blank.gif)
// 蒙版大小为画面的一半高度
[thisComp.width, thisComp.height * .5]
然后调整一下位置:
[0, thisComp.height * -.25]
![](/assets/blank.gif)
![](/assets/blank.gif)
英文标题的蒙版与上面相同,可以使用属性关联器进行同步,然后使用反向 Alpha 通道:
![](/assets/blank.gif)
英文标题的动画比较简单,只是一个 y 位置的变化,定位方法还是根据字体尺寸自动计算:
let _start = thisComp.marker.key(1).time
let _duration = thisComp.marker.key(1).duration
easeOut(time, _start + _duration * .8, // 延迟执行 5%
_start + _duration, // 完整结束
// 初始位置从画面垂直中心再向上多偏移一些
[value[0], thisComp.height * .5 - text.sourceText.style.fontSize * .5], value
)
![](/assets/blank.gif)
这样整个动画过程就完整了,在父级合成中调用动画可以通过更新源标记来清楚的查看到动画设置情况,方便应用。
![](/assets/blank.gif)
就这样,先到这儿,工程文件下载链接(2021版本):
文本动画控件.aep
有啥想聊的想问的或者想要我再写文章的可以在评论区留言~
【AE表达式】更好的动画时间控制相关推荐
- 【AE表达式】以插值方法代替关键帧
在<[AE表达式]更好的动画时间控制>这篇文章中说过我比较不是很喜欢用关键帧来控制动画,这是有一定条件的.使用表达式控制动画更多的是强调复用性,比如你拿到我的工程文件,不管是显示的内容.尺 ...
- 【AE表达式】基于时间随机的溶解转场
这篇文章里面讲的内容非常简单,又比较实用,而且很常用,它是一种可以自由设置的转场,基于表达式和形状图层,而不是效果,因此你可以用它来制作很多比较平凡又不那么平凡的转场,不管是在 AE 中还是 PR 中 ...
- ae制作的mg如何用到html,【教程】AE表达式常用的函数-制作MG动画必备
我一开始接触AE是简单的套模板,后来慢慢学会自己调关键帧动画.感觉应用比较多的同样也让我很头疼的是运动.所以对表达式控制做了初步的学习.下面是一些常用的AE表达式 1.time time随着时间线的变 ...
- AE表达式:利用wiggle和Math.sin制作蝴蝶动画
AE表达式:利用wiggle和Math.sin制作蝴蝶动画 B站链接: AE表达式:B站讲解最详细的Math表达式和蝴蝶动画制作 课程准备 蝴蝶AI素材 wiggle的用法,上次录了一节视频,链接 M ...
- 【AE表达式】300多个人名正从宇宙中飞来……
问题 数量级的问题: 昨天我朋友问:要做三百多个人名(文本)从宇宙深处飞出来的效果,怎么处理? 对于这样的需求,做 AE 包装的小伙伴们都不陌生,就是 3D文本层摆位置,打个相机穿梭一下.没错,对于几 ...
- 【转载】AE 表达式精通大法
本文是转自 设计树 的一篇文章,我对文章进行了重新排版,并标注了重点 原文地址 -- AE表达式精通大法 以下是正文部分: AE 表达式一直是大家学习 AE 过程中的一道坎,涉及代码网上教程资源又不多 ...
- ae绘图未指定错误怎么办_【教程】最全的ae表达式教学分享(实用!)表达式其实很简单...
大部分人对ae表达式是望而却之,感觉很难,无从下手,网上的教程也是层次不齐,很难找到好的教程跟着学.于是呢,搜罗全网,整理了一份最全的最实用的ae表达式教学.也算是一个对自己的总结. 下面解决几个问题 ...
- 如何学好 AE 表达式?
--你知道世界上最难的问题是什么吗? --就是这道题. 上面的只是一个梗,不过面对知乎里或者朋友的这种发问,我真的不知道怎么回答,从上个礼拜,我就开始琢磨这个事儿:如何讲明白如何学好 AE 表达式.问 ...
- ae编程语言as_【微教程】从编程的思路学习AE表达式
(这是一段引人入胜的开场白......),针对知道ae基础操作的群体的教学 授人以鱼不如授人以渔,学习表达式应该是从学会脚本语言入手,而不是通过记忆的方式记住每种效果的表达式语句.这里说的编程并非特指 ...
最新文章
- LeetCode简单题之矩阵对角线元素的和
- Awcing算法--二进制
- Discuz!X3.1数据库的操作(三)
- python函数调用的例子_实例讲解Python中函数的调用与定义
- Linux 基础学习:文件权限与种类
- 图像处理中ct图的通道是多少_常见医疗扫描图像处理步骤
- Linux:I/O多路转接之select(有图有代码有真相!!!)
- 软银三亿重金押注的RPA到底是什么,它能取代人力吗?
- 11月苹果移动设备份额TOP10:iPhone 6上榜居六
- 新媒体营销操作手法及案例分享-初贵民
- nginx location配置直接输出文本
- 【Vue】Nodejs下载与安装
- escplise使用教程_Eclipse使用教程(图文详解)
- 没有测量就没有管理,怀念DNW和复习盖洛普Q12
- 计算机电子贺卡制作圣诞节,如何制作电子圣诞贺卡?贺卡制作步骤
- 美军马赛克战三大技术优势!融入未来作战还需克服的四大难点
- Unity发布项目,记录日志并写入文件。
- weex中UISegmentControl实现及遇到的问题
- Java类和对象的特征
- java 函数内定义函数_java可以在main中定义函数吗?