Невозможно расположить мувиклипы, загруженные изображениями, в зависимости от их высоты. - PullRequest
0 голосов
/ 01 августа 2011

Я использую следующий код для загрузки некоторых баннеров: «баннер» - это изображение в формате PNG, на которое можно нажимать.Я получаю URL, на который он должен указывать, через параметр класса AdLoader.

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, я хочувторое изображение у: 150 (и т. д.) .Я не могу понять, что это происходит, но иногда код работает, хотя в большинстве случаев это не так.

Все желающие могут скачать все файлы здесь (в верхнем левом меню выберите «Файл», затем «скачать оригинал»).

1 Ответ

1 голос
/ 01 августа 2011

Прежде всего, вы должны сначала установить обработчик событий, а затем начать загрузку:

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 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...