我正在开发一个使用许多对象的Flex应用程序,例如:在Flash中创建的LED,灯泡,仪表。对象内部由几个小的MovieClip组成,内部有自己的逻辑。最初的要求之一是必须在运行时加载对象,因此它们被导出为SWF,而不是SWC。但是,当我们尝试复制加载的SWF时,我们遇到了问题。事实证明,MovieClip类既没有复制构造函数也没有允许我们克隆现有MovieClip的方法。这样我们每次都会从hdd加载一个对象,这会带来很多开销。 ActionScript 3这样的语言是否可能没有这样的机制?我们错过了什么吗?如果没有,我是否正确,唯一的解决方案是使用Flash Component Kit,制作一些自定义组件并在编译时将它们包含为SWC?
答案 0 :(得分:1)
加载MovieClip后,是否可以使用getDefinitionByName(),如下所示?
http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#getDefinitionByName()
答案 1 :(得分:0)
你是正确的,因为没有内置方法来复制动画片段。 然而,有工作。我认为它最好的方式是给动画片段类。
您不必进行实际课程。在需要复制的最顶级movieclip上设置链接时,只需在类字段中写入任何名称。 所以你的名字是LED movieclip,灯泡的另一个名字等。
好处是现在你有一个可以从中启动对象的类。
否,当您拍摄其中一个动画片段时,您可以使用以下方法复制它:
public function DuplicateDisplayObject(dO:DisplayObject):DisplayObject
{
if(dO == null)
return null;
var dOClass:Class = Object(dO).contructor;
return DisplayObject(new dOClass());
}
这假定您可以先实际获得其中一个动画片段。并且请注意,它不会复制动画片段的状态。 另一个更重要的注意事项是,只有在将动画片段链接到类时,这才有效。这些类不必存在(flash会为你创建空类)。
其他解决方案可能是:
Adobe有更多关于如何做到这一点的信息,应该很容易在他们的网站上找到。
更奇特的解决方案是复制对象的字节码。不确定这是否适用于displaylist上的某些内容,而不是。
关于使用getDefinitionByName()的解决方案: 如果我没记错的话,你仍然需要给movieclips假类,因为getQualifiedClassName只返回MovieClip类。但我可能是错的。
答案 2 :(得分:0)
另一种解决方案:
private function duplicateImg(sourceLoaderInfo:LoaderInfo, target:Image):void
{
var ba:ByteArray = sourceLoaderInfo.bytes;
var dupCliploader:Loader = new Loader();
dupCliploader.contentLoaderInfo.addEventListener(
Event.COMPLETE, bytesLoaded);
dupCliploader.loadBytes(ba);
}
private function bytesLoaded(event:Event):void
{
var mc:MovieClip = event.currentTarget.content as MovieClip;
_img.source = mc;
_img.width = mc.width;
_img.height = mc.height+5;
}