Menú: conceptos básicos
Flash Player 9 y posterior, Adobe AIR 1.0 y posterior
Para ver una explicación rápida y ejemplos de código de la creación de menús nativos en aplicaciones de AIR, consulte los siguientes artículos de inicio rápido del Centro de desarrollo de Adobe:
Las clases de menú nativo permiten acceder a las funciones del menú nativo del sistema operativo donde se ejecuta la aplicación. Se pueden utilizar los objetos NativeMenu para menús de aplicación (disponibles en Mac OS X), menús de ventana (disponibles en Windows y Linux), menús contextuales y menús emergentes.
Fuera de AIR, se pueden utilizar las clases del menú contextual para modificar el menú contextual que muestra automáticamente Flash Player cuando un usuario hace clic con el botón derecho o presiona comando y hace clic en un objeto de la aplicación. (En las aplicaciones de AIR no se muestra ningún menú contextual automático.)
Clases de menú
Entre las clases de menú se incluyen:
Paquete
|
Clases
|
flash.display
|
|
flash.ui
|
|
flash.events
|
|
Variedades de menú
AIR admite los siguientes tipos de menús:
-
Menús contextuales
-
Los menús contextuales se abren en respuesta a un clic con el botón derecho del ratón o a un clic de un comando en un objeto interactivo en el contenido SWF o en un elemento de documento en un contenido HTML.
En el motor de ejecución de Flash Player, un menú contextual se muestra automáticamente. Las clases ContextMenu y ContextMenuItem se pueden emplear para añadir comandos propios al menú. También se pueden eliminar algunos, pero no todos, comandos incorporados.
En el motor de ejecución de AIR, se puede crear un menú contextual utilizando la clase NativeMenu o ContextMenu. En el contenido HTML en AIR, se puede utilizar el Webkit HTML y las API JavaScript para añadir menús contextuales a elementos HTML.
-
Menús de aplicación (solo AIR)
-
Un menú de aplicación es un menú global que se aplica a toda la aplicación. Los menús de aplicación son compatibles en Mac OS X, pero no en Windows o Linux. En Mac OS X, el sistema operativo automáticamente crea un menú de aplicación. Se puede utilizar la API del menú AIR para añadir elementos y submenús secundarios a los menús estándar. Se pueden añadir detectores para gestionar los comandos de menú existentes. O bien se pueden quitar elementos existentes.
-
Menús de ventana (solo AIR)
-
Un menú de ventana está asociado con una sola ventana y se muestra debajo de la barra de título. Se pueden añadir los menús a una ventana creando un objeto NativeMenu y asignándolo a la propiedad
menu
del objeto NativeWindow. Los menús de ventana son compatibles con los sistemas operativos Windows y Linux, pero no en Mac OS X. Los menús de ventana nativos solo se pueden utilizar con ventanas que tienen fondo cromático del sistema.
-
Menús del icono de acoplamiento y de bandeja del sistema (solo AIR)
-
Estos menús de iconos son similares a los menús contextuales y se asignan a un icono de aplicación en el acoplamiento de Mac OS X o las áreas de notificación en la barra de tareas de Windows y Linux. Los menús del icono de acoplamiento y bandeja del sistema utilizan la clase NativeMenu. En Mac OS X, los elementos en el menú se añaden por encima de los elementos del sistema operativo estándar. En Windows o Linux, no hay un menú estándar.
-
Menús emergentes (solo AIR)
-
Un menú emergente de AIR es como un menú contextual, pero no necesariamente está asociado con un determinado objeto o elemento de aplicación. Los menús emergentes se pueden mostrar en cualquier parte de una ventana llamando al método
display()
de cualquier objeto NativeMenu.
-
Menús personalizados
-
El sistema operativo invoca los menús nativos y, como tal, existen fuera de los modelos de representación de Flash y HTML. En lugar de utilizar menús nativos, siempre puede crear sus propios menús no nativos y personalizados utilizando MXML, ActionScript o JavaScript (en AIR). Estos menús deben procesarse por completo dentro del contenido de la aplicación.
-
Menús de Flex
-
La arquitectura Adobe® Flex™ proporciona una serie de componentes de menú Flex. El motor de ejecución y no el sistema operativo invoca los menús Flex y no son menús
nativos
. El componente del menú Flex se puede utilizar para ventanas Flex que no tienen un fondo cromático del sistema. Otra ventaja de utilizar el componente de menú Flex es que se pueden especificar menús de forma declarativa en el formato MXML. Si se utiliza la arquitectura de Flex, se utilizan las clases del menú Flex para los menús de ventana en lugar de las clases nativas.
Menús predeterminados (solo AIR)
El sistema operativo o una clase incorporada de AIR proporciona los siguientes menús predeterminados:
-
Menú de aplicación en Mac OS X
-
Menú de icono de acoplamiento en Mac OS X
-
Menú contextual para texto e imágenes seleccionados en un contenido HTML
-
Menú contextual para texto seleccionado en un objeto TextField (o en un objeto que amplía TextField)
Menús contextuales
En el contenido SWF, a cualquier objeto que hereda de InteractiveObject se le puede asignar un menú contextual asignando un objeto de menú a la propiedad
contextMenu
. Se incluyen varios comandos de manera predeterminada, incluidos Forward (Avanzar), Back (Atrás), Print (Imprimir), Quality (Calidad) y Zoom. En el motor de ejecución de AIR, el objeto de menú asignado a
contextMenu
puede ser del tipo NativeMenu o ContextMenu. En el motor de ejecución de Flash Player, solo está disponible la clase ContextMenu.
Puede detectar eventos de menú nativo o eventos de menús contextuales con el uso de las clases ContextMenu y ContextMenuItem; ambas se distribuyen. Una ventaja que ofrecen las propiedades del objeto ContextMenuEvent es que contextMenuOwner identifica el objeto al que se asocia el menú y
mouseTarget
identifica el objeto en el que se hizo clic para abrir el menú. Esta información no está disponible en el objeto NativeMenuEvent.
El siguiente ejemplo crea un objeto Sprite y añade un simple menú contextual de edición:
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");}
Nota:
a diferencia del contenido SWF que se muestra en un entorno de navegador, los menús contextuales en AIR no tienen comandos incorporados.
Personalización de un menú contextual de Flash Player
En un navegador o proyector, los menús contextuales en el contenido SWF siempre disponen de elementos incorporados. Se pueden eliminar todos los comandos predeterminados del menú, excepto Configuración y Acerca de. Si se establece la propiedad
showDefaultContextMenu
del objeto Stage en
false
, se eliminan estos comandos del menú contextual.
Para crear un menú contextual personalizado para un objeto de visualización específico hay que crear una nueva instancia de la clase ContextMenu, llamar al método
hideBuiltInItems()
y asignar dicha instancia a la propiedad
contextMenu
de la instancia de DisplayObject. El siguiente ejemplo proporciona un cuadrado dibujado dinámicamente con un comando de menú contextual para aplicarle un color aleatorio:
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);
}
Estructura del menú nativo (AIR)
Los menús nativos, por naturaleza, se crean en jerarquías. Los objetos NativeMenu contienen objetos secundarios NativeMenuItem. Los objetos NativeMenuItem que, a su vez, representan los submenús pueden tener objetos NativeMenu. El objeto de menú principal o raíz en la estructura representa la barra de menús para los menús de aplicación y de ventana. (Los menús contextuales, de icono y los menús emergentes no cuentan con una barra de menús).
El siguiente diagrama muestra la estructura de un menú típico. El menú raíz representa la barra de menús y contiene dos elementos de menú que hacen referencia a un submenú
Archivo
y a un submenú
Editar
. El submenú Archivo en esta estructura contiene dos elementos de comando y un elemento que hace referencia a un submenú
Menú Abrir reciente
, que contiene tres elementos. El submenú Editar contiene tres comandos y un separador.
La definición de un submenú requiere un objeto NativeMenu y NativeMenuItem. El objeto NativeMenuItem define la etiqueta que se muestra en el menú principal y permite al usuario abrir el submenú. El objeto NativeMenu actúa como un contenedor para los elementos en el submenú. El objeto NativeMenuItem hace referencia al objeto NativeMenu a través de la propiedad
submenu
de NativeMenuItem.
Para ver un ejemplo de código que crea este menú, consulte
Ejemplo de menú nativo: Menú de aplicación y de ventana (AIR)
.
Eventos de menú
Los objetos NativeMenu y NativeMenuItem distribuyen eventos
preparing
,
displaying
y
select
:
Preparing:
siempre que el objeto está a punto de comenzar una interacción con el usuario, los elementos de menú distribuyen un evento
preparing
a cualquiera de los detectores registrados. La interacción incluye la apertura del menú o la selección de un elemento con un método abreviado de teclado.
Nota:
el evento
preparing
solo está disponible para Adobe AIR 2.6 y posterior.
-
Displaying:
-
Inmediatamente antes de visualizar un menú, el menú y los elementos de menú distribuyen un evento
displaying
a cualquier detector registrado.
Los eventos
preparing
y
displaying
proporcionan la oportunidad de actualizar los contenidos de menú o la apariencia de elementos antes de que se muestre al usuario. Por ejemplo, en el detector para el evento
displaying
de un menú “Abrir reciente”, se pueden cambiar los elementos de menú para reflejar la lista actual de documentos recientemente visualizados.
Si se elimina el elemento de menú cuyo método abreviado de teclado activó un evento
preparing
, la interacción con el menú se cancela y no se distribuye ningún evento
select
.
Las propiedades
target
y
currentTarget
del evento son ambas el objeto en el que se registra el detector: el propio menú o uno de sus elementos.
El evento
preparing
se distribuye antes del evento
displaying
. Generalmente se detecta un evento o el otro, no ambos.
-
Select:
-
Cuando el usuario elige un elemento de comando, el elemento distribuye un evento
select
a cualquier detector registrado. Los elementos de submenú y separador no se pueden seleccionar y por ende nunca distribuyen un evento
select
.
Un evento
select
se propaga desde un elemento de menú al menú que lo contienen hasta el menú raíz. Se pueden detectar eventos
select
directamente en un elemento y en niveles superiores en la estructura del menú. Cuando se detecta el evento
select
en un menú, se puede identificar el elemento seleccionado utilizando la propiedad de evento
target
. A medida que el evento se propaga a través de la jerarquía, la propiedad
currentTarget
del objeto de evento identifica el objeto de menú actual.
Nota:
los objetos ContextMenu y ContextMenuItem distribuyen eventos
menuItemSelect
y
menuSelect
, así como eventos
select
,
preparing
y
displaying
.
Equivalentes de teclas para comandos de menú nativo (AIR)
Se puede asignar un equivalente de tecla (a veces llamado acelerador) a un comando de menú. El elemento de menú distribuye un evento
select
a cualquier detector registrado cuando se presiona la tecla o combinación de teclas. El menú que contiene el elemento debe ser parte del menú de aplicación o de la ventana activa para que se invoque el comando.
Los equivalentes de teclas tienen dos partes, una cadena que representa la tecla principal y un conjunto de teclas modificadoras que también se deben presionar. Para asignar la tecla principal, establezca la propiedad
keyEquivalent
del elemento de menú a la cadena de un solo carácter para dicha tecla. Se utiliza una letra mayúscula, la tecla Mayús se añade automáticamente al conjunto modificador.
En Mac OS X, el modificador predeterminado es la tecla de comando (
Keyboard.COMMAND
). En Windows y Linux, es la tecla de control (
Keyboard.CONTROL
). Estas teclas predeterminadas se añaden automáticamente al conjunto modificador. Para asignar diferentes teclas modificadoras, asigne un nuevo conjunto que contenga los códigos de tecla deseados a la propiedad
keyEquivalentModifiers
. El conjunto predeterminado se sobrescribe. Si utiliza los modificadores predeterminados o si asigna su propio conjunto modificador, se añade la tecla Mayús si la cadena que asigna a la propiedad
keyEquivalent
es una letra mayúscula. Las constantes de los códigos de tecla para utilizar en las teclas modificadoras se definen en la clase Keyboard.
La cadena equivalente de la tecla asignada se muestra automáticamente junto al nombre del elemento de menú. El formato depende del sistema operativo del usuario y las preferencias del sistema.
Nota:
si asigna el valor
Keyboard.COMMAND
a un conjunto de modificadores de teclas en el sistema operativo Windows, no se muestra ningún equivalente de tecla en el menú. Sin embargo, se debe utilizar la tecla de control para activar el comando de menú.
En el siguiente ejemplo se asigna
Ctrl+Mayús+G
como el equivalente de tecla para un elemento de menú:
var item:NativeMenuItem = new NativeMenuItem("Ungroup");
item.keyEquivalent = "G";
En este ejemplo se asigna
Ctrl+Mayús+G
como el equivalente de tecla configurando directamente el conjunto modificador:
var item:NativeMenuItem = new NativeMenuItem("Ungroup");
item.keyEquivalent = "G";
item.keyEquivalentModifiers = [Keyboard.CONTROL];
Nota:
los equivalentes de teclas solo se activan para menús de ventana y de aplicación. Si se añade un equivalente de tecla a un menú contextual o emergente, el mismo se muestra en la etiqueta de menú, pero el comando de menú asociado nunca se invoca.
Letras de selección (AIR)
Las letras de selección son parte de la interfaz del teclado del sistema operativo a los menús. Linux, Mac OS X y Windows permiten a los usuarios abrir menús y seleccionar comandos con el teclado, pero hay pequeñas diferencias.
En Mac OS X, el usuario escribe las primeras letras del menú o comando y presiona la tecla de retorno. La propiedad
mnemonicIndex
se omite.
En Windows, solo una letra es significativa. Como valor predeterminado, la letra significativa es el primer carácter de la etiqueta, pero si se asigna una letra de selección al elemento de menú, entonces el carácter significativo se convierte en la letra designada. Si dos elementos en un menú tienen el mismo carácter significativo (independientemente si se ha asignado una letra de selección) entonces la interacción del teclado con el menú cambia ligeramente. En lugar de presionar una sola letra para seleccionar el menú o comando, el usuario debe presionar la letra tantas veces como sea necesario para resaltar el elemento deseado y luego presionar la tecla Intro para completar la selección. Para mantener un comportamiento coherente, debe asignar una letra de selección exclusiva para cada elemento en un menú para los menús de ventana.
en Linux, no se proporciona ninguna letra de selección predeterminada. Es necesario especificar un valor para la propiedad
mnemonicIndex
de un elemento de menú para proporcionar una letra de selección.
Se debe especificar la letra de selección como un índice en la cadena de la etiqueta. El índice del primer carácter en una etiqueta es 0. Por consiguiente, para utilizar “r” como la letra de selección para un elemento de menú denominado “Formato,” se debe establecer la propiedad
mnemonicIndex
igual a 2.
var item:NativeMenuItem = new NativeMenuItem("Format");
item.mnemonicIndex = 2;
Estado de los elementos de menú
Los elementos de menú tienen dos propiedades de estado,
checked
y
enabled
:
-
checked
-
Se debe establecer en
true
para mostrar una marca de verificación junto a la etiqueta del elemento.
var item:NativeMenuItem = new NativeMenuItem("Format");
item.checked = true;
-
enabled
-
Seleccione el valor
true
o
false
para controlar si el comando está activado o no. Los elementos desactivados aparecen “sombreados” y no distribuyen eventos
select
.
var item:NativeMenuItem = new NativeMenuItem("Format");
item.enabled = false;
Asociación de un objeto a un elemento de menú
La propiedad
data
de la clase NativeMenuItem permite hacer referencia a un objeto arbitrario en cada elemento. Por ejemplo, en un menú “Abrir reciente”, puede asignar el objeto File para cada documento a cada elemento de menú.
var file:File = File.applicationStorageDirectory.resolvePath("GreatGatsby.pdf")
var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name));
menuItem.data = file;
|
|
|
|
|