возможно ли отобразить массив спрайтов в компоненте списка?

У меня есть arrayCollection объектов, которые расширяют Sprite и имеют в них растровые изображения.

Я хочу отобразить их в списке (или каком-либо другом компоненте, который позволит пользователю прокручивать их и видеть связанные с ними данные).

Когда я это делаю: myList.dataProvider = myArrayCollection

список просто показывает кучу строк [Object, Item] вместо визуальных спрайтов.

Вот упрощенная версия моего объекта:

public class myUIC extends UIComponent
    {

        public var mySprite:Sprite = new Sprite;

        [Embed(source="assets/BGimage.png")]
        public var BGimage:Class;

        public var myBitmap:Bitmap;
        public var wordText:TextField = new TextField;

        public function myUIC(myWord:String)
        {
            this.wordText.text = myWord;
            this.myBitmap = new BGimage;
            this.mySprite.addChild(this.myBitmap);
            this.mySprite.addChild(this.wordText);
            this.addChild(this.mySprite);
        }
    }

Пробовал много разных способов заставить его отображаться в списке, но не может этого сделать.


person Martholomew    schedule 22.05.2009    source источник
comment
Можете ли вы обновить свой пост с кодом для вашего списка и средства визуализации элементов?   -  person cliff.meyers    schedule 25.05.2009
comment
Между прочим, вы не можете расширить UIComponent ничем, кроме конструктора с нулевым аргументом.   -  person cliff.meyers    schedule 25.05.2009
comment
мой список и визуализатор элементов настолько далеки от работы, что было бы бессмысленно публиковать их здесь. Что мне действительно нужно, так это предложение о том, как будет выглядеть код для получения arrayCollection объектов, подобных приведенному выше, в список. Я использовал аргументы расширенного UIComponent, и в других местах он работает нормально.   -  person Martholomew    schedule 25.05.2009


Ответы (4)


См. этот учебник: Примеры Flex — отображение значков в элементе управления гибким списком

person tst    schedule 25.05.2009

Похоже, вы можете попробовать написать простой рендерер элементов (возможно, основанный на UIComponent), который добавляет связанный спрайт в список отображения рендеринга с помощью addChild().

person cliff.meyers    schedule 23.05.2009
comment
Спасибо. Более подробная информация о том, как это сделать, была бы очень полезна. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как заставить этот объект Sprite отображаться в компоненте mx. Я не могу установить его в качестве источника для mx:Image. Так как же может выглядеть код для этого? - person Martholomew; 23.05.2009
comment
Попробуйте использовать простой контейнер, такой как Canvas, и вызовите его метод addChild(), передав Sprite в качестве аргумента. Он должен появиться в левом верхнем углу. - person cliff.meyers; 23.05.2009
comment
Вот что у меня есть, но это не работает. Возможно, вы можете предложить, как это исправить: ‹mx:List id=myList dataProvider={myDP}› ‹mx:itemRenderer› ‹mx:Component› ‹mx:Canvas CreationComplete=addChild(data)/› ‹/mx :Component› ‹/mx:itemRenderer› ‹/mx:List› - person Martholomew; 24.05.2009
comment
приведенный выше код возвращает ошибку: Неявное приведение значения со статическим типом Object к возможно несвязанному типу flash.display:DisplayObject. - person Martholomew; 24.05.2009
comment
и когда я делаю addChild (данные как Sprite), он компилируется, но затем выдает ошибку во время выполнения: Ошибка приведения типа: невозможно преобразовать com.myApp::mySpriteClass@22f75ba1 в mx.core.IUIComponent.) - person Martholomew; 24.05.2009
comment
Наряду с ответом brd6644 помогают следующие два сообщения: tdotblog.info/?q=node/10 и streamhead.com/ - person Martholomew; 24.05.2009
comment
Можете ли вы опубликовать исходный код для вашего пользовательского класса спрайтов? Или он слишком большой? - person cliff.meyers; 24.05.2009
comment
Я могу заставить его отображаться на холсте, но не тогда, когда я пытаюсь поместить его в список или повторитель... public class myUIC extends UIComponent { public var mySprite:Sprite = new Sprite; [Встроить (источник = активы/BGimage.png)] public var BGimage:Class; общедоступная переменная слово: строка; общедоступная переменная myBitmap: Bitmap; private var wordText:TextField = новое текстовое поле; публичная функция myUIC(myWord:String) { this.wordText.text = myWord; this.myBitmap = новый BGimage; this.mySprite.addChild (this.myBitmap); this.mySprite.addChild (this.wordText); this.addChild(this.mySprite); } } - person Martholomew; 24.05.2009
comment
Можете ли вы опубликовать свой код в своем основном посте, чтобы он был более читабельным? - person cliff.meyers; 24.05.2009
comment
ой, не знала, что это возможно. :) - person Martholomew; 24.05.2009

попробуйте rawChildren.addChild для добавления Sprite

person Community    schedule 21.07.2009

Здесь попробуйте использовать itemRenderer примерно так. Он должен работать с любым универсальным DisplayObject. Он захватывает ширину и высоту из назначенного свойства данных, поэтому вам может потребоваться установить для variableRowHeight значение true в вашем фактическом списке, чтобы он работал должным образом.

package
{
    import flash.display.DisplayObject;
    import mx.controls.listClasses.IListItemRenderer;
    import mx.core.UIComponent;
    import mx.events.FlexEvent;

    /*
    Extending UIComponent means we can add Sprites (or any DisplayObject)
    with addChild() directly, instead of going through the rawChildren property.
    Plus, in this case, we don't need the extra overhead of Canvas's layout code.

    IListItemRenderer lets us use it as a List's itemRenderer. UIComponent already
    implements all of IListItemRenderer except for the data property
    */
    public class SpriteRenderer extends UIComponent implements IListItemRenderer
    {
        // Implementing the data property for IListItemRenderer is really easy,
        // you can find example code in the LiveDocs for IDataRenderer
        private var _data:Object;

        [Bindable("dataChange")]
        public function get data():Object
        {
            return _data;
        }

        public function set data(value:Object):void
        {
            if (value !== _data) {

                // We need to make sure to remove any previous data object from the child list
                // since itemRenderers are recycled
                if (_data is DisplayObject && contains(_data as DisplayObject)) {
                    removeChild(_data as DisplayObject);
                }

                _data = value;

                // Now we just make sure that the new data object is something we can add
                // and add it
                if (_data is DisplayObject) {
                    this.width = (_data as DisplayObject).width;
                    this.height = (_data as DisplayObject).height;

                    addChild(_data as DisplayObject);
                }

                dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
            }
        }

        public function SpriteRenderer()
        {
            super();
        }
    }
}
person krichard    schedule 28.07.2009