|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
прелоадер для загрузки нескольких картинок из списка XML
ЗАДАЧА:
есть некий XML файл в котором список картинок, надо их загрузить пачкой при этом контролировать процесс загрузки (можно будет сделать прелоадер) РЕШЕНИЕ: Напишем класс в который будем загружать XML объект. класс загружает все картинки (если таковые там есть) из XML в массив objData а в XML фале появляются атрибуты с номером картинки в массиве @numobj, переписанный XML возвращает переменная xmlData доступные переменные класса: xmlData:XML objData:Array bytesLoad:int bytesAll:int bytesPercent:int доступные события класса: LoadComboINIT LoadComboPROGRESS LoadComboCOMPLETE КОД КЛАССА: package com.loaders { import flash.display.*; import flash.events.*; import flash.net.*; import com.loaders.LoadURL; public class LoadCombXML extends EventDispatcher { // Private Properties: //переменные передаваемые геттерами private var _xml:XML; private var _arrObj:Array = new Array(); private var _bytesLoad:int = 0; private var _bytesAll:int = 0; private var _bytesPercent:int = 0; //внутренние переменные private var _totalImgProgress:int = 0;//номер для последовательной инициализации объектов private var _currentImg:int = 0;//номер для последовательной загрузки объектов private var _arrReq:Array = new Array();//массив запросов private var _flagOne:Boolean = true;//флаг одиночного действия private var _curTotalByte:int = 0;//текущее значения размера загружаемого объекта в байтах private var regImg:RegExp = /.*?\.(png|jpg)/;//регулярное выражение для нахождения в XML картинки // Initialization: public function LoadCombXML(dataXML:XML) { _xml = dataXML; WalkXML(_xml);//запускаем первую фазу, для подсчета общего количества загружаемой информации this.addEventListener('goSecondFase', onSecondFase);//запускаем вторую фазу для получения прогресса загрузки }//end Initialization // Public Methods: // ------- ГЕТТЕРЫ ------- //новый XML файл (ссылки на объекты заменены номерами в массиве загруженных объектов) public function get xmlData():XML { return _xml; }// end function get xmlData //масив загруженных объектов public function get objData():Array { return _arrObj; }// end function get objData //количество загруженных байт public function get bytesLoad():int { return _bytesLoad; }//end function get bytesLoad //общее количество байт public function get bytesAll():int { return _bytesAll; }//end function get bytesAll //процент загрузки public function get bytesPercent():int { return _bytesPercent; }//end function get bytesAll // Protected Methods: //----- ПЕРВАЯ ФАЗА --------- //погуляем по XML private function WalkXML(node:XML):XML { var testXML:XML; for each (var element:XML in node.elements()) { if (element.hasSimpleContent()) { element.replace(element.name(), WalkAttr(element)); } else { element.replace(element.name(), WalkAttr(element)); element.replace(element.name(), WalkXML(element)); } }//end for return element; }//end function WalkXML //погуляем по атрибутам XML private function WalkAttr(node:XML):XML { if (node.attributes().length() > 0) { for each (var att:XML in node.attributes()) { trace (att.name()); if (regImg.test(att)) { var newImg:Loader = new Loader(); _arrReq.push(new URLRequest(att)); //_arrObj.push(newImg); newImg.load(_arrReq[_arrReq.length-1]); newImg.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onImg, false, 0, true); node.@numobj = _arrReq.length - 1;//создаем для каждого объекта новый атрибут его номер в массиве }//end if }//end for }//end if return node; }//end function WalkAttr private function onImg(e:ProgressEvent):void { if (_totalImgProgress++ < _arrReq.length-1) { _bytesAll += e.currentTarget.bytesTotal;//получаем информацию об общем объеме всех объектов } else { _bytesAll += e.currentTarget.bytesTotal; this.dispatchEvent(new Event('goSecondFase'));//рассылаем событие что первая фаза закончена dispatchEvent(new Event('LoadComboINIT'));//РАССЫЛАЕМ СОБЫТИЕ ВСЕ ОБЪЕКТЫ ИНИЦИАЛИЗИРОВАННЫ }//end if e.currentTarget.loader.unload();//удаляем загрузчик e.currentTarget.loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onImg);//удаляем слушатель }//end function onImgInit //----- ВТОРАЯ ФАЗА --------- //загружаем сами объекты private function onSecondFase(e:Event):void { var loadImg:Loader = new Loader(); loadImg.load(_arrReq[_currentImg]); loadImg.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadImgProgress); loadImg.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadImgComplete); _arrObj.push(loadImg); }//end function onSecondFase private function onLoadImgProgress(e:Event):void { if (_flagOne) { _curTotalByte += e.currentTarget.bytesTotal; _flagOne = false; } else { _bytesLoad = Math.round((((e.currentTarget.bytesLoaded/e.currentTarget.bytesTotal) + _currentImg)/(_currentImg + 1)) * _curTotalByte); _bytesPercent = Math.round((_bytesLoad/_bytesAll)*100); dispatchEvent(new Event('LoadComboPROGRESS'));//РАССЫЛАЕМ СОБЫТИЕ ЗАГРУЗКИ } }//end function onLoadImgProgress private function onLoadImgComplete(e:Event):void { if (_currentImg++ < _arrReq.length-1) { _flagOne = true; this.dispatchEvent(new Event('goSecondFase')); } else { this.removeEventListener('goSecondFase', onSecondFase);//прекращаем слушать данное событие dispatchEvent(new Event('LoadComboCOMPLETE'));//РАССЫЛАЕМ СОБЫТИЕ ВСЕ ОБЪЕКТЫ ЗАГРУЖЕННЫ } }//end function onLoadImgInit }//end class }//end package Извиняюсь за, может быть, некорректное оформление, такой пост оформляю первый раз, делайте замечания - учту Возможно решение не самое красивое, но рабочее, и не надо заглядывать в метаданные файла картинки. Может кто предложит код красивее? Последний раз редактировалось BlooDHounD; 05.05.2010 в 16:08. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Не увлекайтесь так раскраской текста, или используйте более мягкие тона, глаз режет (
За код спасибо. Только почему такой странный пакет? com.loaders? И почему каждая функция помечена комментарием, как будто бы код декомпилировали? Почему пишется то dispatchEvent, то this.dispatchEvent? Почему нет констант на события, а они идут строкой? Есть класс в импорте com.loaders.LoadURL, но его Вы не приложили. Некоторые методы начинаются с заглавной буквы. В целом, вы молодец.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
нужно было быстро решить задачу, поэтому код не оптимизирован и поэтому события строкой а не константой.
А коментарии это я всегда для себя пишу, потом проще вспоминать com.loaders - это пакет из большого проекта сайта, ну и поэтому же болтается LoadURL - по сути он не используется |
Часовой пояс GMT +4, время: 09:29. |
|
« Предыдущая тема | Следующая тема » |
Теги |
xml , Изображения , картинки , прелоадер |
|
|