Обработчик события AS3 в дочернем объекте не запускается - PullRequest
0 голосов
/ 13 марта 2011

Может быть, я упустил некоторый момент в процессе изучения AS3 и обработки событий. В любом случае событие завершения загрузчика (onLoad) не запускается для загрузчика в объекте imgManager. Если я скопирую тот же код в основной класс и попросу его запустить одно и то же событие изнутри самого себя, он будет работать нормально. Вот мой код:

public class ImageScroller extends Sprite
{
    public function ImageScroller()
    {
        var imgMan:ImageManager = new ImageManager();
        var v:Vector.<String> = new Vector.<String>();
        v[0] = "../assets/apache_pb.gif";

        imgMan.LoadImages(v);

        addChild(imgMan.loadedImages[0]);
    }

}

public class ImageManager
{
    public var _loader:Loader;
    private var _urlRequest:URLRequest;
    private var _loadedImages:Vector.<Bitmap>;

    public var bo:Boolean = false;

    public function ImageManager()
    {
        _loader = new Loader();

        _loadedImages = new Vector.<Bitmap>();
    }

    public function LoadImages(v:Vector.<String>):void
    {

        for(var i:int = 0; i < v.length;i++)
        {
            _loader.load(new URLRequest(v[i]));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
        }

    }

    private function onLoad(e:Event):void
    {
        bo = true;
        var bmp:Bitmap = (Bitmap)(e.target.content);
        _loadedImages[0] = bmp;
    }

    public function get loadedImages():Vector.<Bitmap>
    {
        return _loadedImages;
    }
}

}

1 Ответ

1 голос
/ 13 марта 2011

Я переписал ваш код и считаю, что решение вашей проблемы заключается в следующем:

Main.as:

package
{
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public function Main()
        {
            init();

        }// end function

        private function init():void
        {
            var imageScroller:ImageScroller = new ImageScroller("images/image1.jpg",
                                                                "images/image2.jpg",
                                                                "images/image3.jpg");
            addChild(imageScroller);

        }// end function

    }// end class

}// end package

ImageScroller.as

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class ImageScroller extends Sprite
    {
        private var _urls:Array;
        private var _imageManager:ImageManager;

        public function ImageScroller(...urls:Array)
        {
            _urls = urls;

            init();

        }// end function

        private function init():void
        {
            _imageManager = new ImageManager();
            _imageManager.load(_urls);
            _imageManager.addEventListener(Event.COMPLETE, onImageManagerComplete);

        }// end function

        private function onImageManagerComplete(e:Event):void
        {
            addChild(_imageManager.bitmaps[0]);

        }// end function

    }// end class

}// end package

ImageManager.as

package
{   
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLRequest;

    public class ImageManager extends EventDispatcher
    {
        private var _urls:Array;
        private var _bitmaps:Vector.<Bitmap>;
        private var _loadedBitmapCount:int;

        public function get bitmaps():Vector.<Bitmap>     
        {       
            return _bitmaps;  

        } // end function

        public function ImageManager()     
        {
            init();

        }// end function 

        public function load(urls:Array):void   
        {
            for each(var url:* in urls)
            {
                if(!(url is String))
                throw new ArgumentError("Arguments must be of type String");

            }// end for

            _urls = urls;

            for(var i:int = 0; i < _urls.length; i++)  
            {    
                var loader:Loader = new Loader();
                loader.load(new URLRequest(_urls[i]));     
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);    

            }  // end for 

        } // end function

        private function init():void
        {
            _bitmaps = new Vector.<Bitmap>();

        }// end function

        private function onLoaderComplete(e:Event):void 
        {   
            if(++_loadedBitmapCount >= _urls.length)
            {
                dispatchEvent(new Event(Event.COMPLETE));

            }// end if

            var bitmap:Bitmap = (Bitmap)(e.target.content); 
            bitmaps.push(bitmap);

        }// end function

    }// end class

}// end package

[ОБНОВЛЕНИЕ]

При возникновении проблемы вы пытались получить доступ к загруженным изображениям до их загрузки.

imgMan.LoadImages(v);   
addChild(imgMan.loadedImages[0]);

Вам нужен был прослушиватель событий, который прослушивал бы ваш ImageManager объект для отправки события, когда он загрузил все изображения.Для этого я сначала изменил ваш класс ImageManager с Object на EventDispatcher.

public class ImageManager extends EventDispatcher

Теперь ImageManager имеет два метода, необходимых для отправки события и его прослушивания.это соответственно методы dispatchEvent() и addEventListener().

Затем я изменил код, чтобы условие проверяло, все ли изображения загружены при каждом вызове обработчика событий onLoaderComplete, когда loader объектов, когда его вызывают слушатели событий.Это было сделано с помощью свойства _loadedBitmapCount integar, которое увеличивалось при каждом вызове, а затем проверял его значение по длине свойства длины свойства массива _urls.При выполнении условия объект ImageManager EventDispatcher будет вызывать свой метод dispatchEvent() и отправлять объект события Event.COMPLETE.

public function load(urls:Array):void   
{
    // ...

    for(var i:int = 0; i < _urls.length; i++)  
    {    
        var loader:Loader = new Loader();
        loader.load(new URLRequest(_urls[i]));     
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);    

    }  // end for 

} // end function

//...

private function onLoaderComplete(e:Event):void 
{   
    if(++_loadedBitmapCount >= _urls.length)
    {
        dispatchEvent(new Event(Event.COMPLETE));

    }// end if

}// end function

Наконец я изменил код в классе ImageScrollerдобавив прослушиватель событий, который прослушивал объект ImageManager для отправки объекта события Event.COMPLETE.Когда это происходило и вызывался обработчик события onImageManagerComplete(), теперь загруженные изображения были доступны, потому что теперь они были загружены фактически.

private function init():void
{
    _imageManager = new ImageManager();
    _imageManager.load(_urls);
    _imageManager.addEventListener(Event.COMPLETE, onImageManagerComplete);

}// end function

private function onImageManagerComplete(e:Event):void
{
    addChild(_imageManager.bitmaps[0]);

}// end function

Если есть что-то, чего вы не понимали или хотитеспросите меня, просто добавьте комментарий к этому ответу.

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