flashcast:フリーで働くITエンジニア集団のブログ: google翻訳APIを使ったAIRアプリを作る!の続きです。
最初の作業として、AIRで常駐アプリを作ってみたいと思います。翻訳したいと思った時に、ソフトをいちいち起動するのは手間だと考えたからです。
まず、エントリポイント(起動時に最初に実行される)のmxmlを修正します。
FlexBuilderで作成されたプロジェクトは、エントリポイントとして1つmxmlを割り当てる必要があります。通常、AIRアプリの場合、エントリポイントとして割り当てられたmxmlはWindowedApplicationクラスです。
WindowedApplication は、2 つの役割を果たします。これは <mx:Application> タグの代わりに使用され、Flex ベースの AIR アプリケーションへのエントリポイントとして機能します。また、WindowedApplication はコンテナとして、Flex AIR アプリケーションの最初のウィンドウのレイアウトを定義します。WindowedApplication で定義されたすべてのビジュアルコントロールは、AIR アプリケーションによってロードされる最初のウィンドウのコンテンツになります。
WindowedApplication – ActionScript 3.0 言語およびコンポーネントリファレンスより引用。
FlexBuilderで作成した直後はこんな感じのmxmlが1つできます。
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> </mx:WindowedApplication>
今回開発するアプリのエントリポイントは、画面を必要としないので、Applicationクラスにします。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> </mx:Application>
次に、Windowsのタスクトレイや、Mac OSのドックのアイコンをオリジナルの画像にして、常駐していることがわかるようにします。flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのDockアイコンをカスタマイズする方法を参考に、思い出しながら実装しました。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()"> <mx:Script> <![CDATA[ import mx.core.BitmapAsset; [Embed(source="assets/translator_icon16.png")] private var icon16:Class; [Embed(source="assets/translator_icon128.png")] private var icon128:Class; private function initApp():void { initIcon(); } private function initIcon():void { var newIconBitmap:BitmapData; if (NativeApplication.supportsSystemTrayIcon) { // タスクトレイアイコン newIconBitmap = (new icon16() as BitmapAsset).bitmapData; } else if (NativeApplication.supportsDockIcon) { // ドックアイコン newIconBitmap = (new icon128() as BitmapAsset).bitmapData; } else { NativeApplication.nativeApplication.exit(); } setIcon(newIconBitmap); } private function setIcon(bitmap:BitmapData):void { NativeApplication.nativeApplication.icon.bitmaps = [bitmap]; } ]]> </mx:Script> </mx:Application>
アイコン用に、2種類の画像を用意しました。
実行すると、こんな感じになります。
ついでに、ビューとロジックを分離しました。これは好みの問題なので、分離しないといけないわけではありません。
mxmlとApplicationクラスを継承したクラスに分離します。
mxmlのソースです。
<?xml version="1.0" encoding="utf-8"?> <fc:TranslatorSample2Base xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:fc="*" layout="absolute" creationComplete="initApp()"> </fc:TranslatorSample2Base>
mxmlで、自前のクラスライブラリなどを使いたい場合は名前空間とそのpackageの宣言を記述します。
xmlns:fc=”*”
これで、mxmlでそのpackageのクラス利用できるようになります。使う時には、名前空間に続けてクラス名を記述します。
<fc:TranslatorSample2Base
次に、分離したクラスのソースです。
package { import mx.core.Application; public class TranslatorSample2Base extends Application { private var imanager:IconManager; public function TranslatorSample2Base():void { } public function initApp():void { imanager = new IconManager(); imanager.initIconManager(); } } }
また、アイコンをカスタマイズする部分は、別クラスにしました。
package { import flash.desktop.NativeApplication; import flash.display.BitmapData; import mx.core.BitmapAsset; public class IconManager { [Embed(source="assets/translator_icon16.png")] private var icon16:Class; [Embed(source="assets/translator_icon128.png")] private var icon128:Class; public function IconManager():void { } public function initIconManager():void { initIcon(); } private function initIcon():void { var newIconBitmap:BitmapData; if (NativeApplication.supportsSystemTrayIcon) { // タスクトレイアイコン newIconBitmap = (new icon16() as BitmapAsset).bitmapData; } else if (NativeApplication.supportsDockIcon) { // ドックアイコン newIconBitmap = (new icon128() as BitmapAsset).bitmapData; } else { NativeApplication.nativeApplication.exit(); } setIcon(newIconBitmap); } private function setIcon(bitmap:BitmapData):void { NativeApplication.nativeApplication.icon.bitmaps = [bitmap]; } } }
こんな感じで、とりあえず常駐するだけのAIRアプリができました!
サンプルソース
サンプルソースをダウンロードできるようにしておきます。