3

我正在编写一个脚本来访问闪存(fla)文件库中的所有动态文本字段并嵌入某些字符集。

我遍历所有对象以查找文本字段,但是在尝试访问组对象的成员时似乎存在一些问题。它在 flash 文件中确实有子项,但我看不到从jsfl 的 CS3 参考中定义的 Group 对象访问它们的方法。Group 有一个未记录的 layer属性等,但它似乎只包含对自身的引用。

CS4 参考定义了Group 对象的members属性。

所以我的问题是,它如何访问 Flash C3 jsfl 脚本 API 中 Group 对象的子对象?

4

4 回答 4

1

形状对象没有子对象。因此,如果您在递归中遇到 Shape 对象,那么它内部没有任何动态 texfields(或作为子对象的 flash 对象)

可能会让您感到困惑的是,将舞台上的对象分组形成一个形状,但事实并非如此。舞台上的对象“组”只存在于Flash编辑界面中,方便编辑和工作流程。一旦您发布它们实际上并没有在 swf/actionscript 中分组。

更令人困惑的是,当舞台上有多个矢量项目,甚至在某些情况下舞台上有位图项目时,Flash 只会将它们简化,展平为单个 Shape 对象。这进一步加深了这样一种错觉,即对对象进行分组会创建一个 Shape 对象,其中每个对象都是一个子对象,因此一个 Shape 对象可以有子对象,但实际上它所做的只是将所有对象扁平化为一个单一的 Shape,并将这些图形平放在其上,它不将它们中的任何一个作为单独的对象。这种情况永远不会发生在动态文本字段中,所以很简单,如果你点击一个 Shape 对象,那么那里就没有动态文本字段,继续:)

于 2009-04-14T02:18:14.790 回答
1

首先 unGroup() 形状。然后您可以在之后运行正常的“文本”转换。它不应该损害文档,因为分组没有真正的技术含义。

var doc = fl.getDocumentDOM();
var results = fl.findObjectInDocByType("shape", doc);
for (var i = 0; i < results.length; i++) 
{
    if ( results[i].obj.isGroup )
    {
        doc.selection = [results[i].obj];
        doc.unGroup();
    }
}
于 2009-06-17T00:58:57.200 回答
0

你确定你在使用 Shapes 吗?除了图形(它具有图形属性,如 Sprite)之外,形状不应该有任何实际的子元素,这些子元素实际上不算作子元素。它们更像是图形属性的值。

Shape 不扩展 DisplayObjectContainer,所以我很确定它不能有子显示对象,例如 Sprite 或 MovieClip。

如果搜索 TextFields,您应该可以安全地跳过这些内容。

于 2009-04-08T03:57:12.383 回答
0

您自己已经暗示了答案:在形状对象上使用 members 属性。它返回一个包含在其中的对象数组,这些对象可能是也可能不是文本对象。

您没有指定是否使用 fl.findObjectInDocByType() 来扫描文档中的文本对象和形状(潜在组),但这也是一个好主意。

http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00004151.html

我相信以下脚本将跟踪 FLA 中所有动态文本字段的文本值,除非我错过了一些讨厌的嵌套案例。无论如何,它应该有望让您继续前进。请注意,您需要从“命令”菜单运行脚本,以便 fl.findObjectInDocByType() 不会引发错误。有关更多信息,请参阅上面链接中的评论。

// Look for text objects
var doc = fl.getDocumentDOM();
var typeToSearchFor = "text";
var results = fl.findObjectInDocByType(typeToSearchFor, doc);

for(var i = 0; i < results.length; i++)
{
    if(results[i].obj.textType == "dynamic")
    {
        doWhatever(results[i].obj);
    }
}

// Look for shapes
typeToSearchFor = "shape";
results = fl.findObjectInDocByType(typeToSearchFor, doc);

var textObjects;

for(var i = 0; i < results.length; i++)
{
    var members = results[i].obj.members;

    for(var j = 0; j < members.length; j++)
    {
        if(members[j].elementType == "text" && members[j].textType == "dynamic")
        {
            doWhatever(members[j]);
        }
    }
}


function doWhatever(textObj)
{
    fl.trace(textObj.getTextString());
}
于 2009-04-16T00:47:35.553 回答