Показать сообщение отдельно
Старый 14.12.2010, 12:10
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 4  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
Цитата:
Сообщение от alatar Посмотреть сообщение
Сделать два состояния. В первом показать прелоадер для ресурсов. Во втором само приложение. После загрузки модуля переключиться на второе состояние.
ну эта идея первая посетила мою голову, но придется делать отдельный прелоадер. к тому же у Application есть фаза инициализации, дак почему бы не запихать туда.
в общем, пара часов ковыряния исходников flex привели к следующим результатам: инициализация компонента происходит в методе initialize (в классе UIComponent). по-сути, можно попробовать его переопределить, но создавая приложение в mxml разметке, этот метод уже переопределяется, так-что нам его уже не переопределить (точнее можно, но нужно наследоваться в обычном as файле).
также замечаем, что есть свойство initialized, которое становится true, когда компонент уже проинициализирован. так может нам вручную проставить его в false. но так тоже делать нельзя, так как управлением этого свойства занимается LayoutManage. идем в его исходники и замечаем, что устаановка этого свойства происходит на основании значения свойства processedDescriptors. причем попутно замечаем, что это свойство как раз меняется после выполнения инициализации посредством вызова метода initializationComplete. вот оно! его то мы и переопределим. в итоге получаем следующее:
Код AS3:
...
public var resourcesInitialized:Boolean;
private function preinitializeHandler():void
{
	resourcesInitialized = false;
	//грузим ресурс
	var eventDispatcher:IEventDispatcher = resourceManager.loadResourceModule("resources.swf");
           eventDispatcher.addEventListener(ResourceEvent.COMPLETE, completeHandler);
}
override protected function initializationComplete():void
{
	if (!resourcesInitialized)
	{
		processedDescriptors = false;
	}
	else
	{
		processedDescriptors = true;
	}
}
private function completeHandler(event:ResourceEvent) : void
{
	resourceManager.localeChain = ["ru_RU"];
	resourcesInitialized = true;
	initializationComplete();
}
ну вот работает, пока ресурсы не догрузятся, отображается прогресс бар (правда он не отображает непосредственно процесс загрузка, а просто замирает). после инициализации приложение запускается уже со всеми ресурсами.

UPD: кстати данное управление инициализацией возможно и в других компонентах (что кстати и сделано в некоторых стандартных)
__________________
я могу стать всем, если только захочу


Последний раз редактировалось Felicast; 14.12.2010 в 12:15.