当您领会了表达式背后的一些概念之后,请前往社区观看一些真实案例并分享您的作品。
AE Enhancer 论坛也提供了有关表达式、脚本和动画预设的许多示例和大量信息。
使用表达式控件编辑文本样式和文本属性。
使用表达式来控制任何文本表达式或动态图形模板中的文本样式。表达式可用于:
可以使用样式对象读取和设置以下文本样式属性:
文本图层的源文本属性由表达式解释为 JavaScript 字符串。可以使用 sourceText 读取文本本身,但如果要修改样式属性,则必须使用 setText 方法在样式对象上设置文本。查看一些示例。
在字符串表达式中使用 \r 开始一个新的文本行。例如,要将原始文本从一个图层复制到同一图层上,并在新行中用全部大写的字符重复原始文本,请使用以下表达式:
text.sourceText + “\r” + text.sourceText.toUpperCase()
表达式中的段落样式设置现在可供测试和反馈。立即在 After Effects (Beta) 中试用。
除了文本样式属性之外,还可以使用段落属性。只能将这些属性应用于整个文本图层。段落属性仅在 After Effects (Beta) 中可用。
在 After Effects (Beta) 社区中,进一步了解新表达式。
在表达式中引用字体时,它们必须使用特殊的“系统名称”(或类似名称)。建议从文本 > 字体 > 选择字体对话框插入这一特殊名称,避免表达式错误。
仅在表达式编辑器中引用的字体不记录为项目使用的字体。为确保所有在表达式编辑器中引用的字体将会“自动同步”或填充解析字体对话框,在图层上使用所有这些字体,即使该图层源已隐藏。
文本图层的所有样式设置属性都存在于样式对象中,可使用以下方法在源文本属性上访问:
// 使用源文本属性的完整路径 text.sourceText.style // 使用当前属性的通用名称 thisProperty.style
使用单独的样式与使用上面两个示例中的任何一个相同,但是如果组合来自多个文本图层的样式属性,这可能会造成混淆。
也可以读取其他文本图层的样式属性。使用关联器在上面显示的第一个示例的开头创建指向其他文本图层的链接。
// 访问特定文本图层的样式对象 thisComp.layer(“Other Layer Name”).text.sourceText.style;
表达式中的逐字文本样式设置现在可供测试和反馈。立即在 After Effects (Beta) 中试用。
除了使用文本表达式来设置整个文本图层的样式属性之外,您还可以在图层中设置单个字符的样式属性。逐字控件的优点是可自动重新排出文本,例如在缩放字母、使用上标和使用其他字体时,就像使用字符面板中的子字符串样式设置一样。
textourceTexttyle etFont(“Montserrat-Light”) etFont(“Gigantic”, 0, 6)etFont(“Gigantic”, 10, 6)etFont(“Gigantic”, 20)
text.sourceText.style.setFontSize(100, 0, 30).setFauxBold(true, 0, 30)
要使用该字符串,请添加带有“第一和第二位”文本的文本图层,并将以下内容应用于源文本。
textourceTexttyleetBaselineOption(“superscript”,1,2)etBaselineOption(“superscript”, 9, 2)
要同时返回样式和实际源文本的值,必须结合使用 getStyleAt 和 setText 函数。以下是如何编写此表达式的两个示例。
// 返回样式和实际源文本的值(简写) var sourceTextProperty = thisComp.layer(“MAIN TEXT”).text.sourceText; var newStyle = sourceTextProperty.getStyleAt(0,0); newStyle.setText(sourceTextProperty);
// 按图层堆叠顺序返回上一层的样式和实际源文本的值 var sourceTextProperty = thisComp.layer(index - 1).text.sourceText; var newStyle = sourceTextProperty.getStyleAt(0,0); newStyle.setText(sourceTextProperty);
可使用下拉菜单控制文本样式,例如将文本图层锁定为特定字体。这对于品牌指南、模板、MoGRTS 等都很有用:
// 使用下拉菜单控件将文本图层锁定为特定字体 var dropDownMenu = thisComp.layer(“LayerName”).effect(“Dropdown Menu Control”)(“Menu”); switch (dropDownMenu.value) { case 1 : text.sourceText.style.setFont(“Georgia”); break; case 2 : text.sourceText.style.setFont(“Impact”); break; default : text.sourceText.style.setFont(“Tahoma”); }
将多个文本图层链接到某个主字体控制器以同时控制多个图层的文本样式。创建两个文本图层,并将此表达式粘贴到其中一个的源文本中:
// 从文本图层获取所有文本属性 thisComp.layer(“Text Layer 1”).text.sourceText.style;
可以从文本图层获取样式,但需通过使用 Set 函数添加值来覆盖特定的文本属性。以下是使用填充颜色和字体大小的两个示例。
// 从“文本图层 1”获取所有文本属性,但使用硬编码值覆盖填充颜色和字体大小 var newStyle = thisComp.layer(“Text Layer 1”).text.sourceText.style; newStyle.setFillColor(hexToRgb(“FF0000”)).setFontSize(100);
// 从“文本图层1”获取所有文本属性,但使用图层的当前文本属性覆盖填充颜色和字体大小 var newStyle = thisComp.layer(“Text Layer 1”).text.sourceText.style; var currentFillColor = thisProperty.style.fillColor; var currentFontSize = thisProperty.style.fontSize; newStyle.setFillColor(currentFillColor).setFontSize(currentFontSize);
下面提供了有关如何通过表达式访问和使用文本属性值的示例。
以下是访问文本图层的字体、字体大小、仿粗体、仿斜体、字符间距和行距的示例:
// 返回文本图层本身的字体名称 text.sourceText.style.font; // 返回另一个文本图层正在使用的字体名称 var otherLayer = thisComp.layer(“Other Layer Name”); otherLayer.text.sourceText.style.font; // 返回文本图层自身字体大小的值 text.sourceText.style.fontSize; // 返回另一个文本图层的字体大小值 var otherLayer = thisComp.layer(“Other Layer Name”); otherLayer.text.sourceText.style.fontSize; // 返回图层文本是否为仿粗体的布尔值(True 或 False) text.sourceText.style.isFauxBold; // 返回图层文本是否为仿斜体的布尔值(True 或 False)text.sourceText.style.isFauxItalic; // 以数字形式返回文本图层的跟踪值 text.sourceText.style.tracking; // 以数字形式返回文本图层的行距值 text.sourceText.style.leading;
以下是访问文本图层的填充和填充颜色的示例:
// 返回一个布尔值,表示图层的文本是否应用了填充(True 或 False) text.sourceText.style.applyFill; // 返回文本图层填充颜色的值 // 默认情况下,这将返回一个 RGB 值数组,范围为 0 – 1.0 之间 text.sourceText.style.fillColor; // 使用 setApplyFill 和 setFillColor 设置文本图层的填充颜色 // setFillColor 值定义为 RGB 数组,范围为 0 – 1.0 之间 var newStyle = style.setApplyFill(true); newStyle.setFillColor([1.0, 1.0, 1.0]); // 设置文本图层的填充颜色,用 hexToRGB 替换 0 – 1.0 RGB 数组以定义具有十六进制值的颜色值 var newStyle = style.setApplyFill(true); newStyle.setFillColor(hexToRgb(“FFFFFF”));
// 返回填充颜色的红色 (R) 值 text.sourceText.style.fillColor[0];
要返回文本图层的 R、G 或 B 的填充颜色值,请分别在括号中添加 0、1 或 2。
以下是访问文本图层的描边、描边颜色和描边宽度的示例:
// 返回一个布尔值,表示图层的文本是否应用了描边(True 或 False) text.sourceText.style.applyStroke; // 返回文本图层的描边颜色值 // 默认情况下,这将返回一个 RGB 值数组,范围为 0 – 1.0 之间 text.sourceText.style.strokeColor; // 使用 setApplyStroke 和 setStrokeColor 设置文本图层的描边颜色 // setStrokeColor 值被定义为一个 RGB 数组,范围为 0 – 1.0 之间 var newStyle = style.setApplyStroke(true); newStyle.setStrokeColor([1.0, 0.0, 0.0]); // 设置文本图层的描边颜色,用 hexToRGB 替换 0 – 1.0 RGB 数组以定义具有十六进制值的颜色值 var newStyle = style.setApplyStroke(true); newStyle.setStrokeColor(hexToRgb(“FF0000”)); // 以数字形式返回文本图层的描边宽度值 text.sourceText.style.strokeWidth;
// 返回描边颜色的绿色 (G) 值 text.sourceText.style.strokeColor[1];
要返回文本图层的 R、G 或 B 的描边颜色值,请分别在括号中添加 0、1 或 2。
使用此 get 函数在特定时间返回特定字符的样式值。索引应该是一个数字,是需要其样式的字母或字符的索引。atTime 也应该是一个数字,即在样式已设置关键帧并随时间变化的情况下,在合成中获取样式的时间。
text.sourceText.getStyleAt(index, atTime);
text.sourceText.style 与 text.sourceText.getStyleAt(0,0) 的使用方法相同。
// 在时间轴开头获取第一个字符的样式 text.sourceText.getStyleAt(0,0);
可以单独使用或组合使用其他 Set 函数来跨图层驱动样式。对源文本属性的样式对象调用以下每个函数:
// 将字体设置为 Arial styleetFont(“ArialMT”) // 将字体大小设置为 80 styleetFontSize(80 // 使用布尔值启用仿粗体 styleetFauxBold(true) // 使用布尔值启用仿斜体 styleetFauxItalics(true) // 使用布尔值启用所有大写字母 styleetAllCaps(true) // 使用布尔值启用小型大写字母 styleetSmallCaps(true) // 将字符间距设置为数字 styleetTracking(10 // 将行距设置为数字 styleetLeading(10 // 使用布尔值启用自动行距 styleetAutoLeading(true // 将基线偏移设置为数字 styleetBaselineShift(10 // 将描边宽度设置为数字 styleetStrokeWidth(10 // 目前为 Beta 版 - 将文本图层的第一行设置为粗体并放大 textourceTexttyleetFontSize(100, 0, 30)etFauxBold(true, 0, 30) // 目前为 Beta 版 - 为字符设置上标 textourceTexttyleetBaselineOption(“superscript”,1,2)etBaselineOption(“superscript”, 9, 2)
文本样式的所有 set 函数都可以链接在一起以轻松设置多个属性,而无需每次都声明新样式,如下例所示:
在设置好最后一个属性之后才使用分号。在单独的行中列出每个属性有助于使整个链更易于阅读。
// 启用填充、设置填充颜色、设置基线、设置跟踪,并启用自动行距 text.sourceText.style .setApplyFill(true) .setFillColor(hexToRgb(“FFFFFF”)) .setBaselineShift(10) .setTracking(25) .setAutoLeading(true);
向合成添加文本图层并向其源文本属性添加表达式可能是检查其他图层的属性值的一种非常好的方法。例如,源文本属性的以下表达式以图层堆积顺序报告下一个图层的不透明度属性的名称和值:
var nextLayer = thisComp.layer(index + 1); nextLayer.name + “\rOpacity = ” + nextLayer.opacity.value;
以下示例在设置其“视频”开关的当前时间以堆积顺序报告用作最高图像图层源的素材项目的名称:
// 将 sourceFootageName 创建为一个空字符串 var sourceFootageName = “”; // 循环合成中的所有层 (var i = 1; i <= thisComp.numLayers; i++) { // 如果 i 匹配该层的索引,则继续下一个循环 (i == index) { continue; } // 为循环的当前迭代设置 myLayer var myLayer = thisComp.layer(i); // 如果 myLayer 没有视频或未处于活动状态,则继续下一个循环/层 if ( !myLayer.hasVideo || !myLayer.active ) { continue; } // 如果当前时间 myLayer 处于活动状态 if ( myLayer.active ) { try { // 将 sourceFootageName 设置为 myLayer 的源名称 sourceFootageName = myLayer.source.name; } catch ( err ) { // 如果 myLayer 没有源,// 将 sourceFootageName 设置为 myLayer 的名称 sourceFootageName = myLayer.name; } // 停止循环中断; } } // 显示 sourceFootageName sourceFootageName;
选择添加了表达式的源文本属性。然后,选择动画 > 保存动画预设,以便在其他项目中重复使用这些表达式。动画预设保存在效果和预设面板中。
有关更多信息,请参阅效果和动画预设概述。
当您领会了表达式背后的一些概念之后,请前往社区观看一些真实案例并分享您的作品。
AE Enhancer 论坛也提供了有关表达式、脚本和动画预设的许多示例和大量信息。