:::: 菜单 ::::

AIR应用与任务栏,系统托盘,Dock

反省:我太懒,懒到没有查阅官方资料寻找最小化到托盘的方法,其实AIR早有这方面的设计.见官方AIR文档DEV_GUIDE_FLASH中<Chapter 13: Taskbar icons>
现学习之,顺便整理一份中文档以赎罪.

概述,关于任务栏图标

许多操作系统都提供有任务栏来让应用程序显示一个小图标来代表之.ADOBE AIR通过NativeApplication.nativeApplication.icon属性来提供一个与应用程序任务栏图标相互交互的接口.
AIR自动创建NativeApplication.nativeApplication.icon对象.这个对象类型是SystemTrayIcon或DockIcon之一,依赖于操作系统.
你可以使用NativeApplication.supportsDockIcon和 NativeApplication.supportsSystemTrayIcon属性判断AIR在当前操作系统支持哪些InteractiveIcon子类.
该InteractiveIcon 基类提供width ,height和bitmaps属性,用来改变用于该图标的图片.
可是,在错误的操作系统中访问特设的DockIcon 或 SystemTrayIcon属性会产生一个运行时错误.
要设置或改变用于一个图标的图象,创建一个包含一个或多个图象的数组并指定之到NativeApplication.nativeApplication.icon.bitmaps属性即可.
不同操作系统的任务栏图标可以是不同大小的.为了避免图象不按正确缩放大小显示,你可以加多个尺寸的图片到位图数组.
如果你提供超过一个图象,AIR选择最接近当前任务栏显示尺寸的大小,仅当需要时缩放之.
下面的例子使用两幅图象设置任务栏图标:

  1. NativeApplication.nativeApplication.icon.bitmaps = [bmp16x16.bitmapData, bmp128x128.bitmapData];

要改变图标的图象,需要定义一个包含新图象到bitmaps属性的数组.你可以通过对EnterFrame或Timer事件作出改变图象的反映赋予该图标.
要在通知区中移除图标(在windows上),或者还原默认图标外观(在Mac OS X上),设置bitmaps为一个空数组:

  1. NativeApplication.nativeApplication.icon.bitmaps = [];

Dock图标

AIR在NativeApplication.supportsDockIcon为true时支持dock图标.
该NativeApplication.nativeApplication.icon属性在dock上代表应用程序(不是windows dock图标)
注意: 在Mac OS X下, AIR不支持在dock上改变窗体图标. 同样,对应用程序dock图标的改变仅在应用程序运行时应用—当应用程序结束时图标还原为默认外观.

Dock图标菜单

我们可以添加命令到标准dock菜单,通过创建一个包含这些命令的NativeMenu对象并指定之到NativeApplication.nativeApplication.icon.menu属性. 菜单中的项会显示在该标准dock图标菜单项之上.
弹跳dock
你可以通过调用NativeApplication.nativeApplication.icon.bounce()方法弹跳dock图标.
如果你设置bounce() priority参数为informational, 则图标弹跳一次.如果你设置它为critical,则图标弹跳知道用户触发应用程序. priority常量参数声明在NotificationType类中.
注意:在应用程序已激活时图标不会弹跳.

Dock图标事件

当dock图标被点击,NativeApplication对象发出一个invoke事件. 如果该应用程序不在运行,系统会启动它. 不然,invoke事件被传给运行中的应用程序实例.

系统托盘图标

当NativeApplication.supportsSystemTrayIcon 为true时,AIR支持系统托盘图标,目前仅在windows上. 在windows,系统托盘图标显示在任务栏通知区. 没有图标被显示为默认.
要显示一个图标,分配一个包含BitmapData对象的数组到该图标的bitmaps属性.
要改变图标的图象,分配一个包含新图象的数组到bitmaps.
要移除图标,设置bitmaps为空数组.

系统托盘图标菜单

你可以通过创建一个NativeMenu对象并分配它到NativeApplication.nativeApplication.icon.menu属性, 以添加一个菜单到系统托盘图标(该操作系统没有提供默认菜单). 右键点击图标可访问系统托盘图标菜单.

系统托盘图标工具提示(Tooltip)

通过设置tooltip属性,添加一个工具提示到一个图标:

  1. NativeApplication.nativeApplication.icon.tooltip = "Application name";
系统托盘图标事件

引用自NativeApplication.nativeApplication.icon属性的SystemTrayIcon对象为click, mouseDown, mouseUp, rightClick, rightMouseDown 和rightMouseUp发出一个ScreenMouseEvent事件.
我们可以用这些事件,与图标菜单一起,来允许用户在应用程序没有显示窗口时与之交互.

例子: 创建一个无窗口的应用程序

下面的范例创建了一个AIR应用程序拥有系统托盘图标,但是没有可见窗体.该系统托盘图标有一个菜单,菜单有仅一个退出程序的命令.

  1. package
  2. {
  3. import flash.display.Loader;
  4. import flash.display.NativeMenu;
  5. import flash.display.NativeMenuItem;
  6. import flash.display.NativeWindow;
  7. import flash.display.Sprite;
  8. import flash.desktop.SystemTrayIcon;
  9. import flash.events.Event;
  10. import flash.net.URLRequest;
  11. import flash.desktop.NativeApplication;
  12. public class SysTrayApp extends Sprite
  13. {
  14. public function SysTrayApp():void{
  15. NativeApplication.nativeApplication.autoExit = false;
  16. var icon:Loader = new Loader();
  17. var iconMenu:NativeMenu = new NativeMenu();
  18. var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Exit"));
  19. exitCommand.addEventListener(Event.SELECT, function(event:Event):void {
  20. NativeApplication.nativeApplication.icon.bitmaps = [];
  21. NativeApplication.nativeApplication.exit();
  22. });
  23. if (NativeApplication.supportsSystemTrayIcon) {
  24. NativeApplication.nativeApplication.autoExit = false;
  25. icon.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
  26. icon.load(new URLRequest("icons/AIRApp_16.png"));
  27. var systray:SystemTrayIcon =
  28. NativeApplication.nativeApplication.icon as SystemTrayIcon;
  29. systray.tooltip = "AIR application";
  30. systray.menu = iconMenu;
  31. }
  32. if (NativeApplication.supportsDockIcon){
  33. icon.contentLoaderInfo.addEventListener(Event.COMPLETE,iconLoadComplete);
  34. icon.load(new URLRequest("icons/AIRApp_128.png"));
  35. var dock:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
  36. dock.menu = iconMenu;
  37. }
  38. }
  39. stage.nativeWindow.close();
  40. }
  41. private function iconLoadComplete(event:Event):void
  42. {
  43. NativeApplication.nativeApplication.icon.bitmaps = [event.target.content.bitmapData];
  44. }
  45. }
  46. }

注意:该范例需要有名为AIRApp_16.png和AIRApp_128.png的图象文件在应用程序的icons子目录下.(可以从AIR SDK中找到该范例图标文件,拷贝到项目文件夹下测试)

窗口任务栏图标和按钮

高亮任务栏窗口图标

当一个窗口在后台,我们可以通知用户一个关联此窗体的事件发生了. 在Mac OS X,我们可以通过弹跳应用程序dock图标来通知用户. 在windows,我们可以调用NativeWindow 实例的notifyUser()方法高亮窗体任务栏按钮(窗口通知). 传递到该方法的参数type 决定通知的紧迫程度:

  • NotificationType.CRITICAL:窗口图标闪烁,知道用户将该窗体激活到前台.
  • NotificationType.INFORMATIONAL:窗口图标改变颜色高亮显示.

以下为高亮一个窗口的任务栏按钮:
stage.nativeWindow.notifyUser(NotificationType.CRITICAL);
在一个不支持窗口级别(window-level)的操作系统上调用NativeWindow.notifyUser()方法不产生效果. 使用NativeWindow.supportsNotification属性来判断是否支持窗口通知

创建没有任务栏按钮或图标的窗口.

在windows操作系统,使用utility或lightweight类型创建的窗口不出现在任务栏.不可见窗体也不出现在任务栏.
因为初始化窗口时必须的类型normal, 所以,要创建一个不在人物来出现任何窗口按钮的应用程序,我们必须关闭初始化的窗体或让之不可见. 要关闭在应用程序中所有窗体而不结束程序,需要在关闭最后一个窗体前设置NativeApplication对象的autoExit属性为false.
为了简单地防止初始化窗体出现时可见, 得在应用描述文件元素中添加false.(不要设置visible属性为true或调用该窗体的activate()方法)
在该应用程序打开的新窗口里,设置传递给窗体构造函数的NativeWindowInitOption 对象的type属性为NativeWindowType.UTILITY或者NativeWindowType.LIGHTWEIGHT.
在 Mac OS X,最小化的窗体被显示在dock任务栏上. 我们可以通过隐藏窗口代替最小化它来防止最小化图标显示.
下面的范例监听一个nativeWindowDisplayState改变事件并在窗体最小化时取消之,替换为设置窗体visible属性为false的处理手段.

  1. private function preventMinimize(event:NativeWindowDisplayStateEvent):void{
  2. if(event.afterDisplayState == NativeWindowDisplayState.MINIMIZED){
  3. event.preventDefault();
  4. event.target.visible = false;
  5. }
  6. }

如果一个窗体被最小化到Mac OS X dock栏,当设置visible属性为false后,dock图标并不被移除,用户依然可以点击图标使窗体再现.

延伸阅读