版权声明:本文为博主原创文章,转载请保留原作者名和原文链接。 https://blog.csdn.net/Likianta/article/details/79341196
本文讲解“结束”按钮被触发时的效果。学习本次实例将会让你进一步了解AE脚本的知识。
“结束”按钮触发逻辑图
详细代码 onBtn2Click()
下面会贴出完整的代码,详细的注解会在//
中给出。
如需回顾其他章节的函数或者理解更深入,可以参考本套教程附加的文档:
- LK脚本开发相关语法参考
- Adobe脚本代码书写规范以及官方文档(结合文末的参考页码查阅):
- JavaScript Tools Guide CC.pdf
- After Effects CS6 Scripting Guide.pdf
{
// LK字幕生成工具(LK Subtitle Generator)
function LK_SubtitleGenerator(thisObj)
{
...
function onBtn2Click() {
// 主要目标:创建本条字幕的结束时间
// 判断本条字幕的结束时间是否已存在,若存在则新建一条字幕;不存在(默认情况)则给当前字幕赋予结束值
if (last_time == "") {
if (id > 0) {
s = app.project.item(INDEX).time; // 获取当前时间(格式为“30.1134467801134”)
s = timeToCurrentFormat(s, FPS); // 转换时间格式(转换为“00:00:30:02”)
item = listbox.items[id-1]; // 获取当前字幕(也就是列表中最后一条字幕,注意列表是从0开始数的)
item.subItems[1].text = s; // 赋予当前时间到`end`列
last_time = item.subItems[1].text; // 记录此次操作的item(略)和time,以供后续回调
} else {
// 若当前字幕的`id`=0,说明用户打算在第一条就去创建结束时间
// 这个操作是不允许的,我们会给出一个警告窗口提示用户“先定义一个开始时间”
alert("Please define a start time first.", "Warning");
}
} else { // 若当前字幕时间值不为空,则新建一条字幕再赋值
content = edt.text;
// 检查文本是否为空,为空则中止操作,不为空则继续
if (content == '') {
alert("Please input some contents", "Warning");
} else {
// 新建字幕编号
id += 1;
// 个位数需要进行补零操作:01, 02, 03...
if (id < 10) {
item = listbox.add('item','0' + id);
} else {
item = listbox.add('item', id);
}
// 获取当前时间并赋值给`end`列
s = app.project.item(INDEX).time;
s = timeToCurrentFormat(s, FPS);
item.subItems[0].text = last_time; // 使本条字幕的start时间 = 上条字幕的end时间
item.subItems[1].text = s;
item.subItems[2].text = content;
// 列表滚动到底部
listbox.revealItem(item);
// 记得文字上屏后要把编辑框内的文字清空
edt.text = "";
// 记录此次操作的item和time,以供后续回调
last_item = item;
last_time = item.subItems[1].text;
}
}
}
...
}
LK_SubtitleGenerator(this); // 执行该函数
}
PS:解决btn_2按钮按下后不能及时显示到“end”列的问题
运行刚才写好的代码,从下面的动图很容易发现一个问题:
当我们点击结束按钮时,“end”列并没有立刻显示结束时间,但当我们手动点了其他控件(或者切换窗口)后,“end”中的时间才会显示出来。
这说明btn_2的事件的确被执行了,但是却不知为何出现了莫名其妙的“延迟”。
经过多次测试,这个“延迟”的问题一直得不到很好的解决。
下面仅提供一个权宜的解决方法(新增两行代码):
{
// LK字幕生成工具(LK Subtitle Generator)
function LK_SubtitleGenerator(thisObj)
{
...
function onBtn2Click() {
// 主要目标:创建本条字幕的结束时间
if (last_time == "") {
if (id > 0) {
...
// 强制激活“end”列,使时间码立即显示
s = listbox.add('item', ''); // “临时”新建一条空字幕
listbox.remove(s); // 随即又把它删除
}
} ...
...
}
...
}
LK_SubtitleGenerator(this); // 执行该函数
}
该方法通过临时地新建一条空字幕,随即又把它删除,从而迫使listbox
强制夺走btn_2
的焦点,使listbox
的UI被立即更新。
此方法虽然可以解决问题,但明显不属于正常操作。希望有大神能给出更加好的方法。
下章链接:07 删除字幕操作
参考
- JavaScript Tools Guide CC
- notify - p82
- scroll into view if necessary - p139,145
- remove item - p145
- After Effects CS6 Scripting Guide