【问题标题】:load bitmapData into TileList AS3将 bitmapData 加载到 TileList AS3
【发布时间】:2012-07-17 13:53:37
【问题描述】:

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

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

【问题讨论】:

  • 有两个来自 Adob​​e 的 TileList 组件。一个用于 Flex,一个用于 Flash CS5(或其他)。你用的是哪一个?
  • 用于 Flash 的 fl.controls.TileList。

标签: actionscript-3 load bitmapdata tilelist


【解决方案1】:

您可以将 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);
  • 或者通过简单地添加一个基于源的位图对象

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

【讨论】:

  • 非常感谢您!我虽然 'source' 参数只能接受 URL。还有一个问题,我以后如何从 TileList 中检索 bitmapData?
  • 项目的源属性再次检索 Bitmap 对象,因此您可以访问 bitmapData 属性:tileList.getItemAt(0).source.bitmapData。有点偏离主题:不确定是否有帮助,但需要注意:caching
【解决方案2】:

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

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

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

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

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

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

创建自己的自定义渲染器的基本方法如下:

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

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

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

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();
        }
    }
}

【讨论】:

  • 感谢您的链接。据我了解,我必须覆盖 dataProvider 的参数?我目前正在寻找一些例子
  • 我将编辑我的答案以包含更多细节,对不起,我无能为力(我更多的是 Flex 或只是纯 AS3 开发人员,不要使用 Flash CS5)。
  • 我喜欢@George Profenza 的解决方案,并建议您遵循它。看起来很简单!
  • 感谢并抱歉打扰您。
  • 如果我们也没有从中得到什么,我们就不会这样做 :) 我想我非常喜欢 StackOverflow,因为我从其他人的问题和答案中学到了东西!
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2018-05-14
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多