Flash CS3 ではコンポーネントの親クラスを指定できます。指定する親クラスには提供されているクラス (MovieClip など) だけでなく、それらのクラスを自分で拡張したものも利用できます。今回は Flash Integration Kit が提供する UIMovieClip を拡張して利用するケースを紹介します。
カスタムイベントの利用
UIMovieClip は標準的な Flex コンポーネントのイベントが一通り定義されています。そのため Flash CS3 で作成したコンポーネントでも特別な追加作業なしで大きさや位置の変化をイベントを発行して Flex フレームワークに通知することができます。
もし、それ以外のカスタムイベントが必要な場合には、UIMovieClip を拡張して新しいクラスを作成し、そこに必要なカスタムイベントを定義します。そしてこの新しく作成したクラスを Flash コンポーネントの親クラスとして定義するとカスタムイベントが利用可能になります。
以下に簡単な例を紹介します。AlarmClock というクラスが、設定された時刻になると alarmEvent をディスパッチするという設定です。
まず Event メタデータをクラス定義に追加します。
[Event("alarmEvent")] public class AlarmClock extends UIMovieClip { // ここに必要なクラス定義を記述 }
AlarmClock クラスは UIMovieClip のサブクラスになっています。
次にムービークリップを作成し、実際にイベントをディスパッチするコードを記述します。(もちろんイベントをディスパッチするコードはクラス定義の中に記述するということにしてもかまいません)
// 例えばムービークリップのタイムラインのフレーム内に if (currentTime == alarmTime) { dispatchEvent(new Event("alarmEvent")); }
これでムービークリップの親クラスとして AlarmClock を指定すれば Flash 側の作業は完了です。Flex 側では下のようにして alarmEvent を他のイベントと同様に利用できます。
<myComps:Clock alarmEvent="showAlarm()" />
スクリプトによるサイズ設定
measuredWidth と measuredHeight は”標準値として使用される” Flex コンポーネントの幅と高さをしめす属性です。UIMovieClip にもこの属性があります。Flash コンポーネントの親コンポーネントが十分な大きさを持っていれば Flash コンポーネントの幅と高さは大抵 measuredWidth と measuredHeight の値になります。
measuredWidth と measuredHeight の get を上書きすると親コンポーネントに通知する大きさを設定することができます。下の例のようにそれぞれの属性の get を上書きします。
package { import mx.flash.UIMovieClip; public dynamic class UIMCChild extends UIMovieClip { override public function get measuredWidth():Number { return _widthOfMyWish; } override public function get measuredHeight():Number { return _heightOfMyWish; } } }
さて、Flex では親コンポーネントが子コンポーネントの大きさを設定する際 setActualSize() メソッドを呼びます。その際に設定される大きさはコンポーネントが期待していた大きさになるとは限りません。
このような場合 setActualSize() メソッドを上書きすることで Flash コンテンツ側の大きさが変更された際に対応するロジックを記述することができるようになります。
package { import mx.flash.UIMovieClip; public dynamic class UIMCChild extends UIMovieClip { override public function setActualSize(newWidth:Number, newHeight:Number):void { if (newWidth != _width || newHeight != _height) { _width = newWidth; _height = newHeight; // ここで必要な処理があれば記述 // 例えば子オブジェクトの再配置など } } } }
コメントする