0

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

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

4

2 回答 2

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);
  • 通过简单地添加基于源的位图对象

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

于 2012-07-17T18:03:37.793 回答
1

我没有使用过 fl.controls.TileList,但它似乎使用了 Flex 组件使用的类似策略:项目渲染器。

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

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

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

要为渲染器使用不同的类,请使用TileListcellRenderer样式。

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

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

1. 创建一个扩展 CellRenderer 的新类:

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

data2.重写类属性的setter方法CellRenderer

TileList组件将为dataProvider. 然后它在每个渲染器上调用这个 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();
        }
    }
}
于 2012-07-17T16:50:37.853 回答