我使用以下代码加载一些横幅:“横幅”是可点击的PNG图像。我通过AdLoader类的参数获得了必须指向的URL。
package
{
import flash.display.MovieClip;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.navigateToURL;
import flash.filters.DropShadowFilter;
import flash.filters.BitmapFilterQuality;
//
public class AdLoader extends MovieClip
{
var mcs = [];
var loader:Loader;
var URLs:Array;
var flt:DropShadowFilter;
var h:uint = 0;
//
public function AdLoader(ads:Object)
{
initFilters();
//
var adsLen = ads.u.length;
URLs = ads.u;
// here I create movieClips based on how many images I must load
buildContainers(adsLen);
//
for (var i:uint=0; i<adsLen; i++)
{
//
loader = new Loader();
var request:URLRequest = new URLRequest(ads.s[i]);
loader.load(request);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, __onLoadComplete);
mcs[i].addChild(loader);
}
}
//
public function __onLoadComplete(e:Event)
{
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, __onLoadComplete);
//;
var n = this.numChildren;
//trace(n);
//
for (var j:uint=0; j<n; j++)
{
trace(j);
h += this.getChildAt(j).height;
this.getChildAt(j).y = j == 0 ? 0:h + 10;
}
}
//
public function gotoURL(e:MouseEvent)
{
var n = Number(e.target.parent.name.split("_")[1]);
var request:URLRequest = new URLRequest(URLs[n]);
navigateToURL(request,"_blank");
}
//
public function buildContainers(n)
{
for (var i:uint=0; i<n; i++)
{
var mcLoader = new MovieClip();
mcLoader.name = "loader_" + i;
mcLoader.addEventListener(MouseEvent.MOUSE_DOWN, gotoURL);
mcLoader.mouseEnabled = true;
mcLoader.buttonMode = true;
mcLoader.filters = new Array(flt);
mcs.push(mcLoader);
addChild(mcLoader);
}
}
//
public function initFilters()
{
//...removed
}
}
}
实际上,我在每个容器中创建一些MovieClip容器(loader_1,loader_2等)和我想加载一个图像。
会发生什么:当图像被加载时我想将每个图像定位在前面的y + 10像素处,所以如果第一个是y:0并且高度是140,我想要第二个图像在y:150(依此类推)。我无法理解它发生了什么,但有时代码工作,而大多数时候它没有。
任何感兴趣的人都可以下载所有文件here(从左上方菜单中选择文件,然后选择“下载原始文件”)。
答案 0 :(得分:1)
首先,您应首先设置事件处理程序,然后开始加载:
loader.load(request);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, __onLoadComplete);
应该是:
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, __onLoadComplete);
loader.load(request);
其次,请记住,由于您要加载多个图像,因此将多次调用__onLoadComplete(每个图像一次)。但是,第一次调用它时,在你的代码中你将它从你的加载器对象中“删除”(实际上是最后一个图像的加载器,因为你在循环中覆盖它)。此外,用于计算位置的代码是错误的(特别是因为它在加载所有图像之前运行)。无论如何,这是可以做到的一种方式:
var imagesLoaded:int = 0;
public function __onLoadComplete(e:Event)
{
// we keep track how many images we have loaded so far
imagesLoaded++;
// if all the images are loaded, we will arrange them
if(imagesLoaded == adsLen)
{
var n = this.numChildren;
h = 0;
for (var j:uint=0; j<n; j++)
{
this.getChildAt(j).y = h;
h += this.getChildAt(j).height + 10;
}
}
}
请务必查看有关如何在AS3中加载多个资源的更多示例(例如this one)。