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

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

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

Регистрация: May 2006
Адрес: Moscow
Сообщений: 40
По умолчанию Обновить расположение элементов в List

Всем привет.
Я завожу List, в каждом его элементе есть текст и картинка. Картинка -- отнаследованный от Image класс, который позволяет (в зависимости от того, какое сво-во инициализировано, setHeight или setWidth) задавать ее размеры, не меняя масштабов. Изменение масштаба производится по событии initialize (или creationComplete, что, как выяснилось, сути проблемы не изменяет).

Все получается, но элементы списка остаются размеров таких, как будто ничегог не масштабировалось. Т.е., по всей видимости, список загружается, грузится содержимое с картинками, элементы его размещаются и только после этого изменяется масштаб картинок. Перераспределение элементов списка уже не происходит.

Вопросы:
1. как заставить список обновить отображение
2. как правильно поставленную задачу реализовать без извратов(может я в корне неверно делаю)
3. нужно ли в таких вещах использовать геттеры/сеттеры или остановиться на добавлении новый свойств в классе.


Спасибо.

Старый 15.08.2010, 01:40
Dimitry_II вне форума Посмотреть профиль Отправить личное сообщение для Dimitry_II Найти все сообщения от Dimitry_II
  № 2  
Ответить с цитированием
Dimitry_II

Регистрация: Jan 2010
Сообщений: 211
1. creationComplete выполняется только при загрузке данного окна/формы. Если делать переходы, то повторно это событие выполняться не будет. Возмножно, в твоем приложении так и должно быть, или планируется каждый раз создавать форму.
2. Из описания непонятно каким образом происходит отображение картинки. Если простой загрузкой - source указывает на адрес картинки, то такое поведение естественно: установка размеров произойдет после загрузки картинки - явно после отображения списка.
3. Непонятна поставленная задача - "расположение элементов", "перераспределение". О чем речь? - О сортировке элементов в списке? - Это отдельный механизм, хорошо реализованный во флексе.

Плиз, более конкретно изложи задачу. Желательно с кодом, чтобы вносить изменения, а не мудрить сначала.

Старый 15.08.2010, 17:03
DimG вне форума Посмотреть профиль Отправить личное сообщение для DimG Найти все сообщения от DimG
  № 3  
Ответить с цитированием
DimG
 
Аватар для DimG

Регистрация: May 2006
Адрес: Moscow
Сообщений: 40
Согласен, вопрос поставлен неточно=)

Итак. Я думаю, основной файл не имеет смысла приводить. Обычный лист. Вот Mit -- itemRenderer

Код:
 <?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
				xmlns:s="library://ns.adobe.com/flex/spark" 
				xmlns:mx="library://ns.adobe.com/flex/mx" 
				xmlns:my="hello.*"
				autoDrawBackground="true">
	<s:layout>
		<s:HorizontalLayout />
	</s:layout>
	
	<my:MImage source="{data.image}" setWidth="100" />
	<s:Label text="{data.man}" fontSize="20"/>	
	
</s:ItemRenderer>
Вот, собственно, MImage:

Код:
<?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"    initialize="init()">
	<fx:Script>
		<![CDATA[
			public var setHeight:Number = 0;
			public var setWidth:Number = 0;
			
			public function init():void
			{
				var ratio:Number;
				if(setHeight!=0)
				{
					ratio = setHeight/height;
					height = setHeight;
					width = ratio*width;
				}
				if(setWidth!=0)
				{
					ratio = setWidth/width;
					height = ratio*height;
					width = setWidth;
				}
			}
		]]>
	</fx:Script>
</mx:Image>
Также согласен с замечанием, что функция инициализации будет вызывается только один раз. Это мне и нужно=)

Суть проблемы тоже ясна (надеюсь=). Изменение размеров картинки идет после того, как itemRenderer отобразил все на экране (так или нет?) и, естественно, лист не знает, что что-то изменилось внутри.

Вопрос следующий. Как заставить список (или itemRenderer'ы, я не знаю, кто это действие инициирует) перерисовать(перерасположить?) свои элементы? Т.е. есть ли специальная ф-ия, которая насильно это делает. Или же есть способ это все обойти без изврата? (Если есть, то предыдущий вопрос все равно актуален). И наконец, можно ли узнать размер загружаемой картинки до ее отображения.

P.S. В принципе есть еще идея реализовывать все в конструкторе, но, наверно, во флексе лучше ничего не делать в конструкторах, так как я не знаю внутренней архитектуры-- могу что-то напортить.


Thx=)


Последний раз редактировалось DimG; 15.08.2010 в 17:06.
Старый 16.08.2010, 03:06
Dimitry_II вне форума Посмотреть профиль Отправить личное сообщение для Dimitry_II Найти все сообщения от Dimitry_II
  № 4  
Ответить с цитированием
Dimitry_II

Регистрация: Jan 2010
Сообщений: 211
Что это в первом листинге: <s:ItemRenderer и т.д.?
Если ты в листе прописываешь атрибут itemRenderer и указываешт ему свой класс, то почему класс является потомком ItemRenderer? - Вроде должен быть контейнером. Или я чего-то не понимаю?
Второе: если честно, то я не знаю как поведет себя initialize в классе MImage. Принято делать сеттеры в классе. А для быстрого обновления в сеттере устанавливаешь не только приватное свойство ширины, но и вычисляешь приватное свойство высоты. В этом случае ширина и высота просчитается гарантийно сразу.
И третье: с листингов так и непонятно значение source имиджа. Интереснее всего листинг образования твоего листа, а не начинки.

Старый 16.08.2010, 17:58
DimG вне форума Посмотреть профиль Отправить личное сообщение для DimG Найти все сообщения от DimG
  № 5  
Ответить с цитированием
DimG
 
Аватар для DimG

Регистрация: May 2006
Адрес: Moscow
Сообщений: 40
Дубль три =) (Спасибо за терпение)

Основной файл:

Код:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" initialize="init()"
			   xmlns:my="hello">
	
	<fx:Declarations>
		<fx:XMLList id="xmll">
			<hello>
				<man>5 </man>
				<image>1.jpg</image>
			</hello>
			<hello>
				<man>6 </man>
				<image>1.jpg</image>
			</hello>
		</fx:XMLList>
		
		<s:XMLListCollection id="xmlc" source="{xmll}"/>
	</fx:Declarations>
	<s:layout>
		<s:VerticalLayout/>
	</s:layout>
	<s:List id="list" dataProvider="{xmlc}" selectedIndex="0" itemRenderer="Mit" />
</s:Application>

Старый 16.08.2010, 20:01
Dimitry_II вне форума Посмотреть профиль Отправить личное сообщение для Dimitry_II Найти все сообщения от Dimitry_II
  № 6  
Ответить с цитированием
Dimitry_II

Регистрация: Jan 2010
Сообщений: 211
Сразу приношу извинения - использую Хало, а у Спарка есть отличия, на что я и накололся сразу.
Вот вариант реализации (непроверенный, написанный тут). Суть реализации в том, что изменение геометрических размеров картинки будет произведено после ее загрузки (по умолчанию остается в высоту строки листа).
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:my="hello.*" autoDrawBackground="true">
 
	<fx:Script>
		<![CDATA[
			private _loader:SWFLoader = new SWFLoader();
			override public function set data(value:Object):void {
				super.data = value;
				if (value == null) return;
				_loader.load(value.image);
				_loader.addEventListener(Event.COMPLETE, onLoadImageCompleteHandler);
			}
			protected function onLoadImageCompleteHandler(event:Event):void {
				image.height = ...;
				image.source = _loader.content;
			}
		]]> 
	</fx:Script>
	<s:layout>
		<s:HorizontalLayout />
	</s:layout>
 
	<s:Image id="image" width="100" height="21"/>
	<s:Label text="{data.man}" fontSize="20"/>	
</s:ItemRenderer>

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

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

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


 


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


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