FlexでTweenerを使用するときの注意点

mxmlでアプリケーションを作っていると、addChildした瞬間と、実際にエレメントが表示される時間が異なる。


Flexを使っていなければ、すぐに表示されるけど、Flexを使用している場合はpreinitialize, initialize, creationComplete等のイベントを発行し、順次エレメントを作成する。そして、creationCompleteが呼ばれるタイミングで表示される。
だから、下のようなコードはうまく動かず、tweenが終わった頃にエレメントが表示されてしまって、タイミングがあわない。

private function createBox(event:MouseEvent):void {
        var box:Study16Box = new Study16Box();
        var gP:Point = new Point(event.stageX, event.stageY);
        var lP:Point = c.globalToLocal(gP);
        box.x = lP.x;
        box.y = lP.y;
        c.addChild(box);
        Tweener.addTween(box, {time: 1, x: lP.x + 100, transition: 'easeOutBack'});
}

こんなふうになる。


つまり、creationCompleteの時点で表示されるのであれば下のようにコードを書けば良い

private function createBox(event:MouseEvent):void {
        var box:Study16Box = new Study16Box();
        var gP:Point = new Point(event.stageX, event.stageY);
        var lP:Point = c.globalToLocal(gP);
        box.x = lP.x;
        box.y = lP.y;
        c.addChild(box);
        box.addEventListener('creationComplete', function(event:Event):void {
                Tweener.addTween(box, {time: 1, x: lP.x + 100, transition: 'easeOutBack'});
        });
}

で、こんな風になる

見やすいように無名関数で書いたけど、Study16Boxの中に書くのが奇麗かな。