小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
效果图
想法
在某些情况下,将每个镜头的源镜头名称渲染到画面中是很有用的。如果我们可以对单层这样做(最终渲染也可以关闭),这将是很有利的。所以我们的设计目标是想出一种方法来显示当前剪辑的源名称。如果当前剪辑没有源(例如一个纯色层或文本层),我们就显示层名。如果当前没有可见层,则不希望显示任何内容。
设计
我们将使用一个文本层,并将表达式应用到 Source text 属性。我们将让表达式从上到下在层堆栈中移动,直到它找到一个当前可见的层。当然,我们希望表达式忽略它自己的文本层。3D 层会把事情搞糟(因为任意的堆叠顺序),所以我们在这个设计中不会担心它们。
表达式
txt = "";
for (i = 1; i <= thisComp.numLayers; i++) { ///< 遍历合成中的所有层
if (i == index) continue; ///< 跳过文本层
L = thisComp.layer(i); ///< 当前层
if (!(L.hasVideo && L.active)) continue; ///< 如果其中没有可见内容则跳过
/// @note 如果存在,则使用层的源名称
/// 否则使用层名
try {
txt = L.source.name;
} catch (err) {
txt = L.name
}
break; ///< 找到则退出循环
}
txt ///< 显示源名或层名(如果当前没有可见层则不显示)
注意 JavaScript 的 try / catch 构造的使用。这允许捕获表达式中的条件,这些条件通常会生成错误并导致表达式被禁用。构造的 catch(err) 部分是您声明在发生错误时希望发生什么的地方。在我们的例子中,如果我们试图引用一个没有源的层,它将产生一个错误。在这里,我们捕获错误,只是使用图层名称代替。
(完)