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

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

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

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию потеря закэшированной картинки

Здравствуйте
Я в замешательстве
Сделал кнопку из ms:Image такой чтобы она получала стэйты и пути к картинкам стэйтов.

Каждый из стэйтов для своего удобства я собрал в ValueObject (его код) со свойствами stateName-имя стэйта ("normal", "over" итд), stateURL - путь к картике для стэйта и stateData - сюдазаносится закэшированный Bitmap

При первой установки определенного стэйта, после загрузки картинки, кнопка кэширует эту картинку (Bitmap) и в дальнейшем при возвращении к этому стэйту отображает кэш (Bitmap). Первые 2 раза (подгрузка картинки стэйта и отображение закэшированного стэйта срабытывают, а 3й раз при установки этого же стэйта Bitmap в кэше почему-то имеет значения ширины и высоты равными нулю)

Что не так ?

Вот пример работы

View source

Повторюсь: устанавливается стэйт "normal" - загружается картинка, отправляется в кэш, затем стэйт "over" -загружается картинка, отправляется в кэш, затем опять "normal" - картинка корректная берется из кэша, затем опять "over" - картинка в кэше почему-то нулевых размеров, опять "normal" - картинка в кэше нулевых размеров

вот код:

Код AS3:
<fx:Script>
		<![CDATA[
			import com.CacheableImageStateVO;
			import com.CacheableImageStatesDataVO;
 
			import mx.events.FlexEvent;
 
			protected function CacheableButton_rollOverHandler(event:MouseEvent):void
			{
				cacheableButton.state="over";
			}
 
			protected function CacheableButton_rollOutHandler(event:MouseEvent):void
			{
				cacheableButton.state="normal";
			}
 
 
			protected function application1_creationCompleteHandler(event:FlexEvent):void
			{
				var rightButtonStateData:CacheableImageStatesDataVO=new CacheableImageStatesDataVO();
 
				var rightButtonEnabledState:CacheableImageStateVO=new CacheableImageStateVO();
				rightButtonEnabledState.stateName="normal";
				rightButtonEnabledState.stateImageURL="assets/controls/RightArrowControlEnabled.png";
				rightButtonStateData.addState(rightButtonEnabledState);
 
				var rightButtonDisabledState:CacheableImageStateVO=new CacheableImageStateVO();
				rightButtonDisabledState.stateName="disabled";
				rightButtonDisabledState.stateImageURL="assets/controls/RightArrowControlDisabled.png";
				rightButtonStateData.addState(rightButtonDisabledState);
 
				var rightButtonOverState:CacheableImageStateVO=new CacheableImageStateVO();
				rightButtonOverState.stateName="over";
				rightButtonOverState.stateImageURL="assets/controls/RightArrowControlOver.png";
				rightButtonStateData.addState(rightButtonOverState);
 
				cacheableButton.statesData=rightButtonStateData;
				cacheableButton.state="normal";
			}
		]]>
	</fx:Script>
 
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<com:CacheableImage id="cacheableButton"
						rollOver="CacheableButton_rollOverHandler(event)"
						rollOut="CacheableButton_rollOutHandler(event)"/>
Сама картинка:
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<mx:Image xmlns:fx="http://ns.adobe.com/mxml/2009" 
		  xmlns:s="library://ns.adobe.com/flex/spark" 
		  xmlns:mx="library://ns.adobe.com/flex/mx"
		  currentState="normal"
		  complete="image1_completeHandler(event)"
		  ioError="image1_ioErrorHandler(event)">
 
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<mx:states>
		<s:State name="normal"/>
		<s:State name="over"/>
		<s:State name="disabled"/>
		<s:State name="playing"/>
		<s:State name="stopped"/>
	</mx:states>
	<fx:Script>
		<![CDATA[
			import mx.utils.ObjectUtil;
 
			protected var _statesData:CacheableImageStatesDataVO; 
			protected var _bounds:Object;
 
			override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
			{
				if(_bounds)
				{
					graphics.clear();
					graphics.beginFill(0xFF0000,1);
					graphics.drawRect(0,0,_bounds.width,_bounds.height);
					graphics.endFill();
				}
				super.updateDisplayList(unscaledWidth, unscaledHeight);
			}
 
			public function set statesData(val:CacheableImageStatesDataVO):void
			{
				_statesData=val;
			}
 
			public function set state(val:String):void
			{
				currentState=val;
				if(_statesData)
				{
					var stateData:Object=_statesData.getStateDataByName(val);
					if(stateData)
					{
						trace("using cache "+stateData+" w="+stateData.width+" h="+stateData.height);
						source=stateData;
					}
					else
					{
						trace("using URL "+_statesData.getStateURLByName(val));
						source=_statesData.getStateURLByName(val).toString();
					}
				}
				else
				{
					throw new Error("CacheableImage Error: statesData must be set before set states"); 
				}
			}
 
			protected function image1_completeHandler(event:Event):void
			{
				trace("SOURCE load complete "+content+" w="+content.width+" h="+content.height);
				if(!_bounds)
				{
					_bounds=new Object();
					_bounds.width=content.width;
					_bounds.height=content.height;
				}
 
				trace("Trying to get cache "+_statesData.getStateDataByName(currentState))
				if(!_statesData.getStateDataByName(currentState))
				{
					trace("setting this "+content+" as cache for state "+currentState);
					_statesData.setStateDataByName(currentState,new Bitmap((content as Bitmap).bitmapData));
				}
			}
 
			protected function image1_ioErrorHandler(event:IOErrorEvent):void
			{
				trace("SOURCE load ioError: "+event.text);
			}
		]]>
	</fx:Script>
</mx:Image>

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

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

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


 


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


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