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