Я не думаю, что дело в коде, поскольку такая проблема возникла не только у меня одного.
Функция-инициатор загрузки находится в классе, который является контейнером для объектов типа PagePreviewItem, наследуемых от Sprite
// Функция-инициатор
protected function createItems(data_list:XMLList, create_first_single_page:Boolean):void {
cleanAndRemoveContent();
if (data_list.length() == 0) return;
_cont = new Sprite();
_cont.x = ST_X;
addChild(_cont);
var first_page:PagePreviewItem;
var clp:PagePreviewItem;
var num:uint = Math.min(Math.ceil(create_first_single_page ? (data_list.length() - 1) / 2 + 1 : data_list.length() / 2), MAX_ITEMS);
var i:uint = 0;
var x_pos:uint = 0;
while (num--) {
if (i == data_list.length() - 1 ||
create_first_single_page) {
clp = new SinglePagePreviewItem();
create_first_single_page = false;
} else {
clp = new DoublePagePreviewItem();
DoublePagePreviewItem(clp).initPage2(data_list[i + 1].thumb);
}
if (!first_page) first_page = clp;
SinglePagePreviewItem(clp).initPage1(data_list[i].thumb);
clp.x = x_pos;
initItem(clp);
x_pos += clp.width + X_OFFSET;
i++;
if (clp is DoublePagePreviewItem) i++;
}
SinglePagePreviewItem(first_page).loadPreview();
}
// инит созданного клипа
protected function initItem(clp:PagePreviewItem):void{
clp.visible = false;
_cont.addChild(clp);
clp.addEventListener(Event.COMPLETE, itemLoadCompleteHandler, false, 0, true);
}
// выполняется после того, как текущая картинка загрузилась, и инициирует загрузку следующей картинки из контейнера _cont
protected function itemLoadCompleteHandler(e:Event):void {
e.target.removeEventListener(Event.COMPLETE, itemLoadCompleteHandler);
if (!_cont) return;
if (_cont.contains(DisplayObject(e.target))) {
if (!_showup_timer.running &&
_showing) {
animateCurItem();
}
var ind:uint = _cont.getChildIndex(DisplayObject(e.target));
if (ind == _cont.numChildren - 1) {
dispatchEvent(new Event(Event.COMPLETE));
} else {
var clp:SinglePagePreviewItem = SinglePagePreviewItem(_cont.getChildAt(ind + 1));
clp.loadPreview();
}
}
}
Вкратце, в цикле создаются объекты типа SinglePagePreviewItem и DoublePagePreviewItem. Оба наследуются от класса PagePreviewItem, причем SinglePagePreviewItem наследуется от PagePreviewItem напрямую, а DoublePagePreviewItem наследуется уже от SinglePagePreviewItem. В конце функции для самого первого элемента цикла стартует загрузка картинки при помощи функции loadPreview.
// Функция класса SinglePagePreviewItem выглядит так
public function loadPreview():void {
PreviewCont(cont.p1).loadImg(_p1_url);
}
// Функция класса DoublePagePreviewItem выглядит так
public function loadPreview():void {
super.loadPreview();
PreviewCont(cont.p2).loadImg(_p2_url);
}
// В этих функциях объекты p1 и p2, которые располагаются в мувике cont, являются объектами типа PreviewCont. Функция загрузки loadImg для PreviewCont выглядит так
public function loadImg (url:String, retry_cnt:uint = 2):void {
if (url) {
if (_url == url) return;
_url = url;
}
if (_url) {
_load_retry_cnt = retry_cnt;
loadImage();
}
}
// Функция loadImage
с модификатором protected выглядит так
protected function loadImage ():void {
_ldr.load(new URLRequest(_url));
showLdr();
}
Здесь _ldr - объект типа Loader, который создается в конструкторе класса PreviewCont таким образом
_ldr = new Loader();
_ldr.contentLoaderInfo.addEventListener(Event.INIT, initHandler, false, 0, true);
_ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler, false, 0, true);
_ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false, 0, true);
// А обработчик initHandler выглядит так
protected function initHandler (evt:Event):void {
var clp:Bitmap = evt.target.content;
clp.smoothing = true;
clp.x = _rect_x;
clp.y = _rect_y;
clp.width = rect.width;
clp.height = rect.height;
_ldr.unload();
// здесь я ставлю trace(clp.width, clp.height)
trace(clp.width, clp.height)
removeChildAt(0);
addChildAt(clp, 0);
hideLdr();
dispatchEvent(new Event(Event.COMPLETE, true));
}
Код старался привести только необходимый, если что-то еще нужно или непонятно, пишите, допишу и дозакину.
В итоге в трейсе в последней приведенной функции при описанных обстоятельствах после корректных размеров начинает в каком-то месте вылезать 0 0. Это все происходит при описанных условиях. Причем если количество картинок небольшое (меньше 100-80), то все вроде как работает без ошибок. При увеличении количества картинок начинаются описанные выше проблемы.