前回よりは成長したブログ

2008-07-07

[]粉々エフェクト

突然ですが、メインのブログをはてなから移行しようかと考えています。

新しいコンテンツはこちらを中心に書いていきますので、よろしく。

前回よりも業の深いブログ

クリックするとコントロールが粉々に粉砕される(!)デモをソース付きでアップしました。

2008-07-01

[]内部のPopUpButtonを事前に閉じさせる

PopUpButtonが開いている間に親のパネルを最小化したい、というときに、そのままだとポップアップだけがその場に開いたままで都合が悪いことがあります。

とはいえパネルの中は複雑で、いちいちすべてのPopUpButtonを管理していられない・・・。

そんな状況に陥ったので解決策を探していたんですが、一応

  • 影響の出ない座標で事前にMouseDownイベントをディスパッチする

という方法で解決しました。

PopUpButtonのMouseDownOutSideイベントが働くので、きれいに閉じてくれます。

2008-06-30

[]PopUpButtonのエラー

こないだのエントリでちょっと触れましたが、PopUpButtonのポップアップClose中にPopUpButtonをremoveChild()するとエラーになる話。

動きを追ってみると、Tweenエフェクトが終わる前にpopupのインスタンスをnullにしてしまっているのが問題みたい。

removedFromStageイベントのハンドラです。

BugBaseにも上がってました。

厄介なのが、このTweenエフェクトの部分が一部mx_internal名前空間に隠れていて、手出しができないということ。

それなりに対策を考えてみましたが…。

  1. closeDurationを0に設定し、close()のエフェクトを事実上無効にする。
  2. popUpプロパティインスタンスは一度ボタンをremoveするとnullになってしまうので、参照を他に残しておく。

itemRendererの内部にPopUpを持たせる場合、ふとした弾みでpopupが画面から消えないことがあり、これが野良コンポーネントになりやすい。

自分としては一つのpopupインスタンスをすべてのボタンで共有する方法を推奨します。

具体的には、

  1. アイテムレンダラーにはpopupのないButtonあるいはPopUpButtonを置く。
  2. 実際にpopupの親になるPopUpButtonを、visible=false、大きさ最小で用意する。rawChildrenで最前面に置く。
  3. listのitemClickイベントなどを使って押されたボタンを特定し、その位置に見えないボタンを移動する。
  4. 見えないボタンのpopupにポップアップするコンポーネントをセットし、open()で表示する。

アイテムレンダラーは大きなものを作ってしまうと、スクロール時に生成するためタイムロスが発生します。

ポップアップは基本的に一度に一つしか使わないので、押したときだけ作るのがよいかと。

2008-06-28

[]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の前には、子の中でエフェクトが走っているかどうかを確認したほうがいいのかもしれません。

2008-06-27

[]デザイナの制約レイアウト対応って

ベータから製品版入れて、今になって気がついたんですが、ConstraintRowやConstraintColが、製品版のBuilderからはなくなってるんでしょうか…。

SDKにはあるものの、デザイナに出てこないっす。

試しに自分でConstraintRowタグを書いて、内部のコンポーネントにtop="row1:30"などと書くと、位置的には反映するみたい。

でもベータの頃に出ていたガイドなんかは表示されない。

見送りになったのかなぁ。