我正在编写一个脚本来访问flash(fla)文件库中的所有动态文本字段并嵌入某些字符集。
我遍历所有寻找文本字段的对象,但是在尝试访问组对象的成员时似乎存在一些问题。它确实在flash文件中有子节点,但我看不到从CS3 reference for jsfl中定义的Group对象访问它们的方法。 Group有一个未记录的层属性,但它似乎只包含对自身的引用。
CS4 reference定义了Group对象的成员属性。
所以我的问题是,它如何在Flash C3 jsfl脚本API中访问Group对象的子代?
答案 0 :(得分:1)
Shape对象没有子对象。因此,如果您在递归中遇到一个Shape对象,那么它内部没有任何动态texfields(或者其中的flash对象作为子对象)
你可能会感到困惑的是,在舞台上对对象进行分组会产生一个Shape,但却没有。舞台上的对象“组”仅存在于Flash编辑界面中,便于编辑和工作流程。一旦发布,它们实际上并未分组在swf / actionscript中。
甚至可能更令人困惑的是,当你在舞台上有多个矢量项目时,甚至在某些情况下,舞台上的位图项目时,Flash只会简化它们,扁平化为单个Shape对象。这进一步加剧了这样的错觉:分组对象创建一个Shape对象,每个对象都是一个子对象,因此一个Shape对象可以有子对象,但实际上它所做的只是将它们整合成一个单独的Shape,并将这些图形平放在其上,它不会将它们作为单个对象。这种情况永远不会发生在动态文本字段中,所以非常简单,如果你点击一个Shape对象,那么那里没有动态文本字段,继续前进:)
答案 1 :(得分: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 :(得分:0)
你确定你正在使用Shapes吗?除了图形之外,一个形状不应该有任何实际的孩子(它有一个图形属性,比如Sprite),它们实际上并不算作孩子。它们更像是图形属性的值。
Shape不会扩展DisplayObjectContainer,所以我很确定它不能像子画面或MovieClip那样拥有子显示对象。
如果搜索TextFields,你应该安全地跳过这些。
答案 3 :(得分:0)
您已经自己暗示了答案:在形状对象上使用members属性。它返回一个包含在其中的对象数组,可能是也可能不是文本对象。
您没有指定是否使用fl.findObjectInDocByType()来扫描文档中的文本对象和形状(潜在的组),但这也是一个好主意。
我相信以下脚本将跟踪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());
}