如何在 Flash CS3 中访问组成员

Posted

技术标签:

【中文标题】如何在 Flash CS3 中访问组成员【英文标题】:How to access group members in 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 对象:) 【参考方案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,您应该可以安全地跳过这些内容。

【讨论】:

我的错,应该是组

以上是关于如何在 Flash CS3 中访问组成员的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Adob​​e Flash CS3 中移动 MovieClip 的原点?

在Flash CS3中,play()函数如何编写

需要在 Flash CS3 AS3 中创建暂停/恢复切换按钮

在 Adob​​e Flash CS3 Actionscript 中拖动多个项目

adobe flash cs3 为啥不能导入mp3

Adobe Flash CS3 Professional - 缺少DirectShow 9和QuickTime 7