无法根据图像的高度定位加载图像的MovieClip

时间:2011-08-01 18:35:54

标签: flash actionscript-3

我使用以下代码加载一些横幅:“横幅”是可点击的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(从左上方菜单中选择文件,然后选择“下载原始文件”)。

1 个答案:

答案 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)。