本地菜单
Native Menu API 提供了创建程序,窗口,上下文菜单和弹出式菜单的相关类。
AIR 菜单概要
native menu类运行程序访问到操作系统的本地菜单特性。NativeMenu对象用于创建应用程序菜单(OSX系统可用),window menus (Windows系统可用), 上下文菜单和弹出式菜单。
AIR支持一下类型的菜单:
应用程序菜单
应用程序菜单必须通过Shell类访问,在Mac OS X,系统上应用程序菜单由操作系统自动提供。应用程序使用这些AIR菜单API添加菜单项和子菜单到标准菜单上并注册处理函数,当然你也可以完全替换掉标准菜单。
窗体菜单
通过创建NativeMenu对象,然后赋值给NativeWindow.menu属性来添加窗体菜单。Windows操作系统支持窗体菜单,但是Mac OS X不可以。
上下文菜单
上下文菜单被添加到HTMLControl组件的交互对象和文档元素上。最典型的例子就是在HTML元素上使用Webkit API,当然也可以直接在HTMLControl上使用上下文菜单。
系统托盘菜单
通过创建NativeMenu对象并赋值给Shell.shell.icon.menu属性来创建系统托盘菜单。
Flex 菜单
Flex framework提供了一组Flex菜单类。这些Flex菜单类不需要窗体继承系统窗体风格即可使用而且还可在MXML格式中声明。如果你使用Flex Framework,这时就可以用Flex菜单类来代替本地菜单类了。
自定义菜单
本地菜单是在Flash和HTML渲染模型之外由操作系统负责绘制的,当然我们也可以自己绘制自己的非本地菜单,不过遗憾的是目前AIR菜单类还不支持“自绘制”菜单。
一个菜单包含一个或多个菜单项。一个菜单项可以是一个命令,一个子菜单,或一个分隔符,一般情况下,一个菜单项就是一个命令,如果菜单项的submenu属性被赋值为NativeMenu对象则变为子菜单,如果菜单项构造函数的isSeparator参数为true,则变为分隔符。
最顶层的菜单项显示在菜单栏上,其他子菜单添加在应用程序和窗体菜单的顶层菜单中(虽然有些操作系统可以直接把菜单项放在菜单栏上,这样看起来好像很不符合常规)。
下面的图标演示典型的菜单结构。根菜单包含子菜单“File”和“Edit”。"File"菜单包含两个命令和一个子菜单(用于显示最近打开的文档,它也是一个子菜单,包含三个菜单项)。"Edit"菜单包含三个命令和一个分隔符。
菜单和菜单项都可以发出displaying 和 select事件:
Displaying:
在菜单即将被显示之前,菜单及其子菜单会发出displaying事件通知其注册的监听器。Displaying事件给你一个机会来更新菜单内容或菜单项状态。例如在"Open Recent"菜单项的displaying处理函数可以改变反应当前阅读过的文档菜单项。
Event对象的target属性指向被显示的菜单,currentTarget 则是被注册监听器监听的对象,既可以是菜单本身,也可以是其菜单项。
Select:
当用户点击命令项时,该命令项会发出一个select事件给注册的监听器,不过子菜单和分隔符不能被选择也不会发出select事件。
菜单项的Select事件会一直往上传递到顶层菜单,所以你可以直接在菜单项上监听也可以在菜单结构的上层的监听。当监听select事件时,需要通过event的target属性确定是哪个菜单项触发了事件,而currentTarget 属性可以确定当前的菜单对象。
快捷键是菜单上操作系统键盘的一部分功能。无论是Mac OS X还是Windows 系统都允许用户用键盘打开或选择某个菜单命令项.
用字符串的索引指定快捷字符,字符串的第一个字母索引值为“0”。这样如果把“Format”字符串的“r“字母作为快捷字符,应设置其索引值mnemonicIndex属性为2。
var item:NativeMenuItem = new NativeMenuItem("Format");
item.mnemonicIndex = 2;
菜单项有两个状态属性,checked 和enabled:
checked
设置为true会在菜单项字符前加上标志
var item:NativeMenuItem = new NativeMenuItem("Format");
item.checked = true;
enabled
设置菜单项是否可用
var item:NativeMenuItem = new NativeMenuItem("Format");
item.enabled = false;
NativeMenuItem 类的data属性允许与任意类型的对象相关联。例如"Open Recent"菜单中,你可以赋值一个File对象到菜单项上:
var file:File = new File("app-storage:/GreatGatsby.pdf");
var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name));
menuItem.data = file;