Создание окон

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

AIR автоматически создает первое окно приложения, но можно создать дополнительные окна. Для создания собственного окна используется метод конструктора NativeWindow.

Окно HTML создается либо при помощи метода HTMLLoader createRootWindow() , либо путем вызова метода JavaScript window.open() из документа HTML. Созданное окно является объектом NativeWindow, в списке отображения которого содержится объект HTMLLoader. Объект HTMLLoader интерпретирует и отображает содержимое HTML и JavaScript для окна. Доступ к свойствам базового объекта NativeWindow из JavaScript можно получить с помощью свойства window.nativeWindow . (Это свойство доступно только коду, выполняемому в изолированной программной среде AIR.)

При инициализации окна, включая начальное окно приложения, следует учитывать создание окна в невидимом состоянии, загрузку содержимого или выполнение любых графических обновлений и последующее преобразование окна видимое. Такая последовательность позволяет сделать так, чтобы любые резкие визуальные изменения не были заметны пользователю. Создание начального окна приложения в невидимом состоянии можно указать путем задания тега <visible>false</visible> в дескрипторе приложения (или путем пропуска тега, поскольку значением по умолчанию является false ). Новые объекты NativeWindow являются невидимыми по умолчанию. При создании окна HTML с использованием метода createRootWindow() объекта HTMLLoader можно задать для аргумента visible значение false . Вызовите метод activate() объекта NativeWindow или задайте для свойства visible значение true , чтобы сделать окно видимым.

Задание свойств инициализации окна

Свойства инициализации собственного окна невозможно изменить после создания окна рабочего стола. Ниже приводятся такие неизменяемые свойства и их значения по умолчанию.

Свойство

Значение по умолчанию

systemChrome

standard

type

normal

transparent

false

owner

null

maximizable

true

minimizable

true

resizable

true

Свойства начального окна, создаваемого AIR, задаются в файле дескриптора приложения. Главное окно приложения AIR всегда относится к типу normal . (В файле дескриптора можно задать дополнительные свойства окон, например visible , width и height , которые можно изменить в любое время.)

Свойства других собственных окон и окон HTML, создаваемых приложением, задаются с использованием класса NativeWindowInitOptions. При создании окна необходимо передать объект NativeWindowInitOptions, задающий свойства окна, либо функции конструктора NativeWindow, либо методу HTMLLoader createRootWindow() .

Следующий код создает объект NativeWindowInitOptions для окна типа utility:

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

Свойство systemChrome не может иметь значение standard , если свойство transparent имеет значение true или свойство type имеет значение lightweight .

Примечание. Свойства инициализации окна, созданного при помощи функции JavaScript window.open() , задать невозможно. Однако можно переопределить способ создания этих окон путем реализации собственного класса HTMLHost. Дополнительные сведения см. в разделе « Обработка вызовов сценарием JavaScript метода window.open() ».

При создании окна с использованием класса Flex mx:Window свойства инициализации необходимо задать для самого объекта окна, либо в MXML-объявлении окна, либо в коде для создания окна. Базовый объект NativeWindow не создается, пока не вызван метод open() . После открытия окна эти свойства инициализации нельзя будет изменить.

Создание начального окна приложения

AIR создает начальное окно приложения на основе свойств, заданных в дескрипторе приложения, и загружает файл, на который ссылается элемент содержимого. Элемент содержимого должен представлять собой SWF- или HTML-файл.

Начальное окно может быть главным окном приложения или служить средством запуска других окон. Его вовсе не обязательно делать видимым.

Создание начального окна при помощи ActionScript

При создании приложения AIR с использованием Flex SDK и ActionScript основной класс приложения должен расширять класс Sprite (или подкласс класса Sprite). Этот класс служит основной точкой входа для приложения.

При запуске приложения AIR создает окно, создает экземпляр основного класса и добавляет этот экземпляр в рабочую область окна. Для получения доступа к окну можно прослушивать событие addedToStage , затем при помощи свойства nativeWindow объекта Stage получить ссылку на объект NativeWindow.

Следующий пример иллюстрирует структуру основного класса приложения AIR, построенного при помощи 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 
        } 
    } 
}
Примечание. Технически МОЖНО получить доступ к свойству nativeWindow в функции конструктора основного класса. Однако этот особый случай относится только к начальному окну приложения.

При создании приложения в среде Flash Professional основной класс документа создается автоматически, если не создан собственный класс в отдельном файле ActionScript. Доступ к объекту NativeWindow начального окна можно получить с помощью свойства nativeWindow рабочей области. Например, следующий код позволяет активировать главное окно в развернутом состоянии (из временной шкалы):

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

Создание начального окна при помощи Flex

При создании приложения AIR с использованием платформы Flex используйте mx:WindowedApplication в качестве корневого элемента основного MXML-файла. (Можно использовать компонент mx:Application, но он не поддерживает все доступные в AIR функции.) Компонент WindowedApplication служит начальной точкой входа для приложения.

При запуске приложения AIR создает собственное окно, инициализирует платформу Flex и добавляет объект WindowedApplication в рабочую область окна. По завершении выполнения последовательности запуска WindowedApplication отправляет событие applicationComplete . Доступ к объекту окна рабочего стола осуществляется при помощи свойства nativeWindow экземпляра WindowedApplication.

Следующий пример создает простой компонент WindowedApplication с заданием его координат x и 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>

Создание NativeWindow

Для создания NativeWindow необходимо передать объект NativeWindowInitOptions конструктору NativeWindow:

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

Окно не отображается, пока свойству visible не будет присвоено значение true или пока не будет вызван метод activate() .

После создания окна можно инициализировать его свойства и загрузить содержимое в окно, используя свойство рабочей области и методы списка отображения Flash.

Практически во всех случаях необходимо задать для свойства рабочей области scaleMode нового собственного окна значение noScale (при помощи константы StageScaleMode.NO_SCALE ). Режимы масштабирования Flash предназначены для случаев, когда автор приложения не знает пропорции пространства отображения приложения заранее. Режимы масштабирования позволяют автору выбрать из нескольких зол меньшее: обрезать содержимое, растянуть или сжать его или выровнять при помощи пустого пространства. Так как пространством отображения в AIR (рамкой окна) можно управлять, можно подогнать размер окна под содержимое или содержимое под размер окна без ущерба для того или другого.

Режим масштабирования окон Flex и HTML автоматически принимает значение noScale .

Примечание. Определить максимальные и минимальные размеры окон, допустимые в текущей операционной системе, можно при помощи следующих статических свойств NativeWindow:
var maxOSSize:Point = NativeWindow.systemMaxSize; 
var minOSSize:Point = NativeWindow.systemMinSize; 

Создание окна HTML

Для создания окна HTML можно либо вызвать метод JavaScript Window.open() , либо вызвать метод createRootWindow() класса AIR HTMLLoader.

Содержимое HTML из любой изолированной программной среды безопасности может использовать стандартный метод JavaScript Window.open() . Если содержимое выполняется за пределами изолированной программной среды приложения, метод open() можно вызвать только в ответ на действия пользователя, например щелчок мышью или нажатие клавиши. При вызове метода open() создается окно с системным Chrome для отображения содержимого с заданного URL-адреса. Например:

newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10");
Примечание. Можно расширить класс HTMLHost в ActionScript, чтобы настроить окно, созданное при помощи функции JavaScript window.open() . См. раздел О расширении класса HTMLHost .

Содержимое, входящее в изолированную программную среду безопасности приложения, имеет доступ к более мощному методу создания окон — HTMLLoader.createRootWindow() . Используя этот метод, можно задать все параметры создания нового окна. Например, следующий код JavaScript создает окно типа lightweight без системного Chrome размером 300x400 пикселов:

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"));
Примечание. Если содержимое, загруженное новым окном, не входит в изолированную программную среду безопасности приложения, объект окна не имеет таких свойств AIR, как runtime , nativeWindow или htmlLoader .

Если создать прозрачное окно, то содержимое SWF, внедренное на загружаемую в этом окне страницу HTML, будет отображаться не всегда. Необходимо присвоить параметру wmode объекта или тега внедрения, который ссылается на файл SWF, значение opaque или transparent . Так как для параметра wmode по умолчанию используется значение window , то содержимое SWF не отображается в прозрачных окнах. Содержимое PDF не будет отображаться в прозрачных окнах независимо от значения параметра wmode . (В версиях до AIR 1.5.2 содержимое SWF также не отображалось в прозрачных окнах.)

Окна, созданные при помощи метода createRootWindow() , не зависят от открывающего окна. Свойства parent и opener объекта JavaScript Window имеют значение null . Открывающее окно может получить доступ к объекту Window нового окна при помощи ссылки HTMLLoader, возвращенной функцией createRootWindow() . В контексте предыдущего примера выражение newHTMLLoader.window ссылалось бы на объект JavaScript Window созданного окна.

Примечание. Функцию createRootWindow() можно вызывать из JavaScript и из ActionScript.

Создание mx:Window

Для создания mx:Window можно создать MXML-файл с использованием mx:Window в качестве корневого тега, а также напрямую вызвать конструктор класса Window.

В следующем примере mx:Window создается и отображается путем вызова конструктора 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);

Добавление содержимого в окно

Способ добавления содержимого в окно AIR зависит от типа окна. Например, MXML и HTML позволяют описательно определить основное содержимое окна. Можно встроить ресурсы в SWF-файл приложения или загрузить из отдельных файлов приложения. Содержимое Flex, Flash и HTML может быть тут же создано и добавлено в окно динамически.

При загрузке содержимого SWF или содержимого HTML, содержащего сценарий JavaScript, необходимо принимать во внимание модель безопасности AIR. Любое содержимое, входящее в изолированную программную среду безопасности приложения, т. е. установленное с приложением и загружаемое при помощи схемы URL-адресов app:, имеет полные права доступа ко всем API-интерфейсам AIR. Содержимое, загружаемое не из этой изолированной программной среды, не имеет доступа к API-интерфейсам AIR. Содержимое JavaScript за пределами изолированной программной среды приложения не может использовать свойства runtime , nativeWindow или htmlLoader объекта JavaScript Window.

Для безопасного перекрестного выполнения сценариев можно использовать мост изолированной программной среды, который обеспечивает ограниченный интерфейс между содержимым приложения и другим содержимым. В случае с содержимым HTML можно отобразить страницы приложения в изолированную программную среду, отличную от среды приложения, чтобы разрешить коду этих страниц перекрестное выполнение сценариев во внешнем содержимом. См. раздел Безопасность AIR .

Загрузка SWF-файла или изображения

Можно загружать SWF-файлы Adobe Flash или изображения в список отображения собственного окна при помощи класса 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);  
        } 
    } 
}
Примечание. SWF-файлы, созданные при помощи ActionScript 1 или 2, имеют общие глобальные состояния, например определения классов, одноэлементные множества и глобальные переменные, если загружаются в одно и то же окно. Если для правильной работы такого SWF-файла нельзя изменять глобальные состояния, его нельзя многократно загружать в одно и то же окно или загружать в качестве другого SWF-файла, используя перекрывающиеся определения классов и переменные. Такое содержимое можно загружать в отдельные окна.

Загрузка содержимого HTML в NativeWindow

Для загрузки содержимого HTML в NativeWindow можно либо добавить объект HTMLLoader в рабочую область окна и загрузить содержимое HTML в объект HTMLLoader, либо создать окно, которое уже содержит объект HTMLLoader, при помощи метода HTMLLoader.createRootWindow() . Следующий пример отображает содержимое HTML в области отображения размером 300 на 500 пикселов в рабочей области собственного окна:

//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) );

Для загрузки страницы HTML в приложение Flex можно использовать компонент Flex HTML.

При использовании прозрачного окна содержимое SWF не отображается в HTML-файле (когда свойство transparent окна принимает значение true ), если параметр wmode объекта или тега внедрения, который ссылается на SWF-файл, не принимает значение opaque или transparent . Так как для параметра wmode по умолчанию используется значение window , то содержимое SWF не отображается в прозрачных окнах. Содержимое PDF не будет отображаться в прозрачных окнах независимо от значения параметра wmode .

К тому же, содержимое SWF или PDF никогда не отображается при изменении масштаба или повороте объекта HTMLLoader, или если свойство alpha объекта HTMLLoader принимает значение, отличное от 1,0.

Добавление содержимого SWF в качестве перекрытия окна HTML

Поскольку окна HTML содержатся в экземпляре NativeWindow, экранные объекты Flash можно добавлять поверх слоя HTML в списке отображения и под него.

Для добавления экранного объекта поверх слоя HTML используйте метод addChild() свойства window.nativeWindow.stage . Метод addChild() добавляет содержимое поверх другого существующего в окне содержимого.

Для добавления экранного объекта под слой HTML используйте метод addChildAt() свойства window.nativeWindow.stage , передав нулевое значение параметру index . Присвоение нулевого индекса объекту перемещает существующее содержимое, в том числе страницу HTML, на один слой вверх и добавляет новое содержимое снизу. Чтобы содержимое под страницей HTML было видимым, необходимо присвоить свойству paintsDefaultBackground объекта HTMLlLoader значение false . Кроме того, все элементы страницы, для которых задан фоновый цвет, будут непрозрачными. Если задать фоновый цвет для тела страницы, вся страница будет непрозрачной.

Следующий пример иллюстрирует добавление экранных объектов Flash поверх страницы HTML и под нее. Пример создает две простые фигуры, добавляя одну из них под содержимое HTML, а другую — поверх этого содержимого. Пример также обновляет положение фигуры на основе события 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>

Данный пример дает первичное представление о некоторых усовершенствованных методах, для которых не существует границы между JavaScript и ActionScript в AIR. Если у вас нет опыта работы с экранными объектами ActionScript, см. раздел « Программирование отображаемого содержимого » в руководстве разработчика ActionScript 3.0 .

Пример: создание собственного окна

Следующий пример иллюстрирует создание собственного окна:

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(); 
}