Home > Flex2
Flex2 Archive
[Flex]コンポーネントのサイズがゼロになる?
- 2008-01-19 (Sat)
- FlexFramework | ActionScript3.0 | Flex3 | Flex2
Frog on AIRさんのサイトで、こんな記事がありました。
記事の内容は、mx.controls.Butttonのインスタンスを生成した直後に、widthとheightの値を確認すると0になってしまう。というようなものです。
実際僕も何か作っているとき、同じような状況を何度も経験しました。
ホント大ハマリして、何時間も費やしたり・・・。
自分の備忘録も兼ねて、少しこのあたりを書き残しておきます。
クラスの種類
Flex2のリファレンスで説明されているクラスの中には、
純粋なActionScript3.0のクラスとFlex2のクラスの2種類があります。
純粋なActionScript3.0のクラスとは、
Array、Number、SpriteやTextFieldなどのクラスで、
importするときのクラスパスが、flash.~のものです。
対して、Flex2のクラスとは、
UIComponent、Button、Alert、PopUpManagerなどなど、
importするときのクラスパスが、mx.~のものです。
純粋なActionScript3.0のクラスというのは、
ActionScript3.0という言語でプログラミングをする場合には基本的に使えるクラスで、
FlexBuilder2でもFlashCS3でも使えるはずです。
一方Flex2のクラスというのは、
上記純粋なActionScript3.0のクラスを拡張(継承)したクラスで、
Flex2SDKのコンパイラでは一緒に提供されているだけです。
Flex2のクラスというのは、つまり、ActionScript3.0でプログラムする場合に、
使用できるオプション的なクラス郡になります。
例えばButtonクラスならSpriteを継承したクラスFlexSprite、
をさらに継承したUIComponentクラス、
をさらに継承したものがButtonクラスです。
Flex2のクラス
Flex2のクラスはFlexフレームワーク上で動作することを前提に作成されています。
つまりいくつかのフレームワークのルールに従う必要があるということです。
このルールのひとつとしてFlex2フレームワークを用いる場合には、
多くの便利なビジュアルコンポーネントを利用できるようになる代わりに、
独自のDisplayObjectを表示させたい場合には、
UIComponentクラスを継承しなければならないというルールがあります。
(IUIComponentインターフェースでもいいのかな・・・?)
UIComponentクラスでは、
コンストラクタでは最低限のプロパティとイベントリスナの初期化しか行いません。
(このため、インスタンス生成直後にはwidthなどは0になります。)
コンポーネントがDisplayObjectのツリー上にaddChildされるたあと
initialize()メソッドが呼ばれ、描画に必要なプロパティの一部がセットされます。
その後、実際に描画されるタイミングでupdateDisplayListというメソッドで、
レイアウトやサイズ等の値が計算され(ここでwidth等の値が確定します)、描画されます。
もちろんaddChildメソッドもoverrideして、子DisplayObjectを自身に追加する際には、
子DisplayObjectのinitializeメソッドを呼び出すようにしてあります。
と、いうことで一番初めのButtonクラス生成直後にwidth、heightの値が0となる件にやっと繋がりました。Flex2のDisplayObject系のクラスでは、処理の無駄を省くため、プロパティ実際のビジュアル部分のレイアウトやサイズ等の計算は次の描画タイミング時まで保留されます。そのため、すぐにwidthやheightの値を取得することができません。
以下、対応策の案としては、
1.Flex2のクラスを使わない
元も子もないですが、使わないというのも一手ですよね。
全部flashパッケージ内から賄い、足りない部分は自分で作る、と。
ボタンくらいだったら、SimpleButtonクラスでも十分なことも多いです。
2.callLaterメソッド
UIComponentクラスで定義されているcallLaterメソッドを使います。
(参考:callLaterメソッドの使用)
callLater() メソッドは、現在の更新ではなく、次の画面更新で実行する処理をキューに格納します。
つまりcallLater(hogeMethod)を用いることで、
コンポーネントが描画される(描画用のレイアウト・サイズ計算処理などが終了した)ときに
hogeMethodが呼ばれるので、widthなどの値を取得することができます。
今回のように初期化時だけであれば、
creationCompleteイベントをハンドルしても良いかもしれませんね。
- Comments: 2
- Trackbacks: 0
[as3][lib]Go animation system
- 2007-12-17 (Mon)
- ActionScript3.0 | Library | Flex3 | Flex2
Flexからアニメーションをガリガリ作る時の標準は今はTweenerライブラリなんでしょうかね?
新しく開発中っぽいアニメーション用のライブラリを見つけたのでメモ。
Go animation system
(現在 closed betaらしい)
* とても軽量(およそ4K)
* 柔軟な設計で、高い拡張性を持つ。
* Fuseのようになんでもできるというようなものではない。
* ただし。Goを使ってFuseのようなものを作ることはできる。
* Goは特殊な書き方を要求しない。
* Goのエンジンは10から20000ものアニメーションを動かすことができる。
* 物理エンジンや3Dエンジンと一緒に使えるよう設計されている。
* GoのアプローチはCairngormフレームワークにインスパイアされている。
だ、そうです。
「物理エンジンや3Dエンジンと一緒に使えるよう設計されている。」ってのが興味深いですね。
- Comments: 0
- Trackbacks: 0
[IDE]ActionScript3.0(Flex3・AIR)の開発環境構築(3)
- 2007-11-18 (Sun)
- ActionScript3.0 | AIR | Flex3 | Flex2
FlashDevelop3.0.0 Beta4が出ましたね。
設定の仕方は、こちら
[IDE]ActionScript3.0(Flex3・AIR)の開発環境構築(1)
[IDE]ActionScript3.0(Flex3・AIR)の開発環境構築(2)
に書きましたが、少し設定の方法も変わったようなので、
FlashDevelop3.0.0 Beta4でFlex/AIR対応させるやり方を新しく書きます。
(自分用の備忘録に近いですが・・・)
まず、FlashDevelop3.0.0をインストールをしましょう。
とりあえずFlashDevelopを起動できるところまでいったら、
文字コードの設定をします。
Tools -> Program Settings で、設定ダイアログを開きます。
左側の項目からMain FlashDevelopを選択し、「その他」の項目の「Default CodePage」
をUTF8にします。ドロップダウンで選択するだけなので簡単ですが、
この設定をしないと日本語のコメントなどがかけません。
続いてFlex3コンパイラの設定をします。
設定ダイアログの左側の項目から、Plugins AS3Contextを選択し、
「Flex 2 SDK Location」の項目にFlex3のパスを指定します。
この指定をするときに結構間違うらしいのですが、mxmlcなどがあるbinフォルダ
をしていると上手く動きません。その上のbinフォルダを含むフォルダを指定です。
それから、コード補完用のファイルを設定します。その辺の設定は、
[IDE]ActionScript3.0(Flex3・AIR)の開発環境構築(1)のままですね。
そしてここがBeta4のキモです。なんとこのままではコンパイルが上手くいきません。
Flex3 Beta3ではfcshが日本語対応したためにFlashDevelopで上手く動かなくなっているのだそうです。ちなみにfcshとは、コンパイルの状態をキャッシュして二度目以降のコンパイル速度を上げるものです。Flex3のsdkには同梱されています。
[ActionScript3]FlashDevelopとFlex 3 SDK beta 2の相性が悪いのを何とかする
こちらの記事を参考にコンパイラの設定を直します。
sdkのbinフォルダ内に「jvm.config」というファイルがあるので、このファイルをエディタで開きます。
# Arguments to VM
java.args=-Xmx384m -Dsun.io.useCanonCaches=false
この部分を、
# Arguments to VM
java.args=-Xmx384m -Dsun.io.useCanonCaches=false -Duser.language=en
と追記して保存しておきます。これでfcshが英語で起動するようです。
とりあえず、ここまででFlashDevelopでコンパイルができるはずです。チェックしてみましょう。
AIRプロジェクトの設定についてはほとんど、[IDE]ActionScript3.0(Flex3・AIR)の開発環境構築(2)と同じですが、色々バージョンアップして違うところもあるので、また次回書きます。
ではでは。
- Comments: 0
- Trackbacks: 0
[AS3]デバッグの方法
- 2007-10-20 (Sat)
- ActionScript3.0 | Library | AIR | Flex3 | Flex2
こちらの記事[AS3S.ORGさん]でデバッグに便利な環境について書かれていたので。
流れに乗って。
1. Debug Player
これは必須ですね。FlashPlayerのDebug用バージョン。普通のFlashPlayerだとランタイムエラーとか拾ってくれないので。エラーが出ているのに表示されないのでデバッグが余計大変になってしまいます。しかも、普通に動くけど実はエラーが起きているということもあるというのが曲者です。例えば画像の読み込み時のIOErrorとかですね。気がつかないままリリースすると、他の開発者の人に「あーIOErrorをちゃんとハンドルしてないんだー」みたいなことがばれてしまうのは恥ずかしいです。
ちなみに、いろんなベータ版とか試してるうちにこっそりとFlashPlayerが新しく置き換わることが結構あって、気がつかないうちにDebugPlayerではなくなっている、ということもあります。DebugPlayerの場合はFlash/Flex上で右クリックしたときに「デバッグ」というコマンド(ただしグレーで実行できない)が入るようですよ。
2. Flash Tracer
FireFoxのアドオンでtraceの出力をFlreFoxのサイドバーで確認できるというものです。
すごい趣味の問題なんですけど、サイドバーじゃなかったらなぁ、と。デバッグ用の出力ウインドウはなんか画面下に欲しいんですよね。
(FireFoxに他のアドオン入れれば下にできるのかもしれないけど、ブックマークの時とかは横にあって欲しいし・・・)
3. Flash Switcher
FireFoxでFlashPlayerのバージョンを切り替えるアドオンです。
便利なんだけど・・・、他のタブでFlashPlayerが起動してると動かないんですよね。僕は結構タブを多めに開いたままにする派なので、なかなか使いづらい・・・。
FireFoxが常用のブラウザじゃない人には良いかも。
あとは、最近いたるところで話しにのぼっている、
ThunderBoltですね。
FireBugに出力できるというライブラリです。ただの出力か、警告かエラーかなど色々な出力を簡単に実現できるのは良いところですが、ソースコードにデバッグ用のコードが色々残ってしまうのが若干面倒ですね。
FireBugに出力するだけ、という意味では、
ExternalInterface.call("console.log", "hogehoge");
でだせます。自分でうまいことデバッグ用のクラスを書いたほうが後々便利かもしれませんね・・・。
- Comments: 0
- Trackbacks: 0
[AS3]includeとimport
- 2007-10-20 (Sat)
- ActionScript3.0 | Flex3 | Flex2
Shigeru-Nakagaki.comさんの記事にて、ActionScript3.0でのincludeについての解説がありました。
importについては、普段つかっているものなので、理解はしていたんですが、
「include」があることすら知りませんでした・・・。
include
コンパイル時にソースを丸ごとぶち込みます
注意点としては複数のファイルで同じファイルをincludeすると
無駄にSWFが肥大化しますので、個人的にはお勧めしません ^_^;
オブジェクト指向なんていう形式的なことは
毛頭言う気はありませんが、それでもFlexでは
クラス化したほうが良いと思います
なるほど。
ってことは、staticな変数とかは、コンフリクトを起こしてしまうんでしょうかね?
そもそもincludeの使いどころってどういう状況なんだろう?過去のバージョンとの互換とかのために使えるようになってるだけなら良いんですが、どこかに使いどころがあるんでしょうね、多分。そういえばFlexFrameworkのソースの中にincludeがあったような・・・。
ちゃんとAdobeから出されているリファレンスとか読み込まないとだめだなぁと痛感しますね。
いつもその場しのぎで検索していくだけでは・・・だめだっ!
- Comments: 2
- Trackbacks: 0
[Flex]ViewStackの画面切り替え
- 2007-10-14 (Sun)
- FlexFramework | Flex3 | Flex2
ViewStackを使って、画面を切り替えるにはindexかidを使うけど、
Class名を使うという手もあるよ、という記事から。
Flex cookbook beta
Selecting a view in a ViewStack just by its Class
実際に書くとこんな感じです。
< ?xml version="1.0" encoding="utf-8"?>
< mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
< mx:Script>
< ![CDATA[
import mx.core.ComponentDescriptor;
// 切り替えのスイッチになる変数
[Bindable]
public var actualView:Class = TitleWindow;
private function getView(viewClass:Class):int{
// ViewStackの持つ子画面の配列を取得
var descriptors:Array = views.childDescriptors;
for(var i:int=0;i
< mx:ViewStack id="views" selectedIndex="{getView(actualView )}" width="100%" height="100%">
< mx:TitleWindow title="TitleWindowView" width="80%" height="80%"/>
< mx:Panel title="PanelView" width="80%" height="80%"/>
< /mx:ViewStack>
< mx:HBox width="100%">
< mx:Button label="TitleWindow" click="actualView=TitleWindow"/>
< mx:Button label="Panel" click="actualView=Panel"/>
< /mx:HBox>
< /mx:Application>
この方法を使うと、ViewStackに積むそれぞれのViewを全部違うクラスにしなくちゃいけないので、結局id使ってちゃんとそれぞれ名前付けておくのが一番良いのかなぁ。という感じですね。
でもそれなりの規模のものを作っていて、それぞれの画面をきちんとコンポーネント化して作るような場合には結構便利なのかもしれないですね。
- Comments: 0
- Trackbacks: 0
[Flex]ポップアップウインドウの作り方
- 2007-10-13 (Sat)
- FlexFramework | Flex3 | Flex2
ポップアップウインドウとか、たまに必要になるのに、そのたびに作り方忘れるのでメモ。
まずはポップアップで開くウインドウをコンポーネントとして作ります。
< ?xml version="1.0" encoding="utf-8"?>
< mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" showCloseButton="true" close="closePopup()" width="400" height="300">
< mx:Script>
< ![CDATA[
import mx.managers.PopUpManager;
private function closePopup():void{
PopUpManager.removePopUp(this);
}
]]>
< /mx:Script>
< /mx:TitleWindow>
簡単に作るならTitleWindowがいいかな?
showCloseButtonで閉じるボタンができるので楽チンです。
closeイベントを取得して、PopupManagerから自分自身を削除するようにすると、ポップアップが消せます。
そしたらポップアップを開く側を。
< ?xml version="1.0" encoding="utf-8"?>
< mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
< mx:Script>
< ![CDATA[
import mx.managers.PopUpManager;
public function doPopup():void{
var popup_window:PopupWindow = new PopupWindow();
// PopupManagerにインスタンスを登録
PopUpManager.addPopUp(popup_window, this);
// 画面中央へ表示
PopUpManager.centerPopUp(popup_window);
}
]]>
< /mx:Script>
< mx:Button label="Popup" click="doPopup()"/>
< /mx:Application>
とりあえずサンプルなので、ポップアップを開くためのボタンだけ配置。この辺は適宜ですね。
addPopUpの引数は、
第一引数がwindow:IFlexDisplayObject。
ポップアップさせるインスタンス
第二引数がparent:DisplayObject。
ポップアップ表示の親となるDisplayObject。次のcenterPopUpのときの中心座標を計算する基準になるっぽい。
第三引数がmodal:Boolean = false 。
trueだと、ポップアップ表示中は、ポップアップ以外が操作不能になります。
第四引数はchildList:String = null 。
与えられる引数は以下の三種。
PopUpManagerChildList.APPLICATION
PopUpManagerChildList.PARENT
PopUpManagerChildList.POPUP
APPLICATIONはSTAGE以下に、PARENTは第二引数のparent以下に、POPUPはSystemManager以下にDisplayObjectを追加します。
他の方法としては、
centerPopUp(popUp:IFlexDisplayObject):void
このメソッドでは、クラスネームを引数で渡します(インスタンスではなく)。
ん~、リファレンスのPopupManagerの説明が微妙にわかりづらいんですよね。
- Comments: 1
- Trackbacks: 0
[flex]任意のタイミングでAlertを消す
- 2007-09-02 (Sun)
- FlexFramework | ActionScript3.0 | Flex3 | Flex2
ここによると、
alert = Alert.show("hogehoge");
で開いたAlertは、
PopUpManager.removePopUp(alert);
で消せるらしいです。
確かにリファレンスを見ると、Alert.show()でAlert型が戻り値になってますね。戻り値あったんだ・・・。この関数。
というかそれ以前にAlertがPopupManagerで開かれていることを知らなかった・・・。
FlexFrameworkのソースって読めるんですよね。やっぱソースとかしっかり読んで勉強するべきなのかなぁ・・・。
- Comments: 0
- Trackbacks: 0
[IDE]ActionScript3.0(Flex3・AIR)の開発環境構築(2)
- 2007-08-15 (Wed)
- ActionScript3.0 | AIR | Flex3 | Flex2
前回の続きです。
前回はFlashDevelopのインストールから、Flex3のSDKを適応し、
コード補完をできるようにするところまででした。
今回は、AIRの開発用のProjectTempleteを作ります。
まずは、FlashDevelopをインストールしたフォルダを確認してください。
特に変更せずにインストールしていれば、
(Windowsなら)C:\Program Files\FlashDevelop\だと思います。
そこからさらにもぐって、
C:\Program Files\FlashDevelop\FirstRun\Templates\ProjectTemplates\
を確認します。
[ProjectTemplates]フォルダ内には、
[00 ActionScript 2 - Empty Project]~[08 HaXe - Default Project]までの
プロジェクトテンプレートファイルがあります。
どれでも良いですが、とりあえず[06 ActionScript 3 - Default Project]をコピーして、
[09 Air - Default Project]という名前にリネームします。
これで、Air用の新しいプロジェクトができました。
FlashDevelop再起動後にnew Projectで確認できると思います。
次はAirプロジェクトのコンパイル設定です。
swfをAirアプリにするためには、application descriptor fileというxmlファイルが必要です。
new Projectの際に自動でこのファイルができるように、
[09 Air - Default Project]フォルダ内にapplication.xmlというファイルを作っておきましょう。
< ?xml version="1.0" encoding="UTF-8"?>
hoge
hoge.swf
これで新規プロジェクトの際には、自動的にapplication.xmlというファイルができることになります。
次にコンパイルのオプションを設定します。
[09 Air - Default Project]フォルダ内の Project.as3proj というファイルをメモ帳で開いてみてください。
中身はXML形式で書かれています。
まず、build という項目に以下を追記します。
・
・
・
続いて、
postbuildCommand という項目を以下のように修正します。
“C:pathtoflex3_sdkbinadl.exe” application.xml
adlへのパスは環境に合わせてください。
これで設定は終了です。
FlashDevelopを再起動し、Airプロジェクトを新規で作ってください。
自動で作られたapplicaiton.xml内のrootContentで指定するswfを適当に調整し、
F8でAirアプリの完成です。
- Comments: 1
- Trackbacks: 1
[IDE]ActionScript3.0(Flex3・AIR)の開発環境構築(1)
- 2007-08-12 (Sun)
- ActionScript3.0 | AIR | Flex3 | Flex2
Flex3の開発環境といえば、FlexBuilder3。
ですが、使用期限ももう限界です。
僕は少し前からFlashDevelop3.0に切り替えました。
AIRの開発に他の人は何を使ってるんだろう・・・。
ここを見ながら設定するとAIRの開発に問題無しです。
若干コード補完がおかしいときがありますが、
体感的にはFlexBuilderよりも軽いし、無料だし。
ほぼそのままですが、開発環境の構築手順を。
まずはFlashDevelopをここからダウンロードします。
2007年8月11日現在、最新版はFlashDevelop 3.0.0 Beta2のようです。
そして、インストール。
FlashDevelopの起動には「.NET Framework 3.0」が必要なので、インストール前に入れておきましょう。
![]()
英語ですが、普通に進めれば問題無くインストールできると思います。
うまくインストールできたら文字コードを設定します。
これをしておかないと、FlexBuilderからのファイルとかを移行したときに日本語が化けます。
メニューから、
Tools -> Program Settings -> その他 -> Default CodePage と選択して、
ここの数値を「1252」から「65001」に変更します。これでUTF-8になるようです(細かいことはわかってない)。
情報元はここ。
それでは、ここからはAIRのBeta1とかFlex3用のプロジェクトを作る設定です。
まずはFlex3のSDKを設定します。
先ほどと同様に、Tools -> Program Settings から、
plugins -> AS3Context -> settings
と選択していきます。
すると、「AS3Contexet」というタイトルのウインドウが出るはずなので、
その中の、AS3項目内「Flex 2 SDK Location」にFlex3のSDKを設定します。
(SDKの設定なので、mxmlcのあるフォルダの上のフォルダを設定)
続いてコード補完用のファイルを設定します。
まずは、このページのはじめの書き込みの「Update: Flex 3/AIR Intrinsic Classes 」という部分から「flex3_intrinsic.zip」というファイルをダウンロードしてください。
先ほどの、「AS3Context」ウインドウをもう一度開き、
今度は、「AS3 Classpath」というところを先ほどダウンロードしてきたflex3_intrinsic.zipを解凍したものを設定します。
一度、FlasDevelopを再起動し、
新しいProjectを作ってみましょう。
project -> new Project
で開いたウインドウからProject名などは適当に。Templeteは「ActionScript3 - Default Project」で。
すると、

こんな感じに自動でファイルが作られます。
F8押すか、
Project -> Build Project
で、コンパイルできるはずです。
適当にFlex3で新しく追加されたクラスなどを書いてみてください。
コード補完は Ctl + space です。
コレでFlex3と同様のswfをコンパイルできるようになりました。
が、しかし、AIRの開発を行うためにはもう少し設定を続けなければいけません。
続く。
- Comments: 0
- Trackbacks: 1
Home > Flex2
- Search
- Feeds
- Meta
- Advertisement