AIRアプリケーションはOS(Windows/Mac/Linux)を問わず動作するのが大きなうりの1つですが、OSでサポートされていない機能は利用できません。特定のOSで動作したからと言って他のOSでも動作するとは限りませんのでクロスプラットフォーム対応のAIRアプリケーションを開発する際にはその辺の考慮が必要です。
今回は過去の記事でも紹介しているDockアイコンとタスクトレイアイコンについてです。
Dockアイコンや、タスクトレイアイコンを操作したい場合にはNativeApplicationクラスのiconプロパティを使用します。
NativeApplication.supportsDockIcon と NativeApplication.supportsSystemTrayIcon を使用して、icon クラスを判別します。タイプは、InteractiveIcon のいずれかのサブクラスです。MacR OS X では、NativeApplication.icon は DockIcon タイプのオブジェクトです。WindowsR では、NativeApplication.icon は SystemTrayIcon タイプのオブジェクトです。Linux では、アプリケーションアイコンはサポートされない場合があります。その場合、icon プロパティは null です。
NativeApplication – ActionScript 3.0 言語およびコンポーネントリファレンスより引用。
ここにあるように、そもそもプラットフォームによってはサポートされていない場合があります。その判別にはNativeApplicationクラスのsupportsDockIcon、supportsSystemTrayIconを使用します。
if (NativeApplication.supportsDockIcon) { // Dockアイコンをサポートしている場合(主にMac) var dockIcon:DockIcon = NativeApplication.nativeApplication.icon as DockIcon; } else if (NativeApplication.supportsSystemTrayIcon) { // タスクトレイアイコンをサポートしている場合(主にWindows) var trayIcon:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon; } else { // サポートされていない場合 }
ここでの注意点は、iconプロパティより返されるオブジェクトの型が異なるところです。
Macの場合、DockIcon型のオブジェクトが返されます。
var dockIcon:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
Windowsの場合、SystemTrayIcon型のオブジェクトが返されます。
var trayIcon:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
Linuxの場合は、ディストリビューションやデスクトップインターフェイスにもよっても異なります。サポートされていない場合もあります。
※openSUSE 10.3のGNOMEではSystemTrayIconがサポートされていました。
flashcast:フリーで働くITエンジニア集団のブログ: openSUSEでAIRアプリを実行してみた
icon オブジェクトは自動的に作成されますが、イメージデータで初期化されません。Mac OS X などの一部のオペレーティングシステムでは、デフォルトのイメージが提供されます。Windows など、その他のオペレーティングシステムでは、イメージデータが割り当てられていないとアイコンは表示されません。
NativeApplication – ActionScript 3.0 言語およびコンポーネントリファレンスより引用。
Mac OS Xなどで割り当てられるデフォルトのイメージとはこれのことです。
※Windowsなどでは、プログラムでアイコンイメージを割り当てる必要があります。
アイコンイメージを割り当てるには、少なくとも 1 つの BitmapData オブジェクトが格納されている配列を icon.bitmaps プロパティに設定します。
NativeApplication – ActionScript 3.0 言語およびコンポーネントリファレンスより引用。
Mac OS XなどではADFファイルという設定ファイルに指定すればデフォルトのイメージを変更できます。
<?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://ns.adobe.com/air/application/1.5"> <id>DockIconApp</id> <filename>DockIconApp</filename> <name>DockIconApp</name> <version>v1</version> <initialWindow> <content>[この値は Flex Builder の出力ファイル app.xml に上書きされます]</content> </initialWindow> <icon> <image16x16>assets/AIRApp_16.png</image16x16> <image32x32>assets/AIRApp_32.png</image32x32> <image48x48>assets/AIRApp_48.png</image48x48> <image128x128>assets/AIRApp_128.png</image128x128> </icon> </application>
※詳細はflashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのDockアイコンをカスタマイズする方法をご参照ください。
配列に複数の BitmapData オブジェクトが格納されている場合、サイズがアイコンの表示サイズに最も近いイメージをオペレーティングシステムが選択し、必要に応じてイメージを伸縮します。
NativeApplication – ActionScript 3.0 言語およびコンポーネントリファレンスより引用。
<icon>
<image16x16>assets/AIRApp_16.png</image16x16>
<image32x32>assets/AIRApp_32.png</image32x32>
<image48x48>assets/AIRApp_48.png</image48x48>
<image128x128>assets/AIRApp_128.png</image128x128>
</icon>
この中から最適なものが選ばれ自動的にリサイズされます。より細かい指定をする場合にはプログラムでアイコンイメージを割り当てる必要があります。
ちなみに、DockIconクラス、SystemTrayIconクラスはInteractiveIcon抽象クラスを継承していますので、
if (NativeApplication.supportsDockIcon || NativeApplication.supportsSystemTrayIcon) { var icon:InteractiveIcon = NativeApplication.nativeApplication.icon; } else { // サポートされていない場合 }
上記のようにも書けますが、それぞれのクラスにしか実装されていない機能(例えば、DockIconクラスのbounceなど)がありますので、用途によって使い分けた方が良いでしょう。
■関連記事へのリンク
flashcast:フリーで働くITエンジニア集団のブログ: クロスプラットフォームなAIRアプリ開発時の注意点 〜NativeWindowの透明度設定について〜(2009/2/26追記)
flashcast:フリーで働くITエンジニア集団のブログ: クロスプラットフォームなAIRアプリ開発時の注意点 〜透明な描画オブジェクトがキャプチャするMouseEventについて〜(2009/3/5追記)