Основные сведения о меню

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Краткое разъяснение и примеры кодов с созданием собственных меню в приложениях AIR см. в следующих статьях по быстрому началу работы в центре Adobe Developer Connection:

Классы исходных меню обеспечивают доступ к функциям исходных меню операционной системы, в которой выполняется приложение. Объекты NativeMenu могут применяться для создания меню приложения (в Mac OS X), меню окна (в Windows и Linux), контекстных и всплывающих меню.

Вне AIR вы можете использовать классы контекстного меню для преобразования контекстного меню, которое Flash Player автоматически отображает, когда пользователь щелкает правой кнопкой или щелкает с удержанием клавиши «Command» на объекте вашего приложения. (Автоматическое контекстное меню для приложений AIR не отображается.)

Классы меню

Классы меню перечислены ниже.

Разновидности меню

Ниже перечислены поддерживаемые AIR типы меню.

Контекстные меню
Контекстные меню открываются по щелчку правой кнопкой или щелчку с удерживанием клавиши «Command» по интерактивному объекту в SWF-содержимом или по элементу HTML-содержимого.

В среде выполнения Flash Player контекстное меню отображается автоматически. Для добавления в меню своих собственных команд можно использовать классы ContextMenu и ContextMenuItem. Можно также удалять некоторые, хотя и не все, встроенные команды.

В среде выполнения AIR контекстные меню можно создавать с помощью классов NativeMenu или ContextMenu. В HTML-содержимом в среде AIR для добавления контекстного меню к элементам можно применять прикладные интерфейсы программирования WebKit HTML и JavaScript.

Меню программы (только для AIR)
Меню программы — это глобальное меню, которое работает в рамках всего приложения. Меню программы поддерживаются в Mac OS X и не поддерживаются в Windows и Linux. Операционная система Mac OS X автоматически создает меню программы. С помощью API-интерфейса меню AIR в стандартные меню можно добавлять пункты и подменю. Можно также добавить прослушиватели для существующих команд меню. Также можно удалить существующие пункты.

Меню окон (только для AIR)
Меню окна связано с отдельным окном и отображается под строкой заголовка. Меню добавляется в окно путем создания объекта NativeMenu и его назначения свойству menu объекта NativeWindow. Меню окон поддерживаются в ОС Windows и Linux, но не поддерживаются в Mac OS X. Исходные меню можно использовать только с окнами, имеющими системный Chrome.

Меню значков Dock и области уведомлений (только для AIR)
Эти меню значков схожи с контекстными меню и назначаются значку приложения на панели Dock в Mac OS X или в областях уведомления на панели задач в Windows. Для создания меню значков Dock и области уведомлений используется класс NativeMenu. В Mac OS X элементы меню добавляются над стандартными системными элементами. В Windows или Linux стандартное меню отсутствует.

Всплывающие меню (только для AIR)
Всплывающие меню AIR напоминают контекстные, но не всегда связаны с конкретным объектом или компонентом приложения. Всплывающие меню могут выводиться в любой части окна в результате вызова метода display() любого объекта NativeMenu.

Заказные меню
Исходные меню отрисовываются исключительно операционной системой и поэтому не входят в модели визуализации Flash и HTML. Вместо исходных меню всегда можно создать свои собственные пользовательские меню, использовав для этого языки MXML, ActionScript или сценарий JavaScript (в AIR). Такие меню должны полностью визуализироваться внутри содержимого программы.

меню Flex
Инфраструктура Adobe® Flex™ предоставляет набор компонентов меню Flex. Меню Flex рисует среда выполнения, а не операционная система, они не являются исходными . Меню Flex может использоваться в окнах, не имеющих системного Chrome. Другим преимуществом меню Flex является то, что их можно декларативно определять в формате MXML. Если используется инфраструктура Flex Framework, создавать меню окон рекомендуется с помощью классов меню Flex, а не исходных классов.

Меню по умолчанию (только для AIR)

Ниже перечислены меню по умолчанию, предоставляемые операционной системой или встроенным классом AIR:

  • Меню программы в Mac OS X

  • Меню значка Dock в Mac OS X

  • Контекстное меню для выделенного текста или изображения в HTML-содержимом

  • Контекстное меню для выделенного текста в объекте TextField (или расширении объекта TextField)

О контекстных меню

В SWF-содержимом любой объект-наследник InteractiveObject может иметь контекстное меню. Для этого нужно назначить объект меню его свойству contextMenu . Некоторые команды включены по умолчанию, например «Вперед», «Назад», «Печать», «Качество» и «Масштаб». В среде выполнения AIR объект меню, назначенный свойству contextMenu , может относиться к типу NativeMenu или ContextMenu. В среде выполнения Flash Player доступен только класс ContextMenu.

Можно выполнять прослушивание либо событий исходных меню, либо событий контекстных меню, если используются классы ContextMenu и ContextMenuItem; при этом будут создаваться и те и другие события. Одним из преимуществ, обеспечиваемых свойствами объекта ContextMenuEvent, является то, что свойство contextMenuOwner идентифицирует объект, к которому прикреплено меню, а свойство mouseTarget идентифицирует объект, который щелкнули для открытия меню. Эта информация не доступна из объекта NativeMenuEvent.

В примере ниже показано, как создать спрайт и добавить простое контекстное меню правки:

var sprite:Sprite = new Sprite(); 
sprite.contextMenu = createContextMenu() 
private function createContextMenu():ContextMenu{ 
    var editContextMenu:ContextMenu = new ContextMenu(); 
    var cutItem:ContextMenuItem = new ContextMenuItem("Cut") 
    cutItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCutCommand); 
    editContextMenu.customItems.push(cutItem); 
     
    var copyItem:ContextMenuItem = new ContextMenuItem("Copy") 
    copyItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCopyCommand);             
    editContextMenu.customItems.push(copyItem); 
     
    var pasteItem:ContextMenuItem = new ContextMenuItem("Paste") 
    pasteItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doPasteCommand); 
    editContextMenu.customItems.push(pasteItem); 
         
    return editContextMenu 
} 
private function doCutCommand(event:ContextMenuEvent):void{trace("cut");} 
private function doCopyCommand(event:ContextMenuEvent):void{trace("copy");} 
private function doPasteCommand(event:ContextMenuEvent):void{trace("paste");}
Примечание. В отличие от SWF-содержимого, отображаемого в среде обозревателя, контекстные меню в среде AIR не имеют встроенных команд.

Настройка контекстного меню Flash Player

В браузере или проекторе контекстные меню в SWF-содержимом всегда содержат встроенные элементы. Из меню можно удалить все команды по умолчанию, кроме команд «Настройки» и «О программе». Если задать свойству рабочей области showDefaultContextMenu значение false , эти команды будут удалены из контекстного меню.

Для создания персонализированного контекстного меню для конкретного экранного объекта создайте новый экземпляр класса ContextMenu, вызовите метод hideBuiltInItems() и назначьте этот экземпляр свойству contextMenu этого экземпляра DisplayObject. В примере ниже показан динамически рисуемый квадрат с командой контекстного меню, позволяющей изменить его цвет:

var square:Sprite = new Sprite(); 
square.graphics.beginFill(0x000000); 
square.graphics.drawRect(0,0,100,100); 
square.graphics.endFill(); 
square.x = 
square.y = 10; 
addChild(square); 
 
var menuItem:ContextMenuItem = new ContextMenuItem("Change Color"); 
menuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,changeColor); 
var customContextMenu:ContextMenu = new ContextMenu(); 
customContextMenu.hideBuiltInItems(); 
customContextMenu.customItems.push(menuItem); 
square.contextMenu = customContextMenu; 
 
function changeColor(event:ContextMenuEvent):void 
{ 
    square.transform.colorTransform = getRandomColor(); 
} 
function getRandomColor():ColorTransform 
{ 
    return new ColorTransform(Math.random(), Math.random(),         Math.random(),1,(Math.random() * 512) - 255,         (Math.random() * 512) -255, (Math.random() * 512) - 255, 0); 
}

Структура исходного меню (AIR)

Исходные меню по своей природе имеют иерархическую структуру. Объекты NativeMenu содержат дочерние объекты NativeMenuItem. Объекты NativeMenuItem, представляющие подменю, в свою очередь, могут содержать объекты NativeMenu. Объект меню верхнего (корневого) уровня представляет строку меню программы или окна. (У контекстных и всплывающих меню, а также меню значков нет строки меню.)

На схеме ниже показана типичная структура меню. Корневое меню — это строка меню, содержащая два пункта, указывающие на подменю Файл и Правка . Подменю «Файл» в этой структуре содержит две команды и пункт, ссылающийся на подменю Открыть последний файл , которое содержит еще три пункта. Подменю «Правка» содержит три команды и разделитель.

Для определения подменю необходимы объекты NativeMenu и NativeMenuItem. Объект NativeMenuItem определяет текст заголовка, отображаемый в родительском меню, и позволяет пользователю открывать подменю. Объект NativeMenu служит контейнером для элементов подменю. Объект NativeMenuItem ссылается на объект NativeMenu через свойство submenu объекта NativeMenuItem.

Пример кода, с помощью которого создается это меню, см. в разделе « Пример собственного меню: меню окна и приложения (AIR) ».

События меню

Объекты NativeMenu и NativeMenuItem отправляют события preparing , displaying и select :

Preparing: каждый раз при начале взаимодействия объекта с пользователем меню и элементы меню отправляют событие preparing всем зарегистрированным прослушивателям. Взаимодействие включает открытие меню и выбор элемента меню с помощью клавиатурных сокращений.
Примечание. Событие preparing доступно только в Adobe AIR 2.6 и более поздних версиях.
Displaying (отображение):
Непосредственно перед отображением меню оно само и его элементы отправляют событие displaying всем зарегистрированным прослушивателям.

События preparing и displaying дают возможность обновить содержимое меню или вид пункта меню перед его выводом на экран. Например, в прослушивателе события displaying меню «Открыть последний файл» можно изменить пункты меню так, чтобы они отображали список недавно просмотренных документов.

Если элемент меню, клавиатурное сокращение которого вызвало событие preparing , был удален, взаимодействие меню отменяется, и событие select не отправляется.

Свойства события target и currentTarget являются объектами, для которых зарегистрирован прослушиватель (меню или один из его пунктов).

Событие preparing отправляется перед событием displaying . Обычно выполняется прослушивание только одного из событий.

Выделить:
Когда пользователь выбирает в меню пункт-команду, этот пункт отправляет событие select всем зарегистрированным прослушивателям. Подменю и разделитель нельзя выбрать, поэтому эти элементы не могут отправлять событие select .

Событие select передается вверх по иерархии от пункта меню до его родительского меню или до корневого меню. Событие select можно прослушивать непосредственно на элементе меню, а также можно прослушивать структуру меню вверх по иерархии. При прослушивании события select в меню можно определить выбранный элемент с помощью свойства target события. Так как событие передается вверх по иерархии меню, свойство currentTarget объекта события определяет текущий объект меню.

Примечание. Объекты ContextMenu и ContextMenuItem отправляют события menuItemSelect и menuSelect , а также события select , preparing и displaying .

Клавишные эквиваленты для команд исходного меню (AIR)

Команде меню можно назначить клавишный эквивалент (иногда называемый ускорителем). Пункт меню отправляет событие select всем зарегистрированным прослушивателям, когда пользователь нажимает клавишу или комбинацию клавиш. Чтобы команда сработала, меню, содержащее элемент, должно быть частью меню программы или активного окна.

Клавишные эквиваленты состоят из двух частей: строки, представляющей основную клавишу, и массива клавиш-модификаторов, которые также должны быть нажаты. Чтобы назначить основную клавишу, задайте для свойства keyEquivalent пункта меню односимвольную строку. При использовании верхнего регистра клавиша «Shift» автоматически добавляется в массив.

В Mac OS X модификатором по молчанию является клавиша «Сommand» ( Keyboard.COMMAND ). В Windows или Linux это клавиша Сtrl ( Keyboard.CONTROL ). Эти клавиши по умолчанию добавляются в массив автоматически. Для назначения разных клавиш-модификаторов назначьте новый массив с кодами нужных клавиш в свойство keyEquivalentModifiers . Массив по умолчанию будет заменен на новый. Независимо от того, используете вы модификаторы по умолчанию или назначаете собственные, если строка, назначаемая свойству keyEquivalent , записана в верхнем регистре, клавиша «Shift» добавляется в массив автоматически. Константы кодов клавиш-модификаторов задаются классом Keyboard.

Строка назначенного клавишного эквивалента автоматически выводится рядом с названием пункта меню. Формат зависит от операционной системы и ее настроек.

Примечание. Если значение Keyboard.COMMAND назначено массиву модификаторов в ОС Windows, в меню не отображаются клавишные эквиваленты. Тем не менее для активации команд меню должна использоваться клавиша «Ctrl».

В примере ниже показано, как назначить пункту меню сочетание клавиш Ctrl+Shift+G :

var item:NativeMenuItem = new NativeMenuItem("Ungroup"); 
item.keyEquivalent = "G"; 

В этом примере сочетание клавиш Ctrl+Shift+G назначается эквивалентом путем прямого задания массива модификаторов:

var item:NativeMenuItem = new NativeMenuItem("Ungroup"); 
item.keyEquivalent = "G"; 
item.keyEquivalentModifiers = [Keyboard.CONTROL]; 
Примечание. Клавишные эквиваленты поддерживаются только в меню программы или окна. Если добавить клавишный эквивалент в контекстное или всплывающее меню, комбинация клавиш будет отображаться рядом с пунктом меню, но нужную команду с ее помощью вызвать не удастся.

Мнемонические клавиши (AIR)

Мнемонические клавиши являются частью клавиатурного интерфейса операционных систем. Linux, Mac OS X и Windows позволяют открывать меню и выбирать команды с помощью клавиатуры, но существуют небольшие различия.

В Mac OS X пользователь вводит первую букву или две в названии команды и нажимает клавишу Return. Свойство mnemonicIndex игнорируется.

В Windows имеет значение только одна буква. По умолчанию значимой буквой является только первая буква в названии пункта меню, но если назначить элементу мнемоническую клавишу, то любая буква может стать значимым символом. Если два пункта меню имеют одинаковый значимый символ (неважно, назначена ли мнемоническая клавиша), то работа пользователя с меню несколько изменится. Вместо выбора меню или команды нажатием одной клавиши придется нажать эту клавишу столько раз, сколько потребуется для выделения нужного пункта, а затем нажать «Ввод» для подтверждения выбора. Чтобы избежать непредсказуемого поведения, следует назначать каждому пункту меню уникальную мнемоническую клавишу.

В Linux мнемонические клавиши по умолчанию не заданы. Необходимо указать значение для свойства mnemonicIndex элемента меню, чтобы активировать мнемоническую клавишу.

Задайте мнемонический символ путем назначения индекса строки названия пункта меню. Индекс первого символа — 0. Таким образом, чтобы использовать в качестве мнемонического символа для пункта меню букву «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
Переключайте значение с true на false , чтобы включать и выключать команду. Отключенные элементы отображаются затененными и не могут отправлять события select .
var item:NativeMenuItem = new NativeMenuItem("Format"); 
item.enabled = false; 

Прикрепление объекта к пункту меню

Свойство data класса NativeMenuItem позволяет ссылаться на любой объект в каждом пункте. Например, в меню «Открыть последний файл» можно назначить каждому из пунктов меню объект File соответствующего документа.

var file:File = File.applicationStorageDirectory.resolvePath("GreatGatsby.pdf") 
var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name)); 
menuItem.data = file;