Home > ActionScript Archive

ActionScript Archive

ActionScript トリビアルメモ 2 ~初期化とか

MXMLコンポーネントを自作して、その中でさらにMXMLを内包しているときとかその中の変数をどう初期化するのか。
気づいたとき、たいした話じゃなかったなあというか、まだまだActionScriptを分かってないなあと思いました。

HogeHBox:


<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" xmlns:ns1="sample.*">
	<mx:Script>
		<![CDATA[
			public var hoge:String;
		]]>
	</mx:Script>
	
</mx:HBox>

FooCanvas:


<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%">
	<mx:Script>
		<![CDATA[
			public function init():void {
				this.hogehoge.hoge = "test";
			}
		]]>
	</mx:Script>
	<ns1:HogeHBox id="hogehoge"></ns1:HogeHBox>
</mx:Canvas>

メインコード:


var foo:FooCanvas = new FooCanvas();
foo.init();

とかやるとhogehogeが初期化されていなくて怒られると。で、これはFooCanvasを


<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%">
	<mx:Script>
		<![CDATA[
			[Bindable]
			public var hogeString:String;
			
			public function init():void {
				this.hogeString = "test";
			}
		]]>
	</mx:Script>
	<ns1:HogeHBox id="hogehoge" hoge="{hogeString}"></ns1:HogeHBox>	
</mx:Canvas>

っていう感じでhogehogeのmxmlのプロパティとして与えておけばいいという。基本なんですね、きっと。

以上

ActionScript トリビアルメモ 1 ~埋め込みフォントとSharedObject

フォントを埋め込みたかったのに・・・!だって埋め込みフォントを使わないとFadeエフェクトが効かないんだもん。というわけでヘルプを見ると


<mx:Style>
	@font-face {
		src: url("asset/hoge.ttf");
		fontFamily: hoge;
		advancedAntiAliasing: true;
	}
</mx:Style>

とか書けと書いてある。うっせーばか!そんな難しいことはしたくないんだ。システムフォントを埋め込めればいいんだ!ttfなんてファイルいらねえ。
というわけで以下のようにすればよかった。


<mx:Style>
	@font-face {
		src: local("Times New Roman");
		fontFamily: hoge;
		advancedAntiAliasing: true;
	}
</mx:Style>

使うときはfontFamilyを指定する。


<mx:TextArea fontFamily="hoge"/>

あと、もっとしょうもない話。SharedObject。ローカルにデータを保存できるわけですが、名前にコロンを含めることができなかった!例えば下のような感じ。


var so:SharedObject = SharedObject.getLocal("http://www.hoge.com");
so.data.foo = "hehehe";
so.flush;

~ % & \ ; : ” ‘ , < > ? #
は使えないんだとさ!soにnullが帰ってきた。

以上

Airではまったこと 4~コンポーネントの部品の初期化

ActionScriptも自分でコンポーネント作ったりしてるとJavaのSwingやってるような気がしてくる。

自作コンポーネントの中の部品を初期化する。例えば下のような感じ。
SampleTab.mxml:


<?xml version="1.0" encoding="utf-8"?>
<mx:TabNavigator xmlns:mx="http://www.adobe.com/2006/mxml">

	<mx:Canvas label="タブ1" width="100%" height="100%" id="myCanvas">
		<view:MyComponent x="0" y="0" width="100%" height="100%"
			 id="myComponent"
			>
		</view:MyComponent>
	</mx:Canvas>
	<mx:Canvas label="タブ2" width="100%" height="100%">
	</mx:Canvas>
</mx:TabNavigator>

ここではトップのSampleTab(TabNavigator)が自作のコンポーネントであり、タブを二つ持つようなものを考えている。さらにタブ1はまた別の自作コンポーネント(MyComponent)を内包しているとする(まあ、別に自作コンポーネントじゃなくてもいいけど)。で、このMyComponentは特殊な感じになっているのでSampleTabを初期化した時点で独自のロジックでこれも初期化したいと。TabNavigatorを子要素に持つ奴が、MyComponentの初期化処理も行いたい、つまり孫コンポーネントを初期化したいというわけです。

で、まずアプリケーションの初期化メソッドをinit()とすると


public function init():void {
   var sampleTab:SampleTab = new SampleTab();
   sampleTab.addEventListener(FlexEvent.CREATION_COMPLETE, myComponentInit);
   ・・・
}
public function myComponentInit(event:FlexEvent):void {
   var sampleTab:SampleTab = SampleTab(event.target);
   sampleTab.myComponent.~~~
   ・・・
}

って感じでやろうとしたらだめだった。sampleTabが作成された段階ではまだmyComponentまではできてない。そしてsampleTab.myComponentはnullになる。
というわけで、以下のようにした。


<?xml version="1.0" encoding="utf-8"?>
<mx:TabNavigator xmlns:mx="http://www.adobe.com/2006/mxml">
	
	<mx:Script>
		<![CDATA[
			public var myComponentInit:Function;
		]]>
	</mx:Script>

	<mx:Canvas label="タブ1" width="100%" height="100%" id="myCanvas">
		<view:MyComponent x="0" y="0" width="100%" height="100%"
			 id="myComponent"
			 creationComplete="myComponentInit(event)"
			>
		</view:MyComponent>
	</mx:Canvas>
	<mx:Canvas label="タブ2" width="100%" height="100%">
	</mx:Canvas>
</mx:TabNavigator>

public function init():void {
   var sampleTab:SampleTab = new SampleTab();
   sampleTab.myComponentInit = myComponentInit;
   ・・・
}
public function myComponentInit(event:FlexEvent):void {
   var myComponent:MyComponent = MyComponent(event.target);
   myComponent.~~
   ・・・
}

関数ポインタ的に。
動いているが、自作のコンポーネントの作り方を根本的に間違っている気がしないでもない。だがしかし!動けばそれが答えさ!

以上

Airではまったこと 3~Date

AirっていうかActionScriptだけど。まあ、タイトルはそのうちこっそり変えよう。

たいした話じゃありません。


var today:Date = new Date();
var year:int = today.getFullYear();
var month:int = today.getMonth();

yearは2008ってなるけどmonthは0~11っていう。

以上

Airではまったこと 2~エフェクトの登録

よくあるバグを言語ごとに系統的にまとめたようなのないかね。

DisplayObjectにエフェクトを登録したいとです。MXMLならすぐ分かりました。
Canvasをマウスオーバーでズームする例。


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Zoom id="zoom" duration="1000" zoomHeightTo="2" zoomWidthTo="2" />
	<mx:Canvas width="100" height="100" backgroundColor="blue" rollOverEffect="{zoom}">
	</mx:Canvas>
</mx:Application>

ActionScriptからはどうするのか。


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
		<![CDATA[
			
			public function init():void {
				this.canvas1.setStyle("rollOverEffect", "zoom");
			}
		]]>
	</mx:Script>
	<mx:Zoom id="zoom" duration="1000" zoomHeightTo="2" zoomWidthTo="2" />
	<mx:Canvas id="canvas1" width="100" height="100" backgroundColor="blue" creationComplete="init()">
	</mx:Canvas>
</mx:Application>

まさかsetStyleとは。

あとは


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
		<![CDATA[
			import mx.effects.Zoom;
			
			
			public function rollOverHandler(event:MouseEvent):void {
				var zoom:Zoom = new Zoom(event.target);
				
				zoom.duration = 1000;
				zoom.zoomHeightTo = 2;
				zoom.zoomWidthTo = 2;
				
				zoom.play();
			}
		]]>
	</mx:Script>
	
	<mx:Canvas id="canvas1" width="100" height="100" backgroundColor="blue" rollOver="rollOverHandler(event)">
	</mx:Canvas>
</mx:Application>

以上

Airではまったこと 1~ActionScriptの基礎

そろそろAirの季節です。エロゲではありません。

1.プリミティブ型は値渡し
引数で参照渡しにする術がない。なんという。swapとかどうしたらいいんだ。
Number型もプリミティブ型です。Boolean、int、Number、String 、uint です。
ただし、プリミティブ型もオブジェクトです。

2.メタデータタグは信じてはいけない


[ArrayElementType("uint")]
public var uintArray:Array;

って宣言しても


uintArray = new Array(2);
uintArray[0] = 0.1;
uintArray[1] = 0.3;

ってやるとuintArray[0]、uintArray[1]には小数が入ります。キャストされません。

3.forで宣言できない??
ヘルプを見る限り


for (var i:int = 1; i < 10; i++) {
}

とは書けなそうで


var i:int;
for (i = 0; i < 10; i++) {
}

って書かないとだめそうだったけど、


for (var i:int = 1; i < 10; i++) {
}

って書いてみたら動いた。コンパイラが神様です。

4.インターフェイスはpublicいらない
まあ、jk。

5.インターフェイスにアクセサOK


function get Hoge():Number;

6.メソッドのオーバーロードはできない
デフォルト引数は使えるので、それで何とかする。

以上

Home > ActionScript Archive

Search
Feeds
Meta
 合計:010890
 今日:0192 昨日:0214

Return to page top