在Flex应用程序中使用外部SWF - 复制MovieClip?

时间:2009-03-22 18:23:49

标签: flex actionscript-3

我正在开发一个使用许多对象的Flex应用程序,例如:在Flash中创建的LED,灯泡,仪表。对象内部由几个小的MovieClip组成,内部有自己的逻辑。最初的要求之一是必须在运行时加载对象,因此它们被导出为SWF,而不是SWC。但是,当我们尝试复制加载的SWF时,我们遇到了问题。事实证明,MovieClip类既没有复制构造函数也没有允许我们克隆现有MovieClip的方法。这样我们每次都会从hdd加载一个对象,这会带来很多开销。 ActionScript 3这样的语言是否可能没有这样的机制?我们错过了什么吗?如果没有,我是否正确,唯一的解决方案是使用Flash Component Kit,制作一些自定义组件并在编译时将它们包含为SWC?

3 个答案:

答案 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会为你创建空类)。

其他解决方案可能是:

  • 针对没有的类进行编译 包括他们(见 “external-library-path”标签 flex编译器),然后加载它们 runtime(来自swf)。
  • 针对类进行编译 RSL(运行时共享库​​)swc 将在运行时加载。

Adob​​e有更多关于如何做到这一点的信息,应该很容易在他们的网站上找到。

更奇特的解决方案是复制对象的字节码。不确定这是否适用于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;                  
    }