ウィンドウの作成

Adobe AIR 1.0 およびそれ以降

アプリケーションの最初のウィンドウは AIR によって自動的に作成されますが、必要に応じて任意の追加ウィンドウを作成できます。ネイティブウィンドウを作成するには、NativeWindow コンストラクターメソッドを使用します。

HTML ウィンドウを作成するには、HTMLLoader の createRootWindow() メソッドを使用するか、または HTML ドキュメントから JavaScript の window.open() メソッドを呼び出します。作成されたウィンドウは、表示リストに HTMLLoader オブジェクトを含む NativeWindow オブジェクトとなります。HTMLLoader オブジェクトは、ウィンドウの HTML および JavaScript コンテンツを解釈して表示します。 window.nativeWindow プロパティを使用して、基になる NativeWindow オブジェクトのプロパティに JavaScript からアクセスできます(このプロパティには、AIR アプリケーションサンドボックスで実行されているコードでのみアクセスできます)。

ウィンドウを初期化するときは(最初のアプリケーションウィンドウを含む)、ウィンドウを非表示の状態で作成し、コンテンツのロードまたはグラフィックの更新を実行した後で、ウィンドウを表示することを検討する必要があります。このシーケンスにより、目障りな視覚的変化がユーザーに表示されないようにすることができます。アプリケーションの初期ウィンドウが非表示の状態で作成されるようにするには、アプリケーション記述ファイルで <visible>false</visible> タグを指定します(この値はデフォルトで false になっているので、省略しても構いません)。新しい NativeWindows はデフォルトで非表示になります。HTMLLoader の createRootWindow() メソッドを使用して HTML ウィンドウを作成する場合は、 visible 引数を false に設定します。ウィンドウを表示するには、NativeWindow の activate() メソッドを呼び出すか、 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() メソッドに渡す必要があります。

次のコードでは、UTILITY ウィンドウの NativeWindowInitOptions オブジェクトを作成します。

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

transparent true のとき、または type lightweight のときに、 systemChrome standard に設定することはできません。

注意: JavaScript の window.open() 関数で作成するウィンドウの初期化プロパティは設定できません。ただし、独自の HTMLHost クラスを実装することで、これらのウィンドウの作成方法をオーバーライドすることはできます。詳しくは、 window.open() の JavaScript 呼び出しの処理 を参照してください。

Flex mx:Window クラスでウィンドウを作成するときは、ウィンドウオブジェクト自体で初期化プロパティを指定します。指定は、ウィンドウの MXML 宣言またはウィンドウを作成するコードの中で行います。基になる NativeWindow オブジェクトは、 open() メソッドを呼び出すまで作成されません。ウィンドウが開かれた後に、これらの初期化プロパティを変更することはできません。

初期アプリケーションウィンドウの作成

AIR は、アプリケーション記述子で指定されているプロパティに基づいて初期アプリケーションウィンドウを作成し、content エレメントで参照されているファイルを読み込みます。content エレメントは、SWF ファイルまたは HTML ファイルを参照する必要があります。

初期ウィンドウは、アプリケーションのメインウィンドウであっても、1 つ以上の他のウィンドウを起動するためだけのものであってもかまいません。表示する必要もありません。

ActionScript での初期ウィンドウの作成

ActionScript を使用して AIR アプリケーションを作成する場合、アプリケーションのメインクラスは Sprite クラス(または Sprite のサブクラス)を拡張する必要があります。このクラスは、アプリケーションのメインのエントリポイントとしての役割を果たします。

アプリケーションを起動すると、AIR はウィンドウを作成し、メインクラスのインスタンスを作成して、ウィンドウステージにインスタンスを追加します。ウィンドウにアクセスするには、 addedToStage イベントをリッスンした後、Stage オブジェクトの nativeWindow プロパティを使用して、NativeWindow オブジェクトへの参照を取得します。

次の例では、ActionScript で作成された AIR アプリケーションのメインクラスの基本的な構造を示します。

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 での初期ウィンドウの作成

Flex フレームワークで AIR アプリケーションを作成するときは、メイン MXML ファイルのルートエレメントとして mx:WindowedApplication を使用します(mx:Application コンポーネントも使用できますが、このコンポーネントは AIR で使用できる機能のすべてをサポートしているわけではありません)。WindowedApplication コンポーネントは、アプリケーションに対する初期エントリポイントとして機能します。

アプリケーションを起動すると、AIR はネイティブウィンドウを作成し、Flex フレームワークを初期化して、WindowedApplication オブジェクトをウィンドウステージに追加します。起動シーケンスが終了すると、WindowedApplication は applicationComplete イベントを送出します。デスクトップウィンドウオブジェクトには、WindowedApplication インスタンスの nativeWindow プロパティを使用してアクセスします。

次の例では、x 座標と y 座標を設定する簡単な WindowedApplication コンポーネントを作成します。

<?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() メソッドを呼び出すか、または AIR で HTMLLoader クラスの createRootWindow() メソッドを呼び出します。

セキュリティサンドボックス内の HTML コンテンツは、JavaScript の標準の Window.open() メソッドを使用できます。コンテンツがアプリケーションサンドボックスの外部で実行している場合は、マウスクリックやキー押下などのユーザー操作に対して呼び出すことができるのは、 open() メソッドだけです。 open() を呼び出すと、指定した URL にあるコンテンツを表示するために、システムクロムを使用するウィンドウが作成されます。次に、例を示します。

newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10");
注意: ActionScript で HTMLHost クラスを拡張し、JavaScript の window.open() 関数で作成されるウィンドウをカスタマイズできます。 HTMLHost クラスの拡張について を参照してください。

アプリケーションセキュリティサンドボックス内のコンテンツは、ウィンドウ作成用のさらに強力なメソッドである HTMLLoader.createRootWindow() にアクセスできます。このメソッドを使用すると、新規ウィンドウ用のすべての作成オプションを指定できます。例えば、次の JavaScript コードでは、システムクロムを使用しない最小タイプウィンドウを、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 はありません。

透明ウィンドウを作成する場合は、そのウィンドウに読み込まれた HTML に埋め込まれている SWF コンテンツは、常に表示されるとは限りません。SWF ファイルを参照するために使用されるオブジェクトまたは埋め込みタグの wmode パラメーターを、 opaque または transparent のどちらかに設定する必要があります。 wmode のデフォルト値は window なので、デフォルトでは、SWF コンテンツは透明ウィンドウに表示されません。どの wmode 値が設定されていようと、PDF コンテンツを透明ウィンドウに表示することはできません(AIR 1.5.2 より前のバージョンでは、SWF コンテンツも透明ウィンドウに表示することはできませんでした)。

createRootWindow() メソッドで作成したウィンドウは、それを開いたウィンドウから独立したままになります。JavaScript Window オブジェクトの parent プロパティと opener プロパティは、 null です。新しいウィンドウを開いたウィンドウは、 createRootWindow() 関数から返る HTMLLoader の参照を使用して、新しいウィンドウの Window オブジェクトにアクセスできます。前記の例のコンテキストでは、ステートメント newHTMLLoader.window は作成されたウィンドウの JavaScript Window オブジェクトを参照します。

注意: createRootWindow() 関数は、JavaScript と ActionScript のどちらからでも呼び出すことができます。

mx:Window の作成

mx:Window を作成するには、mx:Window をルートタグとして使用する MXML ファイルを作成するか、または Window クラスのコンストラクターを直接呼び出します。

次の例では、Window コンストラクターを呼び出して、mx: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 コンテンツ、または JavaScript を含む HTML コンテンツを読み込むときは、AIR のセキュリティモデルを考慮する必要があります。アプリケーションセキュリティサンドボックス内のコンテンツ、つまりアプリケーションでインストールされて、app: URL スキームで読み込み可能なコンテンツは、すべての AIR API にアクセスできる完全な権限を持っています。このサンドボックスの外部から読み込まれるコンテンツは、AIR API にアクセスできません。アプリケーションサンドボックスの外部にある JavaScript コンテンツは、JavaScript Window オブジェクトの runtime nativeWindow 、または htmlLoader プロパティを使用できません。

安全なクロススクリプトを可能にするには、サンドボックスブリッジを使用して、アプリケーションコンテンツと非アプリケーションコンテンツの間に制限されたインターフェイスを提供できます。HTML コンテンツでは、アプリケーションのページを非アプリケーションサンドボックスにマップし、そのページのコードが外部コンテンツをクロススクリプトできるようにすることもできます。 AIR のセキュリティ を参照してください。

SWF ファイルまたはイメージの読み込み

Flash SWF ファイルまたはイメージをネイティブウィンドウの表示リストに読み込むには、 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);  
        } 
    } 
}
注意: ActionScript 1 または 2 を使用して作成された古い SWF ファイルは、同じウィンドウに読み込まれた場合、クラス定義、シングルトン、グローバル変数などのグローバルな状態を共有します。このような SWF ファイルの正常な動作が、変更されていないグローバル状態に依存する場合は、ファイルを同じウィンドウに 2 回以上読み込むこと、またはオーバーラップするクラス定義と変数を使用して別の SWF ファイルとして同じウィンドウに読み込むことはできません。このようなコンテンツを別のウィンドウに読み込むことはできます。

NativeWindow への HTML コンテンツの読み込み

HTML コンテンツを NativeWindow に読み込むには、HTMLLoader オブジェクトをウィンドウステージに追加してから HTML コンテンツを HTMLLoader に読み込むか、または HTMLLoader.createRootWindow() メソッドを使用して HTMLLoader オブジェクトを既に含んでいるウィンドウを作成します。次の例では、ネイティブウィンドウのステージ上の 300 × 500 ピクセルの表示領域に、HTML コンテンツを表示します。

//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 コンポーネントを使用します。

ウィンドウで透明度が使用されている場合(ウィンドウの transparent プロパティが true の場合)は、SWF ファイルを参照するために使用されるオブジェクトまたは埋め込みタグの wmode パラメーターが opaque または transparent のどちらかに設定されていない限り、HTML ファイル内の SWF コンテンツは表示されません。 wmode 値のデフォルトは window なので、デフォルトでは、SWF コンテンツは透明ウィンドウには表示されません。どの wmode 値が使用されていようと、PDF コンテンツは透明ウィンドウには表示されません。

また、HTMLLoader コントロールが拡大/縮小または回転されている場合、または HTMLLoader の alpha プロパティが 1.0 以外の値に設定されている場合、SWF コンテンツと PDF コンテンツのどちらも表示されません。

HTML ウィンドウ上のオーバーレイとしての SWF コンテンツの追加

HTML ウィンドウは NativeWindow インスタンス内に含まれるので、表示リストでは HTML レイヤーの上または下のどちらにでも、Flash 表示オブジェクトを追加できます。

HTML レイヤーの上位に表示オブジェクトを追加するには、 window.nativeWindow.stage プロパティの addChild() メソッドを使用します。 addChild() メソッドは、ウィンドウ内の既存のすべてのコンテンツより上のレイヤーに、コンテンツを追加します。

HTML レイヤーより下位に表示オブジェクトを追加するには、 window.nativeWindow.stage プロパティの addChildAt() メソッドを使用し、 index パラメーターに値 0 を渡します。0 インデックスにオブジェクトを配置すると、HTML の表示を含む既存のコンテンツが 1 レイヤーだけ上に移動し、新しいコンテンツが最下位に挿入されます。HTML ページより下位のレイヤーにあるコンテンツを表示するには、 HTMLlLoader オブジェクトの paintsDefaultBackground プロパティを false に設定する必要があります。また、ページのエレメントで背景色が設定されているものはすべて、透明になりません。例えば、ページの body エレメントに背景色を設定すると、ページのすべてのものが透明ではなくなります。

次の例では、Flash 表示オブジェクトをオーバーレイおよびアンダーレイとして HTML ページに追加する方法を示します。この例では、単純な形のオブジェクトを 2 つ作成し、1 つは HTML コンテンツより下位に、もう 1 つは上位に追加します。また、 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>

この例では、AIR において JavaScript と ActionScript の間にある境界を越える、若干高度な技法の初歩的な概要について説明しています。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(); 
}