06 创建本条字幕的结束时间

版权声明:本文为博主原创文章,转载请保留原作者名和原文链接。 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

猜你喜欢

转载自blog.csdn.net/Likianta/article/details/79341196
06