【问题标题】:How to access group members in Flash CS3如何在 Flash CS3 中访问组成员
【发布时间】:2010-10-15 00:49:52
【问题描述】:

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

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

CS4 reference 为 Group 对象定义了一个 members 属性。

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

【问题讨论】:

  • 对不起,我用 Shape 代替了 Group。问题是如何访问 Group 对象:)

标签: actionscript-3 flash-cs3 jsfl


【解决方案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();
    }
}

【讨论】:

    【解决方案2】:

    您自己已经暗示了答案:在形状对象上使用 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() 不会引发错误。有关详细信息,请参阅上面链接中的 cmets。

    // 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());
    }
    

    【讨论】:

    • 感谢 Stiggler,findObjectInDocByType() 方法将是我工具集中的一个方便的补充 :) 但是这段代码遇到了同样的问题,我使用 CS3,但 Shape 类只得到了“成员” ' CS4 中的属性。
    • 哦,我完全误解了这个问题!幸运的是,解决方案很简单 - 只需支付一些美元进行升级 :)
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 我的错,应该是组
      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2011-01-06
      • 2020-12-06
      • 1970-01-01
      • 2012-09-03
      相关资源
      最近更新 更多