Creazione di finestre

Adobe AIR 1.0 e versioni successive

In AIR la prima finestra di un'applicazione viene creata automaticamente, ma potete create tutte le finestre aggiuntive necessarie. Potete creare una finestra nativa utilizzando il metodo di costruzione della classe NativeWindow.

Potete creare una finestra HTML utilizzando il metodo createRootWindow() di HTMLLoader o chiamando il metodo window.open() di JavaScript da un documento HTML. La finestra creata è un oggetto NativeWindow il cui elenco di visualizzazione contiene un oggetto HTMLLoader. L'oggetto HTMLLoader interpreta e visualizza il contenuto HTML e JavaScript per la finestra. Potete accedere alle proprietà dell'oggetto NativeWindow sottostante da JavaScript utilizzando la proprietà window.nativeWindow . (Questa proprietà è accessibile solo al codice in esecuzione nella sandbox dell'applicazione AIR.)

Quando inizializzate una finestra, compresa la finestra applicazione iniziale, dovete considerare la possibilità di creare la finestra nello stato invisibile, caricando contenuto o eseguendo eventuali aggiornamenti grafici, e quindi rendendola visibile. Questa sequenza impedisce che eventuali modifiche visive in conflitto vengano mostrate agli utenti. Potete specificare che la finestra iniziale dell'applicazione venga creata nello stato invisibile impostando il tag <visible>false</visible> nel descrittore dell'applicazione (o lasciando fuori il tag in quanto false è il valore predefinito). I nuovi oggetti NativeWindow sono invisibili per impostazione predefinita. Quando create una finestra HTML con il metodo createRootWindow() di HTMLLoader, potete impostare l'argomento visible su false . Chiamate il metodo activate() di NativeWindow o impostate la proprietà visible su true per rendere una finestra visibile.

Specifica delle proprietà di inizializzazione della finestra

Le proprietà di inizializzazione di una finestra nativa non possono essere modificate dopo che la finestra desktop è stata creata. Nella tabella seguente sono elencate le proprietà immutabili e i corrispondenti valori predefiniti:

Proprietà

Valore predefinito

systemChrome

standard

type

normal

transparent

false

owner

null

maximizable

true

minimizable

true

resizable

true

Potete impostare le proprietà della finestra iniziale creata da AIR nel file descrittore dell'applicazione. La finestra principale di un'applicazione AIR è sempre del tipo normale (proprietà della finestra aggiuntive possono essere specificate nel file descrittore, ad esempio visible , width e height , e modificate in qualsiasi momento).

Per impostare le proprietà di altre finestre native e HTML create dall'applicazione potete utilizzare la classe NativeWindowInitOptions. Durante la creazione di una finestra, potete passare un oggetto NativeWindowInitOptions che specifica le proprietà della finestra alla funzione di costruzione NativeWindow o al metodo createRootWindow() della classe HTMLLoader.

Il codice riportato di seguito crea un oggetto NativeWindowInitOptions per una finestra di utilità:

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

L'impostazione di systemChrome su standard quando transparent è impostato su true o type è impostato su lightweight non è supportata.

Nota: non potete impostare le proprietà di inizializzazione di una finestra creata con la funzione window.open() di JavaScript. Potete, tuttavia, ignorare la modalità di creazione di queste finestre implementando una classe HTMLHost personalizzata. Per ulteriori informazioni, consultate Gestione delle chiamate JavaScript a window.open() .

Durante la creazione di una finestra con la classe mx:Window di Flex, potete specificare le proprietà di inizializzazione nell'oggetto finestra stesso, all'interno della dichiarazione MXML per la finestra o nel codice di creazione della finestra. L'oggetto NativeWindow sottostante non viene creato fino a quando non chiamate il metodo open() . Dopo che la finestra è stata aperta, queste proprietà di inizializzazione non possono essere modificate.

Creazione della finestra iniziale dell'applicazione

AIR consente di creare la finestra iniziale dell'applicazione in base alle proprietà specificate nel descrittore dell'applicazione e di caricare il file indicato nell'elemento content. L'elemento content deve fare riferimento a un file SWF o HTML.

La finestra iniziale può essere la finestra principale dell'applicazione o servire semplicemente per avviare una o più finestre. Non dovete necessariamente renderla visibile.

Creazione della finestra iniziale con ActionScript

Quando create un'applicazione AIR utilizzando ActionScript, la classe principale dell'applicazione deve estendere la classe Sprite (o una sottoclasse della classe Sprite). Questa classe funge da punto di ingresso principale per l'applicazione.

All'avvio dell'applicazione, AIR crea una finestra, un'istanza della classe principale e aggiunge l'istanza allo stage della finestra. Per accedere alla finestra, potete rimanere in ascolto dell'evento addedToStage e quindi utilizzare la proprietà nativeWindow dell'oggetto Stage per ottenere un riferimento all'oggetto NativeWindow.

L'esempio seguente illustra lo scheletro di base della classe principale di un'applicazione AIR costruita 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: tecnicamente, potete accedere alla proprietà nativeWindow nella funzione di costruzione della classe principale. Tuttavia, si tratta di un caso speciale applicabile solo alla finestra iniziale dell'applicazione.

Quando create un'applicazione in Flash Professional, la classe documento principale viene creata automaticamente se non create la vostra in un file ActionScript separato. Potete accedere all'oggetto NativeWindow per la finestra iniziale utilizzando la proprietà nativeWindow dello stage. Ad esempio, il codice seguente attiva la finestra principale nello stato ingrandito (dalla timeline):

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

Creazione della finestra iniziale con Flex

Durante la creazione di un'applicazione AIR con la struttura Flex, potete utilizzare mx:WindowedApplication come elemento principale del file MXML principale (potete anche utilizzare il componente mx:Application, ma questo non supporta tutte le funzionalità disponibili in AIR). Il componente WindowedApplication serve come punto di ingresso iniziale dell'applicazione.

Quando avviate l'applicazione, AIR consente di creare una finestra nativa, inizializzare il framework Flex e aggiungere l'oggetto WindowedApplication allo stage della finestra. Al termine della sequenza di avvio, l'oggetto WindowedApplication invia un evento applicationComplete . Potete accedere all'oggetto della finestra desktop con la proprietà nativeWindow dell'istanza WindowedApplication.

L'esempio seguente crea un semplice componente WindowedApplication che imposta le sue coordinate 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>

Creazione di una classe NativeWindow

Potete creare una classe NativeWindow passando un oggetto NativeWindowInitOptions al costruttore NativeWindow:

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

Per visualizzare la finestra, impostate la proprietà visible su true o chiamate il metodo activate() .

Dopo che la finestra è stata creata, potete inizializzare le sue proprietà e caricare il contenuto nella finestra utilizzando la proprietà stage e le tecniche dell'elenco di visualizzazione di Flash.

In quasi tutti i casi, occorre impostare la proprietà scaleMode dello stage di una nuova finestra nativa su noScale (utilizzate la costante StageScaleMode.NO_SCALE ). Le modalità scala di Flash sono progettate per situazioni in cui l'autore dell'applicazione non conosce in anticipo le proporzioni dello spazio di visualizzazione dell'applicazione. Le modalità scala consentono all'autore di scegliere il compromesso migliore: ritagliare il contenuto, allungarlo o schiacciarlo, oppure riempirlo con spazio vuoto. Poiché AIR fornisce il controllo dello spazio di visualizzazione (la cornice della finestra), potete adattare le dimensioni della finestra al contenuto, o viceversa, senza compromessi.

La modalità scala per le finestre Flex e HTML è impostata automaticamente su noScale .

Nota: per determinare le dimensioni massime e minime della finestra consentite nel sistema operativo corrente, potete utilizzare le proprietà NativeWindow statiche seguenti:
var maxOSSize:Point = NativeWindow.systemMaxSize; 
var minOSSize:Point = NativeWindow.systemMinSize; 

Creazione di una finestra HTML

Per creare una finestra HTML, potete chiamare il metodo Window.open() di JavaScript o il metodo createRootWindow() della classe HTMLLoader di AIR.

Il contenuto HTML in una sandbox di sicurezza può usare il metodo Window.open() di JavaScript standard. Se il contenuto viene eseguito al di fuori della sandbox dell'applicazione, il metodo open() può essere chiamato solo in risposta all'interazione utente, ad esempio il clic del mouse o la pressione di un tasto. Quando il metodo open() viene chiamato, viene creata una finestra con chrome di sistema per visualizzare il contenuto a livello dell'URL specificato. Ad esempio:

newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10");
Nota: potete estendere la classe HTMLHost in ActionScript per personalizzare la finestra creata con la funzione window.open() di JavaScript. Consultate Informazioni sull'estensione della classe HTMLHost .

Il contenuto della sandbox di sicurezza dell'applicazione ha accesso al più potente metodo di creazione delle finestre, HTMLLoader.createRootWindow() . Grazie a questo metodo, potete specificare tutte le opzioni di creazione per una nuova finestra. Ad esempio, il codice JavaScript riportato di seguito crea una finestra di tipo leggero senza chrome di sistema con una dimensione di 300x400 pixel:

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: se il contenuto caricato da una nuova finestra è esterno alla sandbox di sicurezza dell'applicazione, l'oggetto window non dispone delle proprietà AIR: runtime , nativeWindow o htmlLoader .

Se create una finestra trasparente, il contenuto SWF incorporato nell'HTML caricato nella finestra non viene sempre visualizzato. Dovete impostare il parametro wmode dell'oggetto o tag incorporato utilizzato per fare riferimento al file SWF su opaque o transparent . Il valore predefinito di wmode è window , pertanto, per impostazione predefinita, il contenuto SWF non viene visualizzato in finestre trasparenti. Il contenuto PDF non può essere visualizzato in finestre trasparenti, a prescindere dal valore wmode impostato. (Anche nelle versioni precedenti a AIR 1.5.2, il contenuto SWF non poteva essere visualizzato in finestre trasparenti.)

Le finestre create con il metodo createRootWindow() rimangono indipendenti rispetto alla finestra di apertura. Le proprietà parent e opener dell'oggetto Window JavaScript sono null . La finestra di apertura può accedere all'oggetto Window della nuova finestra utilizzando il riferimento HTMLLoader restituito dalla funzione createRootWindow() . Nel contesto dell'esempio precedente, l'istruzione newHTMLLoader.window fa riferimento all'oggetto Window JavaScript della finestra creata.

Nota: la funzione createRootWindow() può essere chiamata da JavaScript e ActionScript.

Creazione di mx:Window

Per creare un mx:Window, potete creare un file MXML utilizzando mx:Window come tag principale, oppure chiamare direttamente il costruttore della classe Window.

L'esempio seguente crea e visualizza un mx:Window chiamando il costruttore 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);

Aggiunta di contenuto a una finestra

La modalità utilizzata per aggiungere contenuto a una finestra AIR dipende dal tipo di finestra. Ad esempio, MXML e HTML consentono di definire il contenuto di base della finestra tramite dichiarazioni. Potete incorporare risorse nei file SWF dell'applicazione oppure caricarle da file dell'applicazione separati. Tutto il contenuto Flex, Flash e HTML può essere creato al volo e aggiunto dinamicamente a una finestra.

Durante il caricamento di contenuto SWF, o contenuto HTML contenente JavaScript, occorre considerare il modello di sicurezza AIR. Tutto il contenuto nella sandbox di sicurezza dell'applicazione, ovvero, contenuto installato con l'applicazione e caricabile con lo schema URL app:, dispone di privilegi per accedere a tutte le API di AIR. L'eventuale contenuto caricato dall'esterno della sandbox non può accedere alle API di AIR. Il contenuto JavaScript esterno alla sandbox dell'applicazione non è in grado di utilizzare le proprietà runtime , nativeWindow o htmlLoader dell'oggetto Window di JavaScript.

Per consentire il cross-scripting protetto, potete usare un bridge sandbox per fornire un'interfaccia limitata tra il contenuto dell'applicazione e quello esterno all'applicazione. Nel contenuto HTML, potete anche mappare pagine dell'applicazione in una sandbox non dell'applicazione per consentire al codice della pagina di eseguire il cross-script di contenuto esterno. Consultate Sicurezza in AIR .

Caricamento di un file SWF o di un'immagine

Per caricare file SWF di Flash o immagini nell'elenco di visualizzazione di una finestra nativa, potete utilizzare la classe 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: file SWF precedenti creati utilizzando ActionScript 1 o 2 condividono stati globali quali definizioni di classe, singleton e variabili globali se sono caricati nella stessa finestra. Un file SWF che si basa su stati globali inalterati per funzionare correttamente non può essere caricato più volte nella stessa finestra, o caricato nella stessa finestra come un altro file SWF utilizzando definizioni di classi e variabili sovrapposte. Questo contenuto può essere, tuttavia, caricato in finestre separate.

Caricamento di contenuto HTML in una classe NativeWindow

Per caricare contenuto HTML in una classe NativeWindow, potete aggiungere un oggetto HTMLLoader allo stage della finestra e caricare il contenuto HTML nella classe HTMLLoader, oppure creare una finestra che contiene già un oggetto HTMLLoader utilizzando il metodo HTMLLoader.createRootWindow() . L'esempio seguente visualizza il contenuto HTML all'interno di un'area di visualizzazione di 300 x 500 pixel sullo stage di una finestra 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) );

Per caricare una pagina HTML in un'applicazione Flex, potete utilizzare il componente HTML Flex.

Il contenuto SWF in un file HTML non viene visualizzato se la finestra utilizza la trasparenza (ovvero se la proprietà transparent della finestra è true ) a meno che il parametro wmode dell'oggetto o tag incorporato utilizzato per fare riferimento al file SWF sia impostato su opaque o transparent . Poiché il valore wmode predefinito è window , il contenuto SWF non viene visualizzato in una finestra trasparente. Il contenuto PDF non viene visualizzato in una finestra trasparente, a prescindere dal valore wmode utilizzato.

Inoltre, né il contenuto SWF né quello PDF vengono visualizzati se il controllo HTMLLoader è ridimensionato, ruotato o se la proprietà alpha di HTMLLoader è impostata su un valore diverso da 1.0.

Aggiunta di contenuto SWF come sovrapposizione in una finestra HTML

Poiché le finestre HTML sono contenute all'interno di un'istanza NativeWindow, potete aggiungere oggetti di visualizzazione Flash sopra e sotto il livello HTML nell'elenco di visualizzazione.

Per aggiungere un oggetto di visualizzazione sopra il livello HTML, potete utilizzare il metodo addChild() della proprietà window.nativeWindow.stage . Il metodo addChild() consente di aggiungere contenuto su più livelli sopra qualsiasi contenuto esistente nella finestra.

Per aggiungere un oggetto di visualizzazione sotto il livello HTML, potete utilizzare il metodo addChildAt() della proprietà window.nativeWindow.stage , passando un valore zero per il parametro index . Il posizionamento di un oggetto in corrispondenza dell'indice zero consente di spostare il contenuto esistente, compresa la visualizzazione HTML, di un livello verso l'alto e di inserire il nuovo contenuto nella parte inferiore. Per rendere visibile il contenuto disposto su più livelli sotto la pagina HTML, potete impostare la proprietà paintsDefaultBackground dell'oggetto HTMLlLoader su false . Inoltre, tutti gli elementi della pagina che impostano un colore di sfondo non sono trasparenti. Se, ad esempio, impostate un colore di sfondo per il corpo della pagina, nessuna delle pagine sarà trasparente.

L'esempio seguente illustra come aggiungere oggetti di visualizzazione Flash come overlay e underlay a una pagina HTML. L'esempio crea due semplici oggetti shape, aggiungendone uno sotto il contenuto HTML e uno sopra. L'esempio inoltre aggiorna la posizione degli oggetti in base all'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>

Questo esempio fornisce un'introduzione elementare ad alcune tecniche avanzate che attraversano i confini tra JavaScript e ActionScript in AIR. Se non avete esperienza di utilizzo degli oggetti di visualizzazione ActionScript, fate riferimento a Programmazione degli elementi visivi nella Guida per gli sviluppatori di ActionScript 3.0 .

Esempio: creazione di una finestra nativa

L'esempio seguente illustra come creare una finestra 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(); 
}