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

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

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

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);
  • либо простым добавлением растрового объекта на основе источника

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

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

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

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

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

Чтобы использовать другой класс для визуализации, используйте TileList Стиль 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();
        }
    }
}
Другие вопросы по тегам