前回予告した通り、今回はActionScriptのみでAIRアプリを作る場合の話題を取り上げますが、これがなかなか一筋縄では行きません。例えば、以下のコードをコンパイルして実行すると
package {
import mx.core.*;
public class myApplication extends WindowedApplication {
public function myApplication() {
}
}
}
盛大にランタイムエラーがターミナルに出力されます。コンパイルエラーは何も出ないのに...?
理由は
ここにも書いてありますが、どうもMXMLファイルを介さないでコンパイルすると、スタイルの設定が正しくされないようで、これがランタイムエラーを発生させる原因のようです。
別にMXMLをおとなしく使えば良いじゃんって意見も確かにありますが、アプリケーションの実行時の状況によってUIを変えたい場合などは、すべてのUIの定義を事前にMXMLで書いておくわけにも行かないので、やはり動的にUIを生成する方法は知っておきたいものです。
で、自分は上記サイトとは違ったアプローチで解決を試みました。MXMLファイルはご存知のように、amxmlcコンパイラによって一旦ActionScriptに変換されてからActionScript Bytecodeに変換されます。ならば、この変換されたActionScriptを流用すれば、ActionScriptだけでAIRアプリケーションが作成できるはずです。
コンパイル中に作成されるActionScriptを保持するには、コンパイル時に-keepオプションを設定すれば良く、変換されたActionScriptは./generatedフォルダに保存されます。やって見てみると、何やら自動生成されたファイルがいっぱい入ってます(笑)。
この中で肝は、
- *Style*.as(スタイルの定義)
- *_FlexInit-generated.as(スタイルを初期化)
- *_mx_managers_SystemManager-generated.as(SystemManagerの定義)
です。
これらのファイルを流用することで、ActionScriptだけでAIRアプリケーションを作成することができます。自動生成されたソースコードの著作権等の取り扱いがよくわからないので、ホームページ上には詳しくは掲載しませんけど。
ただ、Flex/AIRアプリケーションの初期化シーケンスに関しては、自分自身まだよく理解できていないので、どこかに詳細な情報があれば是非教えていただきたいところです。
実際には、以下のようにイニシャルウインドウだけをMXMLで記述しておけば、amxmlcはActionScript中で使用しているコントロール/コンポーネントのスタイルの定義を行ってくれるようですので、ActionScriptで俺はUIを書きたいんじゃい!って人は以下のようにするのが簡単でいいかも知れません。要は、1回でもMXMLからActionScriptへの変換をかませば良いのか?
myApplication.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" applicationComplete="init()">
<mx:Script source="myApplication.as"/>
</mx:WindowedApplication>
myApplication.as:
import mx.controls.*;
private function init():void {
var textInput:TextInput =new TextInput();
textInput.x = 10;
textInput.y = 10;
textInput.width = 100;
addChild(textInput);
var button:Button = new Button();
button.x = 120;
button.y = 10;
button.width = 40;
button.label = "Go";
addChild(button);
}
まぁでも、自動生成されたファイルを読むのは、自分には結構良い勉強になりましたけどね。