2

Flexでのグラフ作成に関する基本的なことが欠けています。チャートのx軸とy軸の制限を変更し、チャートの新しいデータ系列を提供する自動スケール機能を含むカスタムチャートコンポーネントを作成しています。カスタムチャートコンポーネントは次のようになります。

<s:Group ...>
   ...
   private function autoScale():void {
       ...
       // this is where I compute newXmin, newXmax, newYmin, newYmax, startIndex, endIndex
       ...
       haxis.minimum = newXmin;
       haxis.maximum = newXmax;
       vaxis.minimum = newYmin;
       vaxis.maximum = newYmax;
       myChart.series.dataProvider = myData.slice(startIndex, endIndex+1);
   }
   ...
   <mx:LineChart id="myChart">

       <mx:horizontalAxis>
           <charts:MyAxis id="haxis" labelFunction="setXLabels()"/>
       </mx:horizontalAxis>

       <mx:verticalAxis>
           <mx:LinearAxis id="vaxis" labelFunction="setYLabels()"/>
       </mx:verticalAxis>

   </mx:LineChart>
   ...
</s:Group>

ユーザーはいつでもズームイン/ズームアウト(コードは表示されていません)でき、autoScale()関数を呼び出します。

私の考えでは、間違っている場合は訂正してください。上記のプログラムは、チャートを5回再描画します(関数に表示されるコードの各行に1回)autoScale()。Flexにコンポーネントへの変更の再描画を無視するように指示することはできますか? 「OK、必要なものをすべて設定しました。先に進んでグラフを再描画してください」という特定のコマンドを発行しますか?

私はについて読んinvalidateDisplayListでいますが、これが意図されたアプリケーションであるかどうか、もしそうなら、ここでそれを適用する方法を理解することができませんでした。カスタムコンポーネントにデータを出し入れするために使用される関数と関数invalidateDisplayListのカスタムコンポーネントに適用されるのを見たことがあります(たとえば、ここを参照)。上記の例では、説明しているプロパティはすべてカスタムコンポーネント内(関数など)で設定されています。それが違いを生むかどうかはわかりません。setgetautoScale()

アドバイスをいただければ幸いです。

4

1 に答える 1

4

Flexのコンポーネントのライフサイクルでは、説明したステートメントでプロパティが5回変更されるため、グラフが5回再描画されるのを防ぐことができます。これが、ライフサイクルの美しさです。

つまり、ほとんどのプロパティの変更はすぐには描画に変換されませんが、代わりに、プロパティが変更されたことを示すフラグが立てられます。このようなプロセスは無効化と呼ばれます。その後、コンポーネントは次の再描画サイクル(通常はフレーム後)まで待機します(Flashはフレームベースのアニメーション環境です)。再描画が発生すると、コードはすべての状況を総合的に評価できます。

Flexのライフサイクルは、きめ細かい無効化を提供します。開発者は、、、および(Sparkコンポーネントの場合)から invalidateProperties()選択でき ますinvalidationSize()。Flexがこれらの無効化を「検証」するライフサイクルを通過すると、検証を実行するために、、、が呼び出されます。コンポーネントのライフサイクルの詳細については、ここここ、およびここを参照してください。invalidatDisplayList()invalidateSkinState()commitProperties()measure()updateDisplayList(w, h)getCurrentSkinState()

あなたの場合、チャートコンポーネントが特定のプロパティを適切に無効にしない限り、自分で無効にする必要はありません。無効化または検証メソッドを呼び出す必要はありません。

于 2012-07-24T14:11:47.220 に答える