0

Flexで異なるグラフを切り替えるアプリケーションがあります。各グラフはそれ自身の状態です。MXMLでは、状態が変化したときに画像のソースが変化するように設定しています。

<s:Image id="chartImage"
         source.all="{ callImages.all }"
         source.classA="{ callImages.classB }"
         source.classB="{ callImages.classA }"
         />

画像を正常に変更するボタンがあります。しかし、私はラインの後に発生する小さなバグがあります

this.currentState = chartName;

私のコードはグラフ画像ソースが変更されることを期待していましたが、s:Image要素への実際の変更は、関数が終了して画面が更新されるまで発生しないようです。したがって、chartImage.heightを取得するときは、私が残した状態の古いものを使用します。

次の行でそれらの寸法を使用して計算できるように、新しい画像(したがってその寸法)を取得する方法はありますか?これまでのところ、chartImage.heightは状態が変化する前の高さを返しますが、関数の実行後は異なります。

ほんの一瞬後にティマーを実行し、そこで行を実行することができ、それは機能します。ただし、画面をレンダリングしてからコードを続行するように指示したいと思います。これは可能ですか?もっとエレガントに見えます。

4

2 に答える 2

2

次の行でそれらの寸法を使用して計算できるように、新しい画像(したがって寸法)を取得する方法はありますか?

各 Flex コンポーネントは、Flash Player のレンダリング メカニズムの上に構築された独自の検証サイクルを通過する必要があります。Google でFlash/Flex Elastic Racetrackを検索すると、これに関するすばらしい投稿がいくつかあります。

ただし、 validateNow()メソッドを呼び出すことで、コンポーネントにその検証メソッドを直線的に実行させることができます。

特に状態遷移がある場合は、currentState 変数を設定した後、Image のプロパティがまだ変更されていない可能性があります。

于 2012-12-12T00:07:26.827 に答える
1

通常、Flexで画像のソースを変更して、すぐに(「次の行で」)高さを確認することはできません。例外は、ソースが生のビットマップである場合ですが、それでもFlexのレイアウトフレームワークはさまざまな要因があるので、これに依存しません。

これはFlexの典型的な問題です。フレームワークの美しさ(そして悲惨さ)は、アプリの応答性を最大化するために変更を段階的にレンダリングすることです。このプロセスの詳細に関する大量のリソースについては、Googleの「フレックスコンポーネントライフサイクル」を参照してください。

これに対処する方法はいくつかあります。通常、バインディング式を使用することをお勧めします。これは、非同期レイアウトの変更というまさにこの理由で設計されているためです。それらを使いすぎないでください。ただし、コードベースをシンプルかつ柔軟に保つための確かなツールです。

mxmlを介してSparkImageの高さにバインドできます。

<s:Image id="chartImage" />
<s:Label id="debugLabel" text="{ 'Height of chartImage: ' + chartImage.height }" />

ただし、ロジックを実行する必要がある場合は、BindingUtils(スクリプトブロック内)を使用することをお勧めします。

import mx.binding.utils.BindingUtils;

protected function someOtherFunctionBlock():void
{
    BindingUtils.bindSetter( handleHeigtChange, image, "height" );
}

protected function handleHeigtChange( value:Number ):void
{
   // Deal with value change
}
于 2012-12-12T00:13:02.567 に答える