如何在 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 中访问组成员的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Adobe Flash CS3 中移动 MovieClip 的原点?
需要在 Flash CS3 AS3 中创建暂停/恢复切换按钮