说我的舞台上有一个位图,我想将这个位图加载到TileList组件中。但是TileList的dataProvider请求URL链接作为参数而不是bitmapData传递。我该怎么办?
注意:我正在从Sqlite数据库加载bitmapdata,它存储为byteArray。哦,我正在使用AIR。
答案 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并进行所需的更改:
if(getQualifiedSuperclassName(classDef) == "flash.display::BitmapData") return new Bitmap(new classDef);
越简单越好,所以我建议尝试我的第一个建议。
答案 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();
}
}
}