将bitmapData加载到TileList AS3中

时间:2012-07-17 13:53:38

标签: actionscript-3 load bitmapdata tilelist

说我的舞台上有一个位图,我想将这个位图加载到TileList组件中。但是TileList的dataProvider请求URL链接作为参数而不是bitmapData传递。我该怎么办?

注意:我正在从Sqlite数据库加载bitmapdata,它存储为byteArray。哦,我正在使用AIR。

2 个答案:

答案 0 :(得分:2)

您可以将DisplayObject作为TileList项的源参数传递。 如果你有一个BitmapData最快的选项,那就是传递一个包含该bitmapData的Bitmap对象:

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

如果要执行自定义单元格渲染器路径,也可以执行此操作。 主要问题是UIComponent的getDisplayObjectInstance()方法不适合BitmapData。我想你可以继承ImageCell并进行所需的更改:

  • 通过覆盖getDisplayObjectInstance()并检查执行类似的操作:if(getQualifiedSuperclassName(classDef) == "flash.display::BitmapData") return new Bitmap(new classDef);
  • 通过简单地添加基于源的Bitmap对象

越简单越好,所以我建议尝试我的第一个建议。

答案 1 :(得分:1)

我没有使用过fl.controls.TileList,但似乎使用了与Flex组件类似的策略:item renderers。

在这种情况下,fl.controls.TileList的文档说:

  

此组件的默认单元格渲染器是ImageCell类。   ImageCell单元格渲染器显示缩略图图像和   单行标签。在TileList中呈现基于列表的单元格   组件,使用CellRenderer类。

在您的情况下,您想要的是指定一个只从dataProvider获取BitMapData并使用它来显示图像的类。

要为渲染器使用其他类,请使用TileList的{​​{3}}样式。

我还没有为Flash TileList创建自定义单元格渲染器,但是这里有一些可能有助于您入门的链接:

创建自己的自定义渲染器的基本方法是这样的:

<强> 1。创建一个扩展CellRenderer的新类:

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

<强> 2。覆盖data类的CellRenderer属性的setter方法:

TileList组件将为dataProvider中的每个元素创建一个渲染器。然后,它在每个渲染器上调用此setter方法以传入该元素的数据。在此setter中,您可以获取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();
        }
    }
}