Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.05.2010, 14:10
rain_heart вне форума Посмотреть профиль Отправить личное сообщение для rain_heart Посетить домашнюю страницу rain_heart Найти все сообщения от rain_heart
  № 1  
Ответить с цитированием
rain_heart
 
Аватар для rain_heart

Регистрация: Jun 2007
Адрес: Ukraine/Dnepropetrovsk
Сообщений: 15
Отправить сообщение для rain_heart с помощью ICQ
Post прелоадер для загрузки нескольких картинок из списка XML

ЗАДАЧА:
есть некий XML файл в котором список картинок, надо их загрузить пачкой при этом контролировать процесс загрузки (можно будет сделать прелоадер)

РЕШЕНИЕ:
Напишем класс в который будем загружать XML объект.
класс загружает все картинки (если таковые там есть) из XML в массив objData а в XML фале появляются атрибуты с номером картинки в массиве @numobj, переписанный XML возвращает переменная xmlData

доступные переменные класса:
xmlData:XML
objData:Array
bytesLoad:int
bytesAll:int
bytesPercent:int


доступные события класса:
LoadComboINIT
LoadComboPROGRESS
LoadComboCOMPLETE


КОД КЛАССА:

Код AS3:
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.
Старый 05.05.2010, 15:18
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 2  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Не увлекайтесь так раскраской текста, или используйте более мягкие тона, глаз режет (
За код спасибо. Только почему такой странный пакет? com.loaders?
И почему каждая функция помечена комментарием, как будто бы код декомпилировали? Почему пишется то dispatchEvent, то this.dispatchEvent? Почему нет констант на события, а они идут строкой? Есть класс в импорте com.loaders.LoadURL, но его Вы не приложили. Некоторые методы начинаются с заглавной буквы.

В целом, вы молодец.

Старый 05.05.2010, 22:01
rain_heart вне форума Посмотреть профиль Отправить личное сообщение для rain_heart Посетить домашнюю страницу rain_heart Найти все сообщения от rain_heart
  № 3  
Ответить с цитированием
rain_heart
 
Аватар для rain_heart

Регистрация: Jun 2007
Адрес: Ukraine/Dnepropetrovsk
Сообщений: 15
Отправить сообщение для rain_heart с помощью ICQ
нужно было быстро решить задачу, поэтому код не оптимизирован и поэтому события строкой а не константой.
А коментарии это я всегда для себя пишу, потом проще вспоминать
com.loaders - это пакет из большого проекта сайта, ну и поэтому же болтается LoadURL - по сути он не используется

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
xml , Изображения , картинки , прелоадер

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 09:29.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.