0

ステージにビットマップがあり、このビットマップを TileList コンポーネントにロードしたいとします。ただし、TileList の dataProvider は URL リンクをパラメーターとして渡すように要求しますが、bitmapData では渡しません。どうすればいいですか?

注: byteArray として格納されている Sqlite データベースから bitmapdata をロードしています。ああ、私は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 から取得し、それを使用して画像を表示するクラスを指定することです。

レンダラーに別のクラスを使用するには、TileListcellRendererスタイルを使用します。

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();
        }
    }
}
于 2012-07-17T16:50:37.853 に答える