1

私はコンポーネントを使用しており、現在 dataProvider が動作していますArrayCollection(これを XML ファイルにする方法について別の質問があります... しかし、私は脱線します)。

変数宣言は次のようになります。

[Bindable]
private var _dpImageList : ArrayCollection = new ArrayCollection([
    {"location" : "path/to/image1.jpg"},
    {"location" : "path/to/image2.jpg"},
    {"location" : "path/to/image3.jpg"}
]);

次に、次のように参照します。

<s:List
    id="lstImages"
    width="100%"
    dataProvider="{_dpImageList}"
    itemRenderer="path.to.render.ImageRenderer"
    skinClass="path.to.skins.ListSkin"
    >
    <s:layout>
        <s:HorizontalLayout gap="2" />
    </s:layout>
</s:List>

現在、各項目は非同期で処理されているようです。

ただし、それらを同期的に処理したい。

理由: 画像のリストを表示しています。一番左の画像を最初にレンダリングし、次にその右側の画像をレンダリングする、というようにします。


編集:

私はちょうどこの答えを見つけました。
それは同じ問題である可能性があると思いますか?

4

1 に答える 1

2

変数を宣言してバインディング ソースとして使用する代わりに、2 つのコレクションを宣言します。次に、onCreationComplete が loadNext() を呼び出して、オブジェクトを 2 番目の配列からシフトし、最初の配列にプッシュします。アイテムがレンダリングされたら (itemRenderer によってディスパッチされてキャッチされたカスタム イベント)、ソース配列が空になり、バインドされた dataProvider にすべての画像が含まれるまで、再度 loadNext() を呼び出します。

これが意味をなさない場合は、コードで記述できます。;)

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768" creationComplete="init()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            [Bindable]
            private var _source : ArrayCollection = new ArrayCollection([
                {"location" : "path/to/image1.jpg"},
                {"location" : "path/to/image2.jpg"},
                {"location" : "path/to/image3.jpg"}
            ]);         

            [Bindable] private var dataProvider:ArrayCollection;

            protected function init():void
            {
                this.lstImages.addEventListener( "imageLoaded", handleImageLoaded);
                loadImage()
            }

            protected function loadImage():void
            {
                if(this._source.length<=0)
                    return;
                var image:Object = this._source.getItemAt(0);
                dataProvider.addItem(image);
                this._source.removeItemAt(0);
            }

            protected function handleImageLoaded(event:Event):void
            {
                loadImage()
            }
        ]]>
    </fx:Script>
    <s:List
        id="lstImages"
        width="100%"
        dataProvider="{_dpImageList}"
        itemRenderer="path.to.render.ImageRenderer"
        skinClass="path.to.skins.ListSkin"
        >
        <s:layout>
            <s:HorizontalLayout gap="2" />
        </s:layout>
    </s:List>
</s:Application>

アイテム レンダラーのイメージの完全なハンドルがディスパッチされます。

protected function handleImageLoaded(event:Event):void
{
    owner.dispatch(new Event("imageLoaded"));
}

そして、それはあなたの画像をきれいな順序でロードするはずです.

于 2009-08-12T20:59:44.097 に答える