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";
		}
	}
}


あとはE4XでひたすらXMLをwalkするのかねえ。

もともとのクラスをこんなのとすると、出てくる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>