以動態方式載入顯示內容

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

您可以將下列任何外部顯示資源載入 ActionScript 3.0 應用程式中:

  • 以 ActionScript 3.0 編寫的 SWF 檔 - 這個檔案可以是 Sprite、MovieClip 或擴充 Sprite 的任何類別。

  • 影像檔 - 包括 JPG、PNG 和 GIF 檔。

  • AVM1 SWF 檔 - 這是以 ActionScript 1.0 或 2.0 撰寫的 SWF 檔。

您可以使用 Loader 類別載入這些資源。

載入顯示物件

Loader 物件是用來將 SWF 檔及圖像檔載入應用程式中。Loader 類別是 DisplayObjectContainer 類別的子類別。Loader 物件只能在其顯示清單中包含一個子顯示物件,顯示物件代表它所載入的 SWF 或圖像檔。當您將 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 物件的不同用法,分別針對:SWF 檔之主要類別的實體、Loader 物件,以及由 Loader 物件所載入的物件:

LoaderInfo 物件可以同時做為 Loader 物件和已載入顯示物件的屬性加以存取。載入作業一開始,LoaderInfo 物件就可以透過 Loader 物件的 contentLoaderInfo 屬性加以存取。顯示物件完成載入以後,LoaderInfo 物件也可以做為已載入顯示物件的屬性,透過顯示物件的 loaderInfo 屬性加以存取。已載入顯示物件的 loaderInfo 屬性所參考的 LoaderInfo 物件與 Loader 物件的 contentLoaderInfo 屬性相同;換句話說,已載入的物件與載入該物件的 Loader 物件 (亦即,載入器與被載入者) 會共用一個 LoaderInfo 物件。

若要存取已載入內容的屬性,就要將事件偵聽程式加入至 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 或 AIR 之中時,您可以選擇指定 context 參數,這個參數是 LoaderContext 物件。

LoaderContext 類別包括三個屬性,可以讓您定義如何使用載入內容的環境:

  • checkPolicyFile:請只在載入影像檔 (而不是 SWF 檔) 時使用這個屬性。如果將這個屬性設定為 true,Loader 會檢查原則檔的原始伺服器 (請參閱網站控制 (原則檔))。只有在內容不是源自包含 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 3.0 撰寫的 SWF 檔 (而非影像或以 ActionScript 1.0 或 2.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 類別。