Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Обновить расположение элементов в List (http://www.flasher.ru/forum/showthread.php?t=143368)

DimG 14.08.2010 20:44

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

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

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


Спасибо.

Dimitry_II 15.08.2010 01:40

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

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

DimG 15.08.2010 17:03

Согласен, вопрос поставлен неточно=)

Итак. Я думаю, основной файл не имеет смысла приводить. Обычный лист. Вот 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=)

Dimitry_II 16.08.2010 03:06

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

DimG 16.08.2010 17:58

Дубль три =) (Спасибо за терпение)

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

Код:

<?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>


Dimitry_II 16.08.2010 20:01

Сразу приношу извинения - использую Хало, а у Спарка есть отличия, на что я и накололся сразу.
Вот вариант реализации (непроверенный, написанный тут). Суть реализации в том, что изменение геометрических размеров картинки будет произведено после ее загрузки (по умолчанию остается в высоту строки листа).
Код 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, время: 12:38.

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