загрузить bitmapData в TileList AS3

скажем, у меня есть растровое изображение на моей сцене, и я хочу загрузить это растровое изображение в компонент TileList. Но dataProvider TileList запрашивает URL-ссылки для передачи в качестве параметра, но не bitmapData. Как бы я это сделал?

ПРИМЕЧАНИЕ. Я загружаю растровые данные из базы данных Sqlite, в которой они хранятся как byteArray. Ой, и я использую AIR.


person astralmaster    schedule 17.07.2012    source источник
comment
Есть два TileList компонента от Adobe. Один для Flex и один для Flash CS5 (или чего-то еще). Какой вы используете?   -  person Sunil D.    schedule 17.07.2012
comment
тот, что для Flash, fl.controls.TileList.   -  person astralmaster    schedule 17.07.2012


Ответы (2)


Вы можете передать DisplayObject в качестве исходного параметра элемента TileList. Если у вас есть BitmapData, самым быстрым вариантом будет передача объекта Bitmap, содержащего эти bitmapData:

for(var i:int = 0 ; i < 10; i++) t.addItem({label:'item '+(i+1),source:new Bitmap(new YourBitapData())});

Если вы хотите использовать настраиваемый маршрут рендеринга ячеек, вы также можете это сделать. Основная проблема заключается в том, что метод getDisplayObjectInstance () UIComponent не обслуживает BitmapData. Я полагаю, вы могли бы создать подкласс ImageCell и внести необходимые изменения:

  • либо переопределив getDisplayObjectInstance () и выполнив проверку, выполнив что-то вроде: if(getQualifiedSuperclassName(classDef) == "flash.display::BitmapData") return new Bitmap(new classDef);
  • либо путем простого добавления объекта Bitmap на основе источника

Но чем проще, тем лучше, поэтому я рекомендую попробовать свое первое предложение.

person George Profenza    schedule 17.07.2012
comment
Спасибо вам большое за это! Я думал, что параметр «источник» может принимать только URL-адреса. Еще один вопрос: как мне позже получить bitmapData из TileList? - person astralmaster; 17.07.2012
comment
Свойство источника элемента снова извлекает объект Bitmap, поэтому вы можете перейти к свойству bitmapData: tileList.getItemAt(0).source.bitmapData. Немного не по теме: не уверен, поможет ли это, но кое-что нужно знать: кеширование - person George Profenza; 17.07.2012

Я не использовал fl.controls.TileList, но, похоже, он использует ту же стратегию, что и компоненты Flex: средства визуализации элементов.

В этом случае в документации к fl.controls.TileList сказано:

Средством визуализации ячеек по умолчанию для этого компонента является класс ImageCell. Средство визуализации ячеек ImageCell отображает эскиз изображения и однострочную метку. Чтобы отобразить ячейку на основе списка в компоненте TileList, используйте класс CellRenderer.

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

Чтобы использовать другой класс для средства визуализации, используйте TileList's стиль cellRenderer.

Я не создавал настраиваемое средство визуализации ячеек для Flash TileList, но вот несколько ссылок, которые могут помочь вам начать работу:

Базовый подход к созданию собственного настраиваемого средства визуализации будет примерно таким:

1. Создайте новый класс, расширяющий CellRenderer:

public class CustomRenderer extends CellRenderer
{
    public function CustomRenderer()
    {
        super();
    }
}

2. Переопределите метод установки для свойства data класса CellRenderer:

Компонент TileList создаст средство визуализации для каждого элемента в dataProvider. Затем он вызывает этот метод установки для каждого средства визуализации, чтобы передать данные для этого элемента. В этом установщике вы можете получить BitMapData и использовать его для рендеринга изображения. Ниже приведен непроверенный код, вероятно, есть более хороший способ сделать это (у нас есть хорошие ярлыки для этого типа вещей в Flex)

override public function set data(value:Object):void
{
    super.data = value;
    if (value != null && value.hasOwnProperty("propertyNameThatContainsBitMapData"))
    {
        var bmData:BitMapData = value["propertyNameThatContainsBitMapData"] as BitMapData;
        if (bmData)
        {
            var g:Graphics = this.graphics;
            g.beginBitMapFill(bmData);
            g.drawRect(0,0,100,100); // use whatever dimensions you want
            g.endFill();
        }
    }
}
person Sunil D.    schedule 17.07.2012
comment
спасибо за ссылки. Насколько я понимаю, мне нужно переопределить параметры dataProvider? Я сейчас ищу несколько примеров - person astralmaster; 17.07.2012
comment
Я отредактирую свой ответ, включив в него еще несколько деталей, извините, я ничем не могу помочь, кроме этого (я скорее разработчик Flex или просто AS3, не использую Flash CS5). - person Sunil D.; 17.07.2012
comment
Мне нравится решение @George Profenza, и я предлагаю вам следовать ему. Кажется, довольно прямолинейно! - person Sunil D.; 17.07.2012
comment
Спасибо и извините за беспокойство. - person astralmaster; 17.07.2012
comment
Мы бы этого не сделали, если бы мы тоже что-то не получили :) Думаю, мне очень нравится StackOverflow из-за того, что я узнаю из вопросов и ответов других людей! - person Sunil D.; 17.07.2012