表示コンテンツの動的ロード

Flash Player 9 以降、Adobe AIR 1.0 以降

次の外部表示アセットを ActionScript 3.0 アプリケーションにロードできます。

  • ActionScript 3.0 でオーサリングされた SWF ファイル — Sprite、MovieClip、または Sprite を拡張する任意のクラスです。iOS 上の AIR アプリケーションでは、ActionScript バイトコードを含まない SWF ファイルのみをロードできます。つまり、イメージやサウンドなどの埋め込みデータを含む SWF ファイルをロードできますが、実行可能コードを含む SWF ファイルはロードできません。

  • イメージファイル — JPG、PNG、および GIF ファイルが含まれます。

  • AVM1 SWF ファイル — ActionScript 1.0 または 2.0 で記述された SWF ファイルです(モバイル AIR アプリケーションではサポートされていません)。

これらのアセットをロードするには、Loader クラスを使用します。

表示オブジェクトのロード

Loader オブジェクトは、SWF ファイルおよびグラフィックファイルをアプリケーションにロードするために使用されます。 Loader クラスは、DisplayObjectContainer クラスのサブクラスです。 Loader オブジェクトは、その表示リストに子表示オブジェクト(ロードされる SWF またはグラフィックファイルを表す表示オブジェクト)を 1 つしか含むことができません。表示リストに Loader オブジェクトを追加するときは、次のコードのように、子表示オブジェクトのロードが完了したら、ロードされた子表示オブジェクトも表示リストに追加します。

var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
this.addChild(pictLdr);

SWF ファイルまたはイメージがロードされたら、ロードされた表示オブジェクトを、次の例に示す container DisplayObjectContainer オブジェクトのような別の表示オブジェクトコンテナに移動できます。

import flash.display.*; 
import flash.net.URLRequest; 
import flash.events.Event; 
var container:Sprite = new Sprite(); 
addChild(container); 
var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);  
function imgLoaded(event:Event):void 
{ 
    container.addChild(pictLdr.content);  
}

ロードの進行状況の監視

ファイルがロードを開始すると、LoaderInfo オブジェクトが作成されます。 LoaderInfo オブジェクトは、ロードの進行状況、ロードする側およびロードされる側の URL、メディアの総バイト数、メディアの規格高さと幅などの情報を提供します。LoaderInfo オブジェクトは、ロードの進行状況を監視するためのイベントも送出します。

次の図は、LoaderInfo オブジェクトの各種使用方法を示します。LoaderInfo オブジェクトは、SWF ファイルのメインクラスのインスタンス、Loader オブジェクト、および Loader オブジェクトによってロードされたオブジェクトの場合でそれぞれ使用方法が異なります。

LoaderInfo オブジェクトは、Loader オブジェクトと、ロードされた表示オブジェクトの両方のプロパティとしてアクセスできます。 LoaderInfo オブジェクトは、ロードが開始されると同時に、Loader オブジェクトの contentLoaderInfo プロパティを介してアクセスできます。また、表示オブジェクトのロード完了後は、表示オブジェクトの loaderInfo プロパティを介してロードされた表示オブジェクトのプロパティとして LoaderInfo オブジェクトにアクセスすることができます。ロードされた表示オブジェクトの loaderInfo プロパティは、Loader オブジェクトの contentLoaderInfo プロパティと同じ LoaderInfo オブジェクトを参照します。つまり、LoaderInfo オブジェクトは、ロードされたオブジェクトファイルとロードした Loader オブジェクト間(ロードする側およびロードされる側の間)で共有されます。

ロードされたコンテンツのプロパティにアクセスするには、LoaderInfo オブジェクトにイベントリスナーを次のコードのように追加する必要があります。

import flash.display.Loader; 
import flash.display.Sprite; 
import flash.events.Event; 
 
var ldr:Loader = new Loader(); 
var urlReq:URLRequest = new URLRequest("Circle.swf"); 
ldr.load(urlReq); 
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
addChild(ldr); 
 
function loaded(event:Event):void 
{ 
    var content:Sprite = event.target.content; 
    content.scaleX = 2; 
}

詳しくは、イベント処理を参照してください。

ロードコンテキストの指定

Loader クラスの load() または loadBytes() メソッドを介して Flash Player に外部ファイルをロードする場合、オプションで context パラメーターを指定できます。このパラメーターは LoaderContext オブジェクトです。

LoaderContext クラスには、ロードされたコンテンツの使用方法のコンテキストを定義できる次の 3 つのプロパティが含まれています。

  • checkPolicyFile:このプロパティは、SWF ファイルではなくイメージファイルをロードする場合にのみ使用します。このプロパティを true に設定した場合、Loader は元のサーバーで ポリシーファイルをチェックします(Web サイトのコントロール(ポリシーファイル)を参照)。 これは、Loader オブジェクトを含む SWF ファイルのドメイン以外のドメインにあるコンテンツにのみ必要です。 サーバーから Loader ドメインにアクセス許可が与えられている場合、Loader ドメイン内の SWF ファイルの ActionScript はロードされたイメージ内のデータにアクセスできます。つまり、BitmapData.draw() コマンドを使用して、ロードされたイメージ内のデータにアクセスできます。

    Loader オブジェクトのドメイン以外の他のドメインにある SWF ファイルは、Security.allowDomain() を呼び出して特定のドメインを許可できます。

  • securityDomain:このプロパティは、イメージではなく SWF ファイルをロードする場合にのみ使用します。Loader オブジェクトを含むファイルのドメイン以外のドメインの SWF ファイルに対してこのプロパティを指定します。 このオプションを指定すると、Flash Player はポリシーファイルが存在するかどうかをチェックします。ファイルが存在する場合は、クロスポリシーファイルで許可されているドメインの SWF ファイルはロードされた SWF コンテンツをクロススクリプトできます。このパラメーターとして flash.system.SecurityDomain.currentDomain を指定できます。

  • applicationDomain:ActionScript 1.0 や 2.0 で記述されたイメージまたは SWF ファイルではなく、ActionScript 3.0 で記述された SWF ファイルをロードする場合にのみ、このプロパティを使用します。ファイルをロードするとき、applicationDomain パラメーターを flash.system.ApplicationDomain.currentDomain に設定することで、ファイルが Loader オブジェクトと同じアプリケーションドメインに含まれるように指定できます。ロードされた SWF ファイルを同じアプリケーションドメインに置くと、そのクラスに直接アクセスできます。 これは、関連付けられたクラス名を使用してアクセスできる埋め込みメディアを含む SWF ファイルをロードする場合に便利です。 詳しくは、アプリケーションドメインの操作を参照してください。

次に示す例では、別のドメインからビットマップをロードするとき、ポリシーファイルをチェックします。

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

次に示す例では、別のドメインから SWF をロードするときに、ポリシーファイルをチェックし、このファイルを Loader オブジェクトと同じセキュリティサンドボックス内に配置します。また、このコードは、ロードされた SWF ファイルのクラスを Loader オブジェクトと同じアプリケーションドメインに追加します。

var context:LoaderContext = new LoaderContext(); 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/library.swf"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

詳しくは、『Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド』の LoaderContext クラスの項を参照してください。

AIR for iOS での SWF ファイルのロード

iOS デバイスでは、実行時のコードのロードやコンパイルに制限があります。この制限により、外部の SWF ファイルをアプリケーションにロードする作業には、以下のような違いが必要になります。

  • ActionScript コードを含む SWF ファイルはすべて、アプリケーションパッケージに含める必要があります。コードを含む SWF は、ネットワーク経由など、外部ソースからロードすることはできません。アプリケーションのパッケージ化の一環として、アプリケーションパッケージに含まれるすべての SWF ファイル内のすべての ActionScript コードが、iOS デバイス用のネイティブコードにコンパイルされます。

  • SWF ファイルをロードし、アンロードしてから再ロードすることはできません。これを行おうとすると、エラーが発生します。

  • メモリにロードしてからアンロードするビヘイビアーは、デスクトッププラットフォームの場合と同じです。SWF ファイルをロードしてからアンロードすると、SWF に含まれるすべてのビジュアルアセットがメモリからアンロードされます。ただし、ロードされた SWF 内の ActionScript クラスに対するクラス参照は、メモリ内に残り、ActionScript コードでアクセスできます。

  • ロードされる SWF ファイルはすべて、メインの SWF ファイルと同じアプリケーションドメインにロードする必要があります。これはデフォルトのビヘイビアーではないため、SWF をロードするたびに、メインのアプリケーションドメインを指定する LoaderContext オブジェクトを作成し、その LoaderContext オブジェクトを Loader.load() メソッド呼び出しに渡す必要があります。メインの SWF アプリケーションドメイン以外のアプリケーションドメインに SWF をロードしようとすると、エラーが発生します。これは、ロードされる SWF にビジュアルアセットのみが含まれ、ActionScript コードが含まれていない場合でも同じです。

    次の例は、アプリケーションパッケージからメインの SWF のアプリケーションドメインへ SWF をロードする際に使用するコードを示しています。

    var loader:Loader = new Loader(); 
    var url:URLRequest = new URLRequest("swfs/SecondarySwf.swf"); 
    var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); 
    loader.load(url, loaderContext);

アセットのみが含まれ、コードが含まれていない SWF ファイルは、アプリケーションパッケージからでも、ネットワーク経由でも、ロードできます。いずれの場合も、SWF ファイルはメインのアプリケーションドメインにロードする必要があります。

AIR 3.6 より前のバージョンの AIR の場合は、コンパイル処理中に、メインのアプリケーション SWF ではなく、SWF から、すべてのコードが削除されます。ビジュアルアセットのみを含む SWF ファイルは、アプリケーションパッケージに含めて実行時にロードできますが、コードはできません。ActionScript コードを含む SWF をロードしようとすると、エラーが発生します。このエラーが発生すると、未コンパイルの ActionScript エラーダイアログがアプリケーションに表示されます。

参照項目

iOS 上の AIR アプリケーションでの複数の SWF のパッケージ化とロード

ProLoader クラスおよび ProLoaderInfo クラスの使用

リモート共有ライブラリ(RSL)のプリロードのために、Flash Professional CS5.5 では、fl.display.ProLoader および fl.display.ProLoaderInfo クラスが導入されています。これらのクラスは、flash.display.Loader クラスおよび flash.display.LoaderInfo クラスをミラーしますが、さらに一貫したロード操作を実現します。

特に ProLoader では、RSL プリロードを伴う、Text Layout Framework(TLF)を使用する SWF ファイルのロードを簡単に実行できます。実行時、TLF などの、他の SWF ファイルまたは SWZ ファイルをプリロードする SWF ファイルには、内部利用のみの SWF ラッパーファイルが必要になります。SWF ラッパーファイルによって複雑さのレイヤーが追加され、予期しない動作が発生することがあります。ProLoader は、このような複雑さを解決し、通常の SWF ファイルであるかのようにこれらのファイルをロードします。ProLoader クラスによって使用されるソリューションはユーザーに対しては透過的であり、ActionScript での特別な処理は必要ありません。さらに、ProLoader は通常の SWF コンテンツを正確にロードします。

Flash Professional CS5.5 以降では、Loader クラスのすべての使用箇所を ProLoader クラスに安全に置き換えることができます。その後、必要な ActionScript 機能に ProLoader がアクセスできるよう、アプリケーションを Flash Player 10.2 以降に書き出します。ActionScript 3.0 をサポートする、以前の Flash Player のバージョンを対象とする場合も、ProLoader を使用することができます。ただし、ProLoader 機能を最大限に活用できるのは Flash Player 10.2 以降のみです。Flash Professional CS5.5 以降で TLF を使用する場合は常に ProLoader を使用してください。Flash Professional 以外の環境では、ProLoader は必要ありません。

重要: Flash Professional CS5.5 以降でパブリッシュされた SWF ファイルについては、flash.display.Loader および flash.display.LoaderInfo の代わりに、常に fl.display.ProLoader および fl.display.ProLoaderInfo クラスを使用できます。

ProLoader クラスによって解決される問題

ProLoader クラスでは、従来の Loader クラスでは処理するよう想定されていなかった問題が解決されます。これらの問題は、TLF ライブラリの RSL プリロードによるものです。特に、Loader オブジェクトを使用して他の SWF ファイルをロードする SWF ファイルに適用されます。解決される問題には次のものがあります。

  • ロードする側のファイルとロードされる側のファイルの間のスクリプティングが期待通りに動作しません。ProLoader クラスは、ロードする側の SWF ファイルをロードされる側の SWF ファイルの親として自動的に設定します。このため、ロードする側の SWF ファイルからの情報が、ロードされる側の SWF ファイルに直接伝達されます。

  • SWF アプリケーションで、積極的にロード処理を管理する必要があります。これを行うためには、addedremovedaddedToStageremovedFromStage などの追加イベントの実装が必要です。アプリケーションが Flash Player 10.2 以降を対象とする場合は、ProLoader を使用すればこのような追加の作業をする必要がなくなります。

Loader の代わりに ProLoader を使用するためのコードの更新

ProLoader は Loader クラスをミラーするので、コード内で 2 つのクラスを簡単に入れ替えることができます。以下の例は、新しいクラスを使用するために既存のコードを更新する方法を示します。

import flash.display.Loader; 
import flash.events.Event; 
var l:Loader = new Loader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}

このコードは、次のように ProLoader を使用するように更新することができます。

import fl.display.ProLoader; 
import flash.events.Event; 
var l:ProLoader = new ProLoader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}