Creación de ventanas

Adobe AIR 1.0 y posterior

AIR crea automáticamente la primera ventana de la aplicación, pero el usuario puede crear más ventanas adicionales si lo necesita. Para crear una ventana nativa, utilice el método NativeWindow.

Para crear una ventana HTML, utilice el método createRootWindow() de HTMLLoader o, desde un documento HTML, llame al método window.open() de JavaScript. La ventana creada es un objeto NativeWindow cuya lista de visualización contiene un objeto HTMLLoader. El objeto HTMLLoader interpreta y muestra el contenido HTML y JavaScript para la ventana. Se puede acceder a las propiedades del objeto NativeWindow subyacente desde JavaScript usando la propiedad window.nativeWindow . (A esta propiedad solo puede acceder el código que se ejecuta en el entorno limitado de la aplicación AIR.)

Cuando se inicializa una ventana (incluida la ventana inicial de la aplicación), debe considerar la creación de la ventana en estado invisible, cargar el contenido o ejecutar actualizaciones gráficas y, después, hacer la ventana visible. Esta secuencia impide que se produzcan fallos visuales en el proceso y que el usuario pueda verlos. Puede especificar que la ventana inicial de la aplicación se cree en estado invisible especificando la etiqueta <visible>false</visible> en el descriptor de la aplicación (o dejando la etiqueta fuera, ya que false es el valor predeterminado). Los nuevos objetos NativeWindow son invisibles de forma predeterminada. Cuando se crea una ventana HTML con el método HTMLLoader createRootWindow() , se puede establecer el argumento visible como false . Llame al método NativeWindow activate() o establezca la propiedad visible como true para hacer la ventana visible.

Especificación de propiedades de inicialización de una ventana

Las propiedades de inicialización de una ventana nativa no se pueden modificar una vez creada la ventana de escritorio. Estas propiedades invariables y sus valores predeterminados son:

Propiedad

Valor predeterminado

systemChrome

standard

type

normal

transparent

false

owner

null

maximizable

true

minimizable

true

resizable

true

Establezca las propiedades de la ventana inicial creada por AIR en el archivo descriptor de la aplicación. La ventana principal de una aplicación de AIR siempre es de tipo normal . (Se pueden especificar propiedades adicionales de la ventana en el archivo descriptor, por ejemplo, visible , width y height ; estas propiedades se pueden modificar en cualquier momento.)

Puede establecer las propiedades de otras ventanas nativas y HTML creadas por la aplicación mediante la clase NativeWindowInitOptions. Cuando se crea una ventana, se debe transferir un objeto NativeWindowInitOptions especificando las propiedades de la ventana en la función constructora NativeWindow o en el método createRootWindow() de HTMLLoader.

El siguiente código crea un objeto NativeWindowInitOptions para una ventana de utilidades:

var options:NativeWindowInitOptions = new NativeWindowInitOptions(); 
options.systemChrome = NativeWindowSystemChrome.STANDARD; 
options.type = NativeWindowType.UTILITY 
options.transparent = false; 
options.resizable = false; 
options.maximizable = false; 

No está permitido establecer systemChrome como standard si transparent es true o type es lightweight .

Nota: no es posible definir las propiedades de inicialización de una ventana creada con la función window.open() de JavaScript. Sin embargo, sí se puede anular el modo en que se crean estas ventanas implementando su propia clase HTMLHost. Consulte Gestión de llamadas JavaScript a window.open() para obtener más información.

Cuando se crea una ventana con la clase mx:Window de Flex, se especifican las propiedades de inicialización en el propio objeto window, bien en la declaración MXML de la ventana o en el código que la crea. El objeto subyacente NativeWindow no se crea hasta que se llama al método open() . Una vez abierta la ventana, estas propiedades de inicialización ya no se pueden modificar.

Creación de la ventana inicial de la aplicación

AIR crea la ventana inicial de la aplicación a partir de las propiedades especificadas en el descriptor de la aplicación y carga el archivo al que se hace referencia en el elemento del contenido. El elemento de contenido debe hacer referencia a un archivo SWF o HTML.

La ventana inicial puede ser la ventana principal de la aplicación o simplemente una o varias ventanas adicionales que se abren. No tienen por qué ser visibles.

Creación de la ventana inicial con ActionScript

Si crea una aplicación de AIR con ActionScript, la clase principal de la aplicación debe ampliar la clase Sprite (o una clase secundaria de la clase Sprite). Esta clase sirve de punto de entrada principal para la aplicación.

Cuando se inicia la aplicación, AIR crea una ventana, crea una instancia de la clase principal y añade la instancia al escenario de la ventana. Para acceder a la ventana, puede detectar el evento addedToStage y utilizar la propiedad nativeWindow del objeto Stage para obtener una referencia al objeto NativeWindow.

El siguiente ejemplo ilustra la estructura básica de la clase principal de una aplicación de AIR creada con ActionScript:

package { 
    import flash.display.NativeWindow; 
    import flash.display.Sprite; 
    import flash.events.Event; 
 
    public class MainClass extends Sprite 
    { 
        private var mainWindow:NativeWindow; 
        public function MainClass(){ 
            this.addEventListener(Event.ADDED_TO_STAGE, initialize); 
        } 
         
        private function initialize(event:Event):void{ 
            mainWindow = this.stage.nativeWindow; 
            //perform initialization... 
            mainWindow.activate(); //show the window 
        } 
    } 
}
Nota: técnicamente, se PUEDE acceder a la propiedad nativeWindow en la función constructora de la clase principal. Sin embargo, se trata de un caso especial que solo se aplica a la ventana inicial de la aplicación.

Al crear una aplicación en Flash Professional, la clase del documento principal se crea automáticamente si no se crea una clase propia en un archivo independiente de ActionScript. Es posible acceder al objeto NativeWindow de la ventana inicial utilizando la propiedad nativeWindow del escenario. Por ejemplo, el siguiente código activa la ventana principal en estado maximizado (desde la línea de tiempo):

import flash.display.NativeWindow; 
 
var mainWindow:NativeWindow = this.stage.nativeWindow; 
mainWindow.maximize(); 
mainWindow.activate();

Creación de la ventana inicial con Flex

Si crea una aplicación de AIR con la arquitectura de Flex, utilice la clase mx:WindowedApplication como elemento raíz del archivo MXML principal. (Puede utilizar el componente mx:Application, pero tenga en cuenta que este componente no admite todas las funciones disponibles en AIR.) El componente WindowedApplication sirve de punto de entrada inicial de la aplicación.

Cuando se inicia la aplicación, AIR crea una ventana nativa, inicializa la arquitectura de Flex y añade el objeto WindowedApplication al escenario de la ventana. Cuando finaliza la secuencia de inicio, el objeto WindowedApplication distribuye un evento applicationComplete . Puede acceder al objeto de ventana de escritorio con la propiedad nativeWindow de la instancia de WindowedApplication.

El siguiente ejemplo crea un componente WindowedApplication sencillo que establece sus coordenadas x e y:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"  
    applicationComplete="placeWindow()"> 
    <mx:Script> 
        <![CDATA[ 
            private function placeWindow():void{ 
                this.nativeWindow.x = 300; 
                this.nativeWindow.y = 300; 
            } 
        ]]> 
    </mx:Script> 
    <mx:Label text="Hello World" horizontalCenter="0" verticalCenter="0"/> 
</mx:WindowedApplication>

Creación de una ventana nativa

Para crear una ventana NativeWindow, transfiera un objeto NativeWindowInitOptions al constructor NativeWindow:

var options:NativeWindowInitOptions = new NativeWindowInitOptions(); 
options.systemChrome = NativeWindowSystemChrome.STANDARD; 
options.transparent = false; 
var newWindow:NativeWindow = new NativeWindow(options); 

La ventana no se muestra hasta que se establece la propiedad visible como true o se llama al método activate() .

Una vez creada la ventana, puede inicializar sus propiedades y cargar contenido utilizando la propiedad de escenario y técnicas de lista de visualización de Flash.

En casi todos los casos, debe establecer la propiedad scaleMode del escenario de una nueva ventana nativa como noScale (utilice la constante StageScaleMode.NO_SCALE ). Los modos de escala de Flash están diseñados para situaciones en las que el autor de la aplicación desconoce la relación de aspecto del espacio de visualización de la aplicación. Los modos de escala permiten al autor escoger la opción menos arriesgada: recortar el contenido, estrecharlo o apretarlo, o incluso llenarlo con un espacio vacío. Como el desarrollador controla el espacio de visualización en AIR (el marco de la ventana), es posible cambiar el tamaño de la ventana para que se ajuste al contenido, o cambiar el tamaño sin aplicar ningún ajuste.

El modo de escala de ventanas de Flex y HTML se establece como noScale automáticamente.

Nota: para determinar los tamaños máximo y mínimo de ventana admitidos en el sistema operativo actual, utilice las siguientes propiedades estáticas de NativeWindow:
var maxOSSize:Point = NativeWindow.systemMaxSize; 
var minOSSize:Point = NativeWindow.systemMinSize; 

Creación de una ventana HTML

Para crear una ventana HTML, puede llamar al método Window.open() de JavaScript, o llamar al método createRootWindow() de la clase HTMLLoader de AIR.

El contenido HTML de cualquier entorno limitado de seguridad puede utilizar el método Window.open() estándar de JavaScript. Si el contenido se ejecuta fuera del entorno limitado de la aplicación, se puede llamar al método open() solo como respuesta a la interacción del usuario, por ejemplo, cuando hace clic con el ratón o cuando pulsa una tecla. Cuando se llama a open() , se crea una ventana con fondo cromático del sistema para visualizar el contenido en la dirección URL especificada. Por ejemplo:

newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10");
Nota: puede ampliar la clase HTMLHost en ActionScript para personalizar la ventana creada con la función window.open() de JavaScript. Consulte Ampliación de la clase HTMLHost .

El contenido del entorno limitado de seguridad de la aplicación tiene acceso al método más potente para la creación de ventanas: HTMLLoader.createRootWindow() . Con este método, es posible especificar todas las opciones de creación de una ventana nueva. El siguiente código JavaScript, por ejemplo, crea una ventana ligera sin fondo cromático del sistema de 300x400 píxeles de tamaño:

var options = new air.NativeWindowInitOptions(); 
options.systemChrome = "none"; 
options.type = "lightweight"; 
 
var windowBounds = new air.Rectangle(200,250,300,400); 
newHTMLLoader = air.HTMLLoader.createRootWindow(true, options, true, windowBounds); 
newHTMLLoader.load(new air.URLRequest("xmpl.html"));
Nota: si el contenido cargado por una nueva ventana se encuentra fuera del entorno limitado de seguridad de la aplicación, el objeto window no tiene las siguientes propiedades de AIR: runtime , nativeWindow o htmlLoader .

Si crea una ventana transparente, el contenido SWF incorporado en el HTML cargado en la ventana no siempre se visualizará. Debe establecer el parámetro wmode del objeto o etiqueta incorporada para que haga referencia al archivo SWF de opaque o transparent . El valor predeterminado de wmode es window , por lo que el contenido SWF no se visualiza en ventanas transparentes. Un PDF no puede visualizarse en ventanas transparentes, independientemente del valor de wmode . (Antes de AIR 1.5.2, el contenido SWF tampoco se podía visualizar en ventanas transparentes.)

Las ventanas creadas con el método createRootWindow() son independientes de la ventana que se abre. Las propiedades parent y opener del objeto Window de JavaScript son null . La ventana que se abre puede acceder al objeto Window de la nueva ventana utilizando la referencia a HTMLLoader devuelta por la función createRootWindow() . En el contexto del ejemplo anterior, la sentencia newHTMLLoader.window haría referencia al objeto Window de JavaScript de la ventana creada.

Nota: se puede llamar a la función createRootWindow() desde JavaScript y ActionScript.

Creación de una ventana mx:Window

Para crear una ventana mx:Window, puede crear un archivo MXML utilizando mx:Window como etiqueta raíz, o bien llamar directamente al constructor de la clase Window.

El siguiente ejemplo crea y muestra una ventana mx:Window llamando al constructor Window:

var newWindow:Window = new Window(); 
newWindow.systemChrome = NativeWindowSystemChrome.NONE; 
newWindow.transparent = true; 
newWindow.title = "New Window"; 
newWindow.width = 200; 
newWindow.height = 200; 
newWindow.open(true);

Cómo añadir contenido a una ventana

La forma en que se añade contenido a las ventanas de AIR depende del tipo de ventana. Por ejemplo, las ventanas MXML y HTML permiten declarar definiciones del contenido básico de la ventana. Puede incorporar recursos en los archivos SWF de la aplicación o puede cargarlos desde archivos de la aplicación independientes. El contenido de Flex, Flash y HTML se puede crear sobre la marcha y añadirlo dinámicamente a una ventana.

Cuando se carga contenido SWF o HTML que contiene JavaScript, se debe tener en cuenta el modelo de seguridad de AIR. Cualquier contenido del entorno limitado de seguridad de la aplicación, es decir, el contenido instalado y cargado con el esquema de URL app: de la aplicación, tiene privilegios completos para acceder a todas las API de AIR. Cualquier contenido cargado desde fuera de este entorno limitado no podrá acceder a las API de AIR. El contenido de JavaScript situado alojado fuera del entorno limitado de la aplicación no puede utilizar las propiedades runtime , nativeWindow o htmlLoader del objeto Window de JavaScript.

Para que el uso de scripts sea seguro, puede utilizar el puente de entorno limitado para facilitar una interfaz limitada entre el contenido de la aplicación y el que no lo es. En contenido HTML, también puede asignar imágenes de la aplicación al entorno limitado ajeno a a la aplicación para que el código de dicha página pueda utilizar el contenido externo de los scripts. Consulte Seguridad en AIR .

Carga de un archivo SWF o una imagen

Puede cargar archivos SWF de Flash o imágenes en la lista de visualización de una ventana nativa utilizando la clase flash.display.Loader :

package { 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.net.URLRequest; 
    import flash.display.Loader; 
 
    public class LoadedSWF extends Sprite 
    { 
        public function LoadedSWF(){ 
            var loader:Loader = new Loader(); 
            loader.load(new URLRequest("visual.swf"));                    
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadFlash); 
        } 
 
        private function loadFlash(event:Event):void{ 
            addChild(event.target.loader);  
        } 
    } 
}
Nota: los archivos SWF antiguos creados con ActionScript 1 o 2 comparten estados globales, como definiciones de clases, objetos singleton y variables globales si están cargados en la misma ventana. Si este tipo de archivo SWF depende de estados globales sin modificar para que funcione correctamente, no podrá cargarse más de una vez en la misma ventana, ni cargarse otro archivo SWF en la misma ventana con las mismas definiciones de clases y variables. Este contenido se puede cargar en ventanas separadas.

Carga de contenido HTML en una ventana NativeWindow

Para cargar contenido HTML en una ventana NativeWindow, puede añadir un objeto HTMLLoader al escenario de la ventana y cargar el contenido HTML en HTMLLoader, o bien crear una ventana que ya contenga un objeto HTMLLoader utilizando el método HTMLLoader.createRootWindow() . El siguiente ejemplo muestra contenido HTML en un área de visualización de 300 x 500 píxeles en el escenario de una ventana nativa:

//newWindow is a NativeWindow instance 
var htmlView:HTMLLoader = new HTMLLoader(); 
htmlView.width = 300; 
htmlView.height = 500; 
 
//set the stage so display objects are added to the top-left and not scaled 
newWindow.stage.align = "TL"; 
newWindow.stage.scaleMode = "noScale"; 
newWindow.stage.addChild( htmlView ); 
 
//urlString is the URL of the HTML page to load 
htmlView.load( new URLRequest(urlString) );

Para cargar una página HTML en una aplicación de Flex, puede utilizar el componente HTML de Flex.

El contenido SWF de un archivo HTML no se visualiza si la ventana utiliza transparencia (es decir, si la propiedad transparent de la ventana es true ) a no ser que el parámetro wmode del objeto o la etiqueta incorporada para hacer referencia al archivo SWF se establezca en opaque o en transparent . Como el valor predeterminado de wmode es window , el contenido SWF no se visualiza en una ventana transparente. El contenido PDF no se visualiza en una ventana transparente independientemente del valor utilizado para wmode .

Del mismo modo, ni el contenido SWF ni PDF se visualiza cuando se escala o gira el control HTMLLoader, o si la propiedad alpha de HTMLLoader se establece en un valor distinto de 1.0.

Cómo añadir contenido SWF como superposición en una ventana HTML

Dado que las ventanas HTML están contenidas en una instancia de NativeWindow, es posible añadir objetos de visualización de Flash delante y detrás de la capa HTML en la lista de visualización.

Para añadir un objeto de visualización sobre la capa HTML, utilice el método addChild() de la propiedad window.nativeWindow.stage . El método addChild() añade contenido en capas sobre cualquier contenido existente en la ventana.

Para añadir un objeto de visualización debajo de la capa HTML, utilice el método addChildAt() de la propiedad window.nativeWindow.stage , transfiriendo un valor de cero para el parámetro index . Si coloca un objeto en el índice cero, se mueve el contenido existente (incluida la visualización HTML) una capa más arriba y se inserta el nuevo contenido en el capa inferior. Para que el contenido distribuido en capas debajo de la página HTML sea visible, debe establecer la propiedad paintsDefaultBackground del objeto HTMLlLoader como false . Además, todos los elementos de la página que establezcan un color de fondo no serán transparentes. Si, por ejemplo, establece un color de fondo para el elemento "body" de la página, ninguna parte de la página será transparente.

El siguiente ejemplo muestra cómo añadir objetos de visualización de Flash como superposiciones y como capas inferiores en una página HTML. El ejemplo crea dos objetos de formas sencillas, y añade uno debajo de contenido HTML y el otro encima. El ejemplo también actualiza la posición de la forma en función del evento enterFrame .

<html> 
<head> 
<title>Bouncers</title> 
<script src="AIRAliases.js" type="text/javascript"></script> 
<script language="JavaScript" type="text/javascript"> 
air.Shape = window.runtime.flash.display.Shape; 
 
function Bouncer(radius, color){ 
    this.radius = radius; 
    this.color = color; 
 
    //velocity  
    this.vX = -1.3; 
    this.vY = -1; 
 
    //Create a Shape object and draw a circle with its graphics property 
    this.shape = new air.Shape();     
    this.shape.graphics.lineStyle(1,0); 
    this.shape.graphics.beginFill(this.color,.9); 
    this.shape.graphics.drawCircle(0,0,this.radius); 
    this.shape.graphics.endFill(); 
     
    //Set the starting position 
    this.shape.x = 100; 
    this.shape.y = 100; 
 
 
    //Moves the sprite by adding (vX,vY) to the current position 
    this.update = function(){ 
        this.shape.x += this.vX; 
        this.shape.y += this.vY; 
         
        //Keep the sprite within the window 
        if( this.shape.x - this.radius < 0){  
            this.vX = -this.vX; 
        } 
        if( this.shape.y - this.radius < 0){ 
            this.vY = -this.vY; 
        } 
        if( this.shape.x  + this.radius > window.nativeWindow.stage.stageWidth){ 
            this.vX = -this.vX; 
        } 
        if( this.shape.y  + this.radius > window.nativeWindow.stage.stageHeight){ 
            this.vY = -this.vY; 
        } 
         
    }; 
} 
 
function init(){ 
    //turn off the default HTML background 
    window.htmlLoader.paintsDefaultBackground = false; 
    var bottom = new Bouncer(60,0xff2233); 
    var top = new Bouncer(30,0x2441ff); 
 
    //listen for the enterFrame event 
    window.htmlLoader.addEventListener("enterFrame",function(evt){ 
        bottom.update(); 
        top.update(); 
    }); 
     
    //add the bouncing shapes to the window stage 
    window.nativeWindow.stage.addChildAt(bottom.shape,0); 
    window.nativeWindow.stage.addChild(top.shape); 
} 
</script> 
<body onload="init();"> 
<h1>de Finibus Bonorum et Malorum</h1> 
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium 
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis 
et quasi architecto beatae vitae dicta sunt explicabo.</p> 
<p style="background-color:#FFFF00; color:#660000;">This paragraph has a background color.</p> 
<p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis 
praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias 
excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui 
officia deserunt mollitia animi, id est laborum et dolorum fuga.</p> 
</body> 
</html>

Este ejemplo proporciona una introducción rudimentaria a algunas técnicas avanzadas que utilizan tanto JavaScript como ActionScript en AIR. Si no está familiarizado con el uso de objetos de visualización de ActionScript consulte Programación de la visualización en la Guía del desarrollador de ActionScript 3.0 .

Ejemplo: Creación de una ventana nativa

El siguiente ejemplo muestra cómo crear una ventana nativa:

public function createNativeWindow():void { 
    //create the init options 
    var options:NativeWindowInitOptions = new NativeWindowInitOptions(); 
    options.transparent = false; 
    options.systemChrome = NativeWindowSystemChrome.STANDARD; 
    options.type = NativeWindowType.NORMAL; 
     
    //create the window 
    var newWindow:NativeWindow = new NativeWindow(options); 
    newWindow.title = "A title"; 
    newWindow.width = 600; 
    newWindow.height = 400; 
     
    newWindow.stage.align = StageAlign.TOP_LEFT; 
    newWindow.stage.scaleMode = StageScaleMode.NO_SCALE; 
 
    //activate and show the new window 
    newWindow.activate(); 
}