我有点问题......
我们有一个应用程序需要根据用户输入加载不同数量的行图形。目前,使用Flash.Display.Loader重复加载每一行SWF。 swf相当大(17k),装载10个左右需要一些时间。有没有办法只加载这个文件一次并多次使用它?
我是Flash / actionscript的新手。如果需要任何其他信息,请告诉我,我会尽力提供。
感谢。
答案 0 :(得分:2)
嘿那里,是的你可以加载一次;您可以将所有资产放在一个SWF中,并在加载后立即使用它们。
例如,假设您要在要加载的SWF上使用两个图形行(影片剪辑),rowA和rowB;此SWF将充当您的资产库。您需要做的是在库中创建rowA和rowB影片剪辑,并将它们设置为导出以供Actionscript使用。 (在FLA的库中,右键单击它们并单击属性,然后选择Export for Actionscript,在类输入字段中为此示例输入“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);
}
正如您所看到的,一旦加载了资产库,您就可以按照自己喜欢的方式使用资产。无论如何,希望这会有所帮助,希望是你想要的。
答案 1 :(得分:2)
除了falomir所说的,你还可以使用两种方法:
1.-如果您的SWF只是一个图像(并且您可以将其用作位图),您可以创建加载的SWF的BitmapData,然后根据需要多次使用它:
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 COMPLETE事件能够操作其内容......它类似于您正在使用的内容(使用Loader),但它只需要一个服务器请求。