ApolloのAIRファイル
実体は単なるjarファイルだった。jarコマンドで気軽に解凍可能。
mimetype設定と、実行バイナリなswf、あとはMETA-INFの中に
設定ファイル(ApolloのDescriptionファイル)、で最後にhash値と。
artemisでは、これにartemisで外部とやりとりする用のport番号とURLが記載してあるファイルがあったね、そういえば。
基礎練その8 AS3の表示コンポーネントのイベントモデル
この間にも色々やってますが、ひとまず今日の収穫。
FlexのイベントモデルはStageクラス(Rootのコンポーネント)から該当クラスまで辿り、
再度該当クラスからStageクラスまで戻るようなイベントモデルを持っています。
つまり、Stageから該当クラスまで辿る間に発生した副次的なイベントも拾って、それを
Stageに戻る最中に発火できるような仕組みがあるのですね。これは結構良く出来てるなあ。一方向じゃないというか。
ちなみに、
・Stageクラスから該当クラスまでを辿るフェーズをキャプチャ段階
・該当クラスに到達して、そこのイベントを処理する段階をターゲット段階
・該当クラスからStageまで戻っていく段階をバブリング段階
と呼ぶそうです。段階=フェーズですね。
(追記)
ああ、EventPhaseなるクラスがまんまありますね。
EventPhase.CAPTURING_PHASE
EventPhase.AT_TARGET
EventPhase.BUBBLING_PHASE
だそうです。
基礎練その9 Reflection
えー、だいぶ飛び飛びで発散気味ですが、ご容赦を。
AS3でReflectionをやるにはどうすればいいか。
mx.utils.DescribeTypeCacheなるクラスがあるのでこいつを使えばXMLには変換してくれそうです。
var xml:XML = describeType(Greeter);
これだけ。ちなみに元のクラスはこれ。
package { public class Greeter { public static var validName:Array = ["a", "b", "c"]; public function greet(s:String = ""):String { var str:String; if(s == "") { s = "AAA"; } else if(validNames(s)) { s = "BBB"; } else { s = "CCC"; } return s; } public static function validNames(input:String = ""):Boolean { if(validName.indexOf(input) > -1) { return true; } else { return false; } } public static function greeterName():String { return "simple greeter"; } } }
もともとのクラスをこんなのとすると、出てくるXMLは、
<type name="Greeter" base="Object" isDynamic="false" isFinal="false" isStatic="false"> <extendsClass type="Object"/> <method name="greet" declaredBy="Greeter" returnType="String"> <parameter index="1" type="String" optional="true"/> </method> </type>
こんなん。
で、こっからE4Xでゲトしてくと。
trace(xml.@name); //Greeter trace(xml.extendsClass); //<extendsClass type="Object"/> trace(xml.method.@returnType); //String だけしか出ないはずなのに、なぜかStringBooleanと出るw
でもなあ、ちょっと面倒くさい。
昨日勉強会で発表していたyossyさんが主催しているSparkプロジェクトの
ASReflectのコードを見ると、ここからもう一歩踏み込んで、package情報とか取れるようにしてそう。
ちょっとだけしか見てないけど。
でも便利そうなので、もう少し使ってみるです。
(追記)
お、getDefinitionByName()なるものがあるみたい。
var o:Object = getDefinitionByName("Greeter"); var c:Class = Class(o);
こんなんでインスタンス化されるみたい。
なぞ現象発覚
ひがさんの環境でほぼ同一のソースではきちんとClassが取れるが
自分のところでは取れない。むー。
Library Pathにframework.swcが足りないからかと思いきや、足してもダメー。
調べてみる。。。
package { import flash.display.Sprite; import flash.utils.getDefinitionByName; import mx.core.Container; public class Hoge extends Sprite { public function Hoge() { mx.core.Container; var c:Class = getDefinitionByName("mx.core.Container") as Class; trace(c); } } }
(追記)
下記のようにFlexプロジェクトで作ると発生しないので、自分の設定の問題の可能性が高いですね。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();"> <mx:Script> <![CDATA[ import flash.utils.getDefinitionByName; import mx.core.Container; public function init():void { mx.core.Container; var c:Class = getDefinitionByName("mx.core.Container") as Class; hoge.text = c.toString(); } ]]> </mx:Script> <mx:Text id="hoge" /> </mx:Application>