2009-05-22 1 views
1

У меня есть arrayCollection объектов, которые расширяют Sprite, и имеют растровые изображения внутри них.можно отобразить массивСоллекция спрайтов в компоненте List?

Я хочу, чтобы отобразить их в списке

Когда я делаю (или какой-либо другой компонент, который позволит пользователю просматривать их и видеть связанные с ними данные.): 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); 
     } 
    } 

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

+0

Можете ли вы обновить сообщение с помощью кода для вашего списка и рендеринга элементов? –

+0

Кстати, вы не можете расширять UIComponent чем угодно, кроме конструктора null-arg. –

+0

Мой список и элемент рендеринга пока что не работают, что было бы бессмысленно публиковать их здесь. То, что мне действительно нужно, - это предложение о том, как будет выглядеть код для получения массива объектов, подобных описанному выше, в список. Я использовал аргументы расширенного UIComponent, и, похоже, он отлично работает в других местах. – Martholomew

ответ

0

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

+0

Спасибо. Более подробная информация о том, как это сделать, будет очень полезна. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как получить этот объект Sprite для отображения в компоненте mx. Я не могу установить его как источник для mx: Image. Так что же может сделать код для этого? – Martholomew

+0

Попробуйте использовать простой контейнер, например Canvas, и вызовите его метод addChild(), передающий Sprite в качестве аргумента. Он должен появиться в верхнем левом углу. –

+0

Вот что у меня есть, но это не работает. Может быть, вы можете предложить предложение о том, как это исправить: <тх: Список идентификаторов = "MyList" DataProvider = "{myDP}"> \t <тх: ItemRenderer> <тх: Component> <тх: Холст creationComplete = «AddChild (данные)» /> Martholomew

0

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

0

Здесь, попробуйте использовать 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(); 
     } 
    } 
} 
Смежные вопросы