Criação de janelas

Adobe AIR 1.0 e posterior

O AIR cria automaticamente a primeira janela de um aplicativo, mas você pode criar qualquer outra janela de que precise. Para criar uma janela nativa, use o método de construtor NativeWindow.

Para criar uma janela HTML, use o método createRootWindow() de HTMLLoader ou, em um documento HTML, chame o método JavaScript window.open() . A janela criada é um objeto NativeWindow cuja lista de exibição contém um objeto HTMLLoader. O objeto HTMLLoader interpreta e exibe o conteúdo HTML e JavaScript para a janela. É possível acessar as propriedades o objeto subjacente NativeWindow a partir do JavaScript usando a propriedade window.nativeWindow . (Essa propriedade só está acessível ao código em execução na caixa de proteção do aplicativo do AIR.)

Quando uma janela é inicializada—incluindo a janela inicial do aplicativo—você deve considerar criar a janela no estado invisível, carregando o conteúdo ou executando atualizações gráficas e, em seguida, tornando a janela visível. Esta sequência impede a visualização de alterações visuais conflitantes pelos usuários. É possível especificar que a janela inicial do aplicativo deve ser criada no estado invisível, indicando a tag <visible>false</visible> no descritor do aplicativo (ou não indicando a tag, já que false é o valor padrão). Novas NativeWindows são invisíveis por padrão. Ao criar uma janela HTML com o método HTMLLoader createRootWindow() , você pode definir o argumento visible para false . Chame o método NativeWindow activate() ou defina a propriedade visible para true para tornar a janela visível.

Especificação das propriedades de inicialização de uma janela

As propriedades de inicialização de uma janela nativa não podem ser alteradas após a criação da janela da área de trabalho. Entre as propriedades imutáveis e seus valores padrão estão os seguintes:

Propriedade

Valor padrão

systemChrome

standard

tipo

normal

transparent

false

owner

null

maximizable

true

minimizable

true

resizable

true

Defina as propriedades da janela inicial criada pelo AIR no arquivo de descrição do aplicativo. A janela principal de um aplicativo do AIR sempre é do tipo normal . (É possível especificar outras propriedades de janela no arquivo de descrição, tais como visible , width e height , mas elas podem ser alteradas a qualquer momento.)

Defina as propriedades de outras janelas nativas e HTML criadas pelo seu aplicativo usando a classe NativeWindowInitOptions. Quando você cria uma janela, deve passar um objeto NativeWindowInitOptions que especifique as propriedades da janela para a função de construtor NativeWindow ou o método createRootWindow() de HTMLLoader.

O seguinte código cria um objeto NativeWindowInitOptions para uma janela de utilitário:

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

Não é permitido definir systemChrome como standard quando transparent é true ou quando type é lightweight .

Nota: Não é possível definir as propriedades de inicialização de uma janela criada com a função JavaScript window.open() . No entanto, você pode ignorar como elas são criadas implementando sua própria classe HTMLHost. Para obter mais informações, consulte Tratamento de chamadas JavaScript de window.open() .

Quando criar uma janela com a classe mx:Window do Flex, especifique as propriedades de inicialização no próprio objeto Window, seja na declaração MXML correspondente ou no código que cria a janela. O objeto NativeWindow subjacente só é criado quando você chama o método open() . Uma vez aberta uma janela, não é possível alterar essas propriedades de inicialização.

Criação da janela inicial do aplicativo

O AIR cria a janela inicial do aplicativo com base nas propriedades especificadas no descritor do aplicativo e carrega o arquivo mencionado no elemento de conteúdo. O elemento de conteúdo deve referenciar um arquivo SWF ou um arquivo HTML.

A janela inicial pode ser a janela principal do seu aplicativo ou pode simplesmente servir para iniciar uma ou mais janelas. Não é necessário torná-la visível.

Criação da janela inicial com o ActionScript

Quando você cria um aplicativo do AIR usando o ActionScript, a classe principal do aplicativo deve estender a classe Sprite (ou uma subclasse dela). Esta classe funciona como o principal ponto de entrada do aplicativo.

Quando o seu aplicativo é iniciado, o AIR cria uma janela e uma ocorrência da classe principal e adiciona a ocorrência ao palco da janela. Para acessar a janela, você pode monitorar o evento addedToStage e utilizar a propriedade nativeWindow do objeto Stage para obter uma referência ao objeto NativeWindow.

Este exemplo ilustra a estrutura básica da classe principal de um aplicativo do AIR criado com o 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, você PODE acessar a propriedade nativeWindow na função constructor da classe principal. No entanto, este é um caso especial que se aplica apenas à janela do aplicativo inicial.

Ao criar um aplicativo no Flash Professional, a classe de documento principal é criada automaticamente se você não criar a sua própria em um arquivo separado do ActionScript. Você pode acessar o objeto NativeWindow para a janela inicial usando a propriedade nativeWindow . Por exemplo, o código a seguir ativa a janela principal no estado maximizado (a partir da linha de tempo):

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

Criação da janela inicial com o Flex

Ao criar um aplicativo do AIR com a estrutura do Flex, use mx:WindowedApplication como o elemento raiz do seu principal arquivo MXML. (Você pode usar o componente mx:Application, mas ele não dá suporte a todos os recursos disponíveis no AIR.) O componente WindowedApplication funciona como o ponto de entrada inicial do aplicativo.

Quando você inicia o aplicativo, o AIR cria uma janela nativa, inicializa a estrutura do Flex e adiciona o objeto WindowedApplication ao palco da janela. Ao término da sequência de inicialização, o objeto WindowedApplication despacha um evento applicationComplete . Acesse o objeto da janela de área de trabalho com a propriedade nativeWindow da ocorrência de WindowedApplication.

O exemplo abaixo cria um componente WindowedApplication simples que define suas 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>

Criação de um objeto NativeWindow

Para criar um NativeWindow, passe um objeto NativeWindowInitOptions para o construtor NativeWindow:

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

A janela não é exibida até você definir a propriedade visible como true ou chamar o método activate() .

Uma vez criada a janela, você pode inicializar suas propriedades e carregar conteúdo nela usando as técnicas de propriedade de palco e lista de exibição do Flash.

Em quase todos os casos, você deve definir a propriedade de palco scaleMode de uma nova janela nativa como noScale (use a constante StageScaleMode.NO_SCALE ). Os modos de dimensionamento do Flash foram desenvolvidos para situações em que o autor do aplicativo não sabe de antemão a proporção do espaço de exibição do aplicativo. Os modos de dimensionamento permitem que o autor escolha o melhor ajuste: recorte o conteúdo, aumente ou compacte o conteúdo ou preencha-o com espaço vazio. Desde que você controle o espaço de exibição no AIR (o quadro da janela), pode dimensionar a janela conforme o conteúdo ou vice-versa, sem comprometer o resultado final.

O modo de dimensionamento de janelas Flex e HTML é definido como noScale automaticamente.

Nota: Para determinar os tamanhos máximo e mínimo de uma janela permitidos no sistema operacional atual, use as seguintes propriedades estáticas da classe NativeWindow:
var maxOSSize:Point = NativeWindow.systemMaxSize; 
var minOSSize:Point = NativeWindow.systemMinSize; 

Criação de uma janela HTML

Para criar uma janela HTML, você pode chamar o método JavaScript Window.open() ou o método createRootWindow() da classe HTMLLoader do AIR.

O conteúdo HTML em qualquer caixa de proteção de segurança pode usar o método JavaScript Window.open() padrão. Se o conteúdo estiver sendo executado fora da caixa de proteção do aplicativo, o método open() só poderá ser chamado em resposta a interações do usuário, como cliques do mouse ou pressionamentos de tecla. Quando open() é chamado, é criada uma janela com o cromo do sistema para exibir o conteúdo na URL especificada. Por exemplo:

newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10");
Nota: Você pode estender a classe HTMLHost no ActionScript para personalizar a janela criada com a função JavaScript window.open() . Consulte Sobre estender a classe HTMLHost .

O conteúdo na caixa de proteção de segurança do aplicativo tem acesso ao método de criação de janelas mais eficiente, HTMLLoader.createRootWindow() . Com ele, você pode especificar todas as opções de criação de uma nova janela. Por exemplo, o seguinte código JavaScript cria uma janela do tipo leve sem cromo do sistema e com tamanho de 300x400 pixels:

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 o conteúdo carregado por uma nova janela estiver fora da caixa de proteção de segurança do aplicativo, o objeto Window não terá as propriedades do AIR: runtime , nativeWindow ou htmlLoader .

Ao criar uma janela transparente, o conteúdo SWF integrado no HTML carregado nessa janela nem sempre é exibido. Você deve definir o parâmetro wmode do objeto ou a tag integrada utilizada para fazer referência ao arquivo SWF para opaque ou transparent . O valor padrão de wmode é window e, por padrão, o conteúdo SWF não é exibido em janelas transparentes. O conteúdo PDF não pode ser exibido em janelas transparentes, não importando com o valor wmode está definido. (Antes da versão AIR 1.5.2, o conteúdo SWF também não podia ser exibido em janelas transparentes.)

As janelas criadas com o método createRootWindow() permanecem independentes da janela de abertura. As propriedades parent e opener do objeto JavaScript Window são null . A janela de abertura pode acessar o objeto Window da nova janela usando a referência a HTMLLoader retornada pela função createRootWindow() . No contexto do exemplo anterior, a instrução newHTMLLoader.window faria referência ao objeto JavaScript Window da janela criada.

Nota: A função createRootWindow() pode ser chamada no JavaScript e no ActionScript.

Criação de uma classe mx:Window

Para criar uma classe mx:Window, crie um arquivo MXML usando mx:Window como a tag raiz ou chame o construtor de classe Window diretamente.

O exemplo abaixo cria e mostra uma mx:Window chamando o construtor 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);

Adição de conteúdo a uma janela

O tipo de uma janela do AIR determina a maneira como você adiciona conteúdo a ela. Por exemplo, as linguagens MXML e HTML permitem definir o conteúdo básico da janela declarativamente. É possível incorporar recursos nos arquivos SWF do aplicativo ou carregá-los a partir de arquivos de aplicativo separados. O conteúdo Flex, Flash e HTML pode ser criado dinamicamente e adicionado a uma janela de forma dinâmica.

Quando você carrega conteúdo SWF, ou HTML com JavaScript, deve levar em consideração o modelo de segurança do AIR. Qualquer conteúdo existente na caixa de proteção de segurança do aplicativo, ou seja, conteúdo instalado com seu aplicativo e carregável com o esquema de URL app:, tem privilégios totais para acessar todas as APIs do AIR. Qualquer conteúdo carregado de fora dessa caixa de proteção não pode acessar as APIs do AIR. O conteúdo JavaScript fora da caixa de proteção do aplicativo não pode usar as propriedades runtime , nativeWindow ou htmlLoader do objeto JavaScript Window.

Para permitir código entre scripts seguro, você pode usar uma ponte de caixa de proteção para disponibilizar uma interface limitada entre conteúdo de aplicativo e conteúdo que não é de aplicativo. No conteúdo HTML, também é possível mapear páginas do seu aplicativo para uma caixa de proteção que não seja de aplicativo, de maneira que essa página possa cruzar scripts de conteúdo externo. Consulte Segurança do AIR .

Carregamento de arquivo ou imagem SWF

Você pode carregar arquivos ou imagens SWF do Flash na lista de exibição de uma janela nativa usando a 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: Arquivos SWF mais antigos criados com o ActionScript 1 ou 2 compartilham estados globais, como definições de classe, singletons e variáveis globais, se carregados na mesma janela. Se tal arquivo SWF depender de estados globais intocados para funcionar corretamente, não será possível carregá-lo mais de uma vez na mesma janela nem carregá-lo na mesma janela como outro arquivo SWF usando variáveis e definições de classe de sobreposição. Este conteúdo pode ser carregado em janelas separadas.

Carregamento de conteúdo HTML em um objeto NativeWindow

Para carregar conteúdo HTML em um NativeWindow, você pode adicionar um objeto HTMLLoader ao palco da janela e carregar o conteúdo HTML no HTMLLoader ou criar uma janela que já contenha um objeto HTMLLoader usando o método HTMLLoader.createRootWindow() . O seguinte exemplo mostra conteúdo HTML em uma área de exibição de 300 por 500 pixels no palco de uma janela 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 carregar uma página HTML em um aplicativo do Flex, use o componente HTML do Flex.

O conteúdo SWF em um arquivo HTML não é exibido se a janela utilizar transparência (propriedade transparent da janela é true ) a não ser que o parâmetro wmode do objeto ou da tag integrada utilizada para referência ao arquivo SWF esteja definido em opaque ou transparent . Como o valor padrão de wmode é window , o conteúdo SWF não é exibido em uma janela transparente. O conteúdo do PDF não é exibido em uma janela transparente, não importando como o valor wmode é utilizado.

Além disso, o conteúdo SWF ou PDF não é exibido se o controle HTMLLoader estiver dimensionado ou se a propriedade HTMLLoader alpha estiver definida em um valor diferente de 1.0.

Adicionar conteúdo SWF como sobreposição em uma janela HTML

Como as janelas HTML são contidas em uma ocorrência de NativeWindow, é possível adicionar objetos de exibição do Flash tanto acima quanto abaixo da camada HTML na lista de exibição.

Para adicionar um objeto de exibição acima da camada HTML, use o método addChild() da propriedade window.nativeWindow.stage . O método addChild() adiciona conteúdo em camada acima de qualquer conteúdo existente na janela.

Para adicionar um objeto de exibição abaixo da camada HTML, use o método addChildAt() da propriedade window.nativeWindow.stage , passando um valor de zero para o parâmetro index . Colocar um objeto no índice zero movimenta o conteúdo existente, inclusive a exibição HTML, uma camada acima e insere o novo conteúdo na parte inferior. Para que o conteúdo disposto abaixo da página HTML fique visível, defina a propriedade paintsDefaultBackground do objeto HTMLlLoader como false . Além disso, quaisquer elementos da página que têm uma cor de plano de fundo definida não ficarão transparentes. Por exemplo, se você definir uma cor de plano de fundo para o elemento body da página, nenhuma parte dela ficará transparente.

O exemplo a seguir ilustra como adicionar objetos de exibição do Flash na forma de sobreposições e bases a uma página HTML. O exemplo cria dois objetos de forma simples, adiciona um abaixo do conteúdo HTML e um acima. O exemplo também atualiza a posição da forma com base no 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 exemplo faz uma introdução rudimentar a algumas técnicas avançadas que cruzam os limites entre o JavaScript e o ActionScript no AIR. Se você não estiver familiarizado em utilizar objetos de exibição ActionScript, consulte Programação de exibição no Guia do desenvolvedor ActionScript 3.0 .

Exemplo: Criação de uma janela nativa

O exemplo abaixo mostra como criar uma janela 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(); 
}