にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

PNG画像を読み込んでシステムトレイアイコンに設定する

前回のAIRでシステムトレイ常駐アプリでは、システムトレイに表示するアイコンはベタ塗りのビットマップにしたが、せっかくなのでオリジナルアイコンを設定しようと思った。
LoaderとBitmapクラスを使うとできた。
前回のダイアリに載せたコードの、以下の部分

    // アイコン設定
    var images:Array = [];
    images.push(new BitmapData(16, 16, false, 0x00ff00));
    NativeApplication.nativeApplication.icon.bitmaps = images;

を次のように変更(PNG画像は適宜準備してください)

    // アイコン設定
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComplete);
    loader.load(new URLRequest("image/icons/blue_icon16x16.png"));

し、以下の関数を追加。

private function loadComplete(event:Event):void {
    var images:Array = [];
    var loader:Loader = Loader(event.target.loader);
    var bd:Bitmap = Bitmap(loader.content);
   images.push(bd);
    NativeApplication.nativeApplication.icon.bitmaps = images;
}

LoaderメソッドとBitmapメソッドになぜnewをつけないのか、がよく分かっていないのでそこは要勉強だが、とりあえずこれでなんとか。

ソースコード全体

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="initApp()" visible="true">
    <mx:Script>
        <![CDATA[
            import mx.core.BitmapAsset;
            import mx.controls.Image;
            import mx.controls.Menu;

            private function initApp() : void {
                if (!NativeApplication.supportsSystemTrayIcon) {
                    trace("このシステムはトレイアイコンをサポートしていません");
                    nativeApplication.exit();
                } else {
                    var trayIcon:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
                    var trayMenu:NativeMenu = new NativeMenu();

                    trace(trayIcon.bitmaps.length);

                    trayIcon.menu = trayMenu;

                    var exitMenuItem:NativeMenuItem = new NativeMenuItem("終了");
                    exitMenuItem.addEventListener(Event.SELECT,
                        function():void {
                            NativeApplication.nativeApplication.exit();
                        }
                    );
                    trayMenu.addItem(exitMenuItem);

                    // アイコン設定
                    var loader:Loader = new Loader();
                    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComplete);
                    loader.load(new URLRequest("image/icons/blue_icon16x16.png"));
                }
            }

            private function loadComplete(event:Event):void {
                var images:Array = [];
                var loader:Loader = Loader(event.target.loader);
                var bd:Bitmap = Bitmap(loader.content);
                images.push(bd);
                NativeApplication.nativeApplication.icon.bitmaps = images;
            }

        ]]>
    </mx:Script>

</mx:WindowedApplication>