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