![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: May 2006
Адрес: Moscow
Сообщений: 40
|
Всем привет.
Я завожу List, в каждом его элементе есть текст и картинка. Картинка -- отнаследованный от Image класс, который позволяет (в зависимости от того, какое сво-во инициализировано, setHeight или setWidth) задавать ее размеры, не меняя масштабов. Изменение масштаба производится по событии initialize (или creationComplete, что, как выяснилось, сути проблемы не изменяет). Все получается, но элементы списка остаются размеров таких, как будто ничегог не масштабировалось. Т.е., по всей видимости, список загружается, грузится содержимое с картинками, элементы его размещаются и только после этого изменяется масштаб картинок. Перераспределение элементов списка уже не происходит. Вопросы: 1. как заставить список обновить отображение 2. как правильно поставленную задачу реализовать без извратов(может я в корне неверно делаю) 3. нужно ли в таких вещах использовать геттеры/сеттеры или остановиться на добавлении новый свойств в классе. Спасибо. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 211
|
1. creationComplete выполняется только при загрузке данного окна/формы. Если делать переходы, то повторно это событие выполняться не будет. Возмножно, в твоем приложении так и должно быть, или планируется каждый раз создавать форму.
2. Из описания непонятно каким образом происходит отображение картинки. Если простой загрузкой - source указывает на адрес картинки, то такое поведение естественно: установка размеров произойдет после загрузки картинки - явно после отображения списка. 3. Непонятна поставленная задача - "расположение элементов", "перераспределение". О чем речь? - О сортировке элементов в списке? - Это отдельный механизм, хорошо реализованный во флексе. Плиз, более конкретно изложи задачу. Желательно с кодом, чтобы вносить изменения, а не мудрить сначала. |
|
|||||
|
Регистрация: 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>
<?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. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 211
|
Что это в первом листинге: <s:ItemRenderer и т.д.?
Если ты в листе прописываешь атрибут itemRenderer и указываешт ему свой класс, то почему класс является потомком ItemRenderer? - Вроде должен быть контейнером. Или я чего-то не понимаю? Второе: если честно, то я не знаю как поведет себя initialize в классе MImage. Принято делать сеттеры в классе. А для быстрого обновления в сеттере устанавливаешь не только приватное свойство ширины, но и вычисляешь приватное свойство высоты. В этом случае ширина и высота просчитается гарантийно сразу. И третье: с листингов так и непонятно значение source имиджа. Интереснее всего листинг образования твоего листа, а не начинки. |
|
|||||
|
Регистрация: 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>
|
|
|||||
|
Регистрация: Jan 2010
Сообщений: 211
|
Сразу приношу извинения - использую Хало, а у Спарка есть отличия, на что я и накололся сразу.
Вот вариант реализации (непроверенный, написанный тут). Суть реализации в том, что изменение геометрических размеров картинки будет произведено после ее загрузки (по умолчанию остается в высоту строки листа). <?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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|