株式会社ライブキャストロゴ 株式会社ライブキャスト

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追記)