0

アイコンの上にラベルとメッセージを表示するカスタムを作成しましIconItemRendererた(私の場合は大きな画像です)。画像の読み込み中にラベルとメッセージの両方を非表示にしたい。そのため、デフォルトでそれらを非表示にしました。そして、画像が読み込まれると、それらが表示されるようにします。

override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
{
    super.layoutContents(unscaledWidth, unscaledHeight);

    setElementPosition(busyIndicator, (this.width - iconDisplay.width) / 2, (this.height - Dimensions.BUSY_INDICATOR_EDGE_LENGTH) / 2);
    setElementPosition(iconDisplay, (this.width - iconDisplay.width) / 2, 0);
    setElementPosition(labelDisplay, iconDisplay.x + 20, iconDisplay.y + iconDisplay.height / 4);
    setElementPosition(textFieldProductNumber, iconDisplay.x + 20, labelDisplay.y + labelDisplay.height + 10); 
    setElementPosition(messageDisplay, iconDisplay.x + 20, textFieldProductNumber.y + textFieldProductNumber.height);

    setElementSize(busyIndicator, Dimensions.BUSY_INDICATOR_EDGE_LENGTH, Dimensions.BUSY_INDICATOR_EDGE_LENGTH);
    setElementSize(textFieldProductNumber, labelDisplay.width, labelDisplay.height / 2);

    iconDisplay.addEventListener(Event.COMPLETE, onIconComplete);

    if(!isIconComplete)
    {
        busyIndicator.visible = true;
        iconDisplay.visible = false;
        labelDisplay.visible = false;
        textFieldProductNumber.visible = false;
        messageDisplay.visible = false;

    }
}

protected function onIconComplete(event:Event):void
{

    busyIndicator.visible = false;
    iconDisplay.visible = true;
    labelDisplay.visible = true;
    textFieldProductNumber.visible = true;
    messageDisplay.visible = true;  

    isIconComplete = true;

    iconDisplay.removeEventListener(Event.COMPLETE, onIconComplete);

    invalidateDisplayList();

}

すべて正常に動作しますが、別のビューをプッシュしNavigatorて、IconItemRendererがあるビューに戻ると、システムは別のIconItemRendererインスタンスを作成し、ラベル、メッセージ、または画像は表示されません(デフォルト値のため)。

では、以前のクレートされたIconItemRendererインスタンスをどのように使用できますか?

または、単一のインスタンス(シングル トーンなど)を使用することは可能ですか?IconItemRenderer

または、アイテム内のデータがすでに存在することを示すものはありますか?Event Dispathcer

4

2 に答える 2

0

モバイル デバイスの最適化として、モバイル アイテム レンダラー クラスが画像のキャッシュを行うと考えていることに注意してください (ブラウザーのキャッシュにある画像に依存する Web とは異なります)。これが、別の COMPLETE イベントを取得しない理由である可能性があります。

では、以前に作成した IconItemRenderer インスタンスをどのように使用できますか?

レンダリングの以前のインスタンスを再利用しようとしたり、期待したりしないでください。FlexListコントロールは、オブジェクト プーリングを使用してアイテム レンダラーをリサイクルします。リストは、コンテンツを画面に表示するために必要な数のレンダラーを作成します。リストをスクロールすると、これらのレンダラーを再利用して、スクロールして表示された新しい要素を表示します (これについては後で説明します)。この動作を回避しようとしないでください。かなり効率的です:)

または、単一の IconItemRenderer インスタンス (シングルトンなど) を使用することは可能ですか?

いいえ、上で述べたように、リストはオブジェクト プーリングを使用し、作成したレンダラー インスタンスを必要に応じて再利用します。ここでは、シングルトン パターンは実際には適用されません。

または、アイテム内のデータが既に存在することを示す Event Dispathcer はありますか?

「この画像は既に読み込まれています」というイベントを認識していません。ただし、Flex がアイテム レンダラーを使用する場合 (初回または再利用時)、dataレンダラーのプロパティが設定されます。プロパティのセッターはdata、「dataChange」イベントを送出します。

したがって、このイベントをリッスンするか、dataプロパティのセッターをオーバーライドして、レンダラーがいつデータを取得しているかを知ることができます。これで、使用できる 2 つのアプローチができました。

データが設定されたら、渡されたデータが新しいイメージを呼び出しているか、以前に表示されていたイメージを呼び出しているかを判別します。データが異なる場合は、COMPLETE イベントをリッスンして、現在行っているように画像がいつ読み込まれたかを確認します。

データが以前と同じである場合は、ラベル/メッセージ オブジェクトを表示するだけです。

bytesLoadedこれは機能する場合と機能しない場合があります...別のアイデアは、データが設定されているときに、またはbitmapData画像のプロパティをチェックして画像が読み込まれたかどうかを推測することです。

このようなことを行うことで、オーバーライドされたデータのセッター メソッド (または「dataChange」イベントのイベント ハンドラー) でイメージ/ラベル/メッセージ オブジェクトを表示して、イメージが既に読み込まれている場合を処理できます。

于 2013-02-11T08:25:37.183 に答える