代码之家  ›  专栏  ›  技术社区  ›  Erix

反复加载相同的SWF。有更好的方法吗?

  •  1
  • Erix  · 技术社区  · 15 年前

    我有点问题…

    我们有一个应用程序需要根据用户输入加载不同数量的行图形。目前,使用flash.display.loader反复加载每一行SWF。SWF相当大(17K),装载10个左右需要一些时间。有没有一种方法只加载一次文件并多次使用它?

    我对flash/actionscript非常陌生。如果需要其他信息,请告诉我,我会尽力提供。

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  2
  •   falomir    15 年前

    嘿,是的,你可以加载一次;你可以在一个SWF中拥有你的所有资产,一旦加载,就在必要时使用它们。

    例如,假设您希望在必须加载的SWF上使用两个图形行(电影剪辑),即ROWA和ROWB;此SWF将充当您的资产库。您需要做的是在库中创建rowa和rowb电影剪辑,并将它们设置为导出以供actionscript使用。(在FLA的库中,右键单击它们并单击“属性”,然后选择“导出”作为“操作脚本”,在“类输入”字段中分别输入“rowa”作为本例和“rowb”)。现在您的库中有了您的资产(它们不必在舞台上),就可以发布SWF文件了。

    现在,让我们转到SWF,在那里您将实际使用这个“库”。在这里,您只需要加载SWF库(带有图形资产的库)就可以了。代码示例,

        // Our URL Request
        var req:URLRequest = new URLRequest();
        req.url = "assets.swf";
    
        // Let create our loader
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLibLoaded);
    
        var context:LoaderContext = new LoaderContext();
        context.applicationDomain=ApplicationDomain.currentDomain;
    
        loader.load(req,context);
    
    
        function onLibLoaded(e:Event):void
        {
         createRows();
        }
    
        function createRows()
        {
         var myRowAClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowA")  as  Class;
         var rowA:MovieClip = new myRowAClass() as MovieClip;
         this.addChild(rowA);
    
         var myRowBClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowB")  as  Class;
         var rowB:MovieClip = new myRowBClass() as MovieClip;
         rowB.y = rowA.height;
         this.addChild(rowB);
        }
    

    如您所见,一旦您的资产库被加载,您就可以使用您喜欢的任何方式的资产。不管怎样,希望这对你有帮助,希望这就是你想要的。

        2
  •  2
  •   Cay    15 年前

    除了Falomir所说的,您还可以使用两种方法:

    1.-如果您的SWF只是一个图像(并且您可以将其用作位图),您可以创建加载的SWF的位图数据,然后根据需要多次使用它:

    var bmp:BitmapData = new BitmapData(loader.width, loader.height, true, 0);
    bmp.draw(loader);
    var row1:Bitmap=new Bitmap(bmp);
    var row2:Bitmap=new Bitmap(bmp);
    

    2.-如果您的SWF是动画和/或交互式的(不仅仅是位图),您可以将其加载为二进制URLLoader,然后使用loader.loadBytes在应用程序中复制它:

    var urlloader:URLLoader = new URLLoader();
    urlloader.dataFormat = URLLoaderDataFormat.BINARY;
    urlloader.addEventListener(Event.COMPLETE, swfloaded);
    urlloader.load("miswf.swf");
    function swfloaded(e:Event):void {
        var bytes = urlloader.data;
        var row1:Loader = new Loader();
        row1.loadBytes(bytes);
        var row2:Loader = new Loader();
        row2.loadBytes(bytes);
    }
    

    注意,loadBytes是异步的,所以您需要等待其loaderInfo完成事件能够操作其内容…它类似于您已经在做的(使用加载器),但它只需要一个服务器请求。