2008-07-07
2008-06-30
■[Flex3]PopUpButtonのエラー
こないだのエントリでちょっと触れましたが、PopUpButtonのポップアップClose中にPopUpButtonをremoveChild()するとエラーになる話。
動きを追ってみると、Tweenエフェクトが終わる前にpopupのインスタンスをnullにしてしまっているのが問題みたい。
removedFromStageイベントのハンドラです。
BugBaseにも上がってました。
厄介なのが、このTweenエフェクトの部分が一部mx_internal名前空間に隠れていて、手出しができないということ。
それなりに対策を考えてみましたが…。
- closeDurationを0に設定し、close()のエフェクトを事実上無効にする。
- popUpプロパティのインスタンスは一度ボタンをremoveするとnullになってしまうので、参照を他に残しておく。
itemRendererの内部にPopUpを持たせる場合、ふとした弾みでpopupが画面から消えないことがあり、これが野良コンポーネントになりやすい。
自分としては一つのpopupインスタンスをすべてのボタンで共有する方法を推奨します。
具体的には、
- アイテムレンダラーにはpopupのないButtonあるいはPopUpButtonを置く。
- 実際にpopupの親になるPopUpButtonを、visible=false、大きさ最小で用意する。rawChildrenで最前面に置く。
- listのitemClickイベントなどを使って押されたボタンを特定し、その位置に見えないボタンを移動する。
- 見えないボタンのpopupにポップアップするコンポーネントをセットし、open()で表示する。
アイテムレンダラーは大きなものを作ってしまうと、スクロール時に生成するためタイムロスが発生します。
ポップアップは基本的に一度に一つしか使わないので、押したときだけ作るのがよいかと。
2008-06-28
■[Flex3]ActionScript3アニメーション
「ActionScript3アニメーション」という本を本屋でみて、気に入ったので思い切って買いました。すげぇ高かったけど。
この本のいいところは、ちゃんと「グラフィカルな部分のロジックを文章で説明している」ところ。
実際のところ、巷のFlash本は初心者相手と見ているのか、画面写真でみせるタイプが多い。
これじゃFlexから入る人にはわからない。
かといって、Flex本も、いまのところそれほどいい本はないように思います。
こっちはその辺気を使って文法的なところとか書いてるけど、あまりにもFlexが多機能すぎるせいで、それらの紹介に終始しているような…。
Flashそのものまで詳細に説明し始めると、どう考えてもページが足りなくなるんですよ。
アドビも、そろそろFlashPlayerそのものの解説本を出すべきじゃないのかなぁ。
マイクロソフトがWindowsの解説本を出してるみたいに。ゴツいのをどかーんと。
で、気になったのが41ページの記述。
実際には削除する必要すらありません。なぜなら子は親を一つしか持つことは出来ないので、別の親に子を追加すると子は自動的に最初の親から削除されるのです。
秋葉原からの帰りのカフェでこの記述を目にして「しょ、しょんなバカなぁ〜!」と激しく動揺した僕は、そのまままっすぐ家に帰ってテストプログラムを組んでみたわけです。
その結果、「半分本当」という結論に達しました。
基本的にSpriteの場合は、本の記述の通り、親Aの子をそのまま親BにaddChildすると、親Aからはキレイにremoveされるようです。
しかし、Flexで一般に親として用いるContainerの派生クラス(子がIUIComponentでなければならないもの)については、削除時になにか情報が残っているようで、いったん削除した親にもう一度戻す際にエラーが発生しました。
このことを見る限り、Flexフレームワークについては、必ずしも約束された機能ではないようです。
ついでの話ですが、Flexのコンポーネントの削除について気になっている点です。
popupButtonがpopupを閉じかけているとき(つまりCloseのエフェクトが走っている状態)、popupButtonあるいはその親を不用意にremoveChildするとコケるようです。
これに限らず、removeChildの前には、子の中でエフェクトが走っているかどうかを確認したほうがいいのかもしれません。