您可以從 Flash SWF 檔案內部將其他外部 SWF 檔案作為資產載入。載入外部 SWF 檔案有以下幾個原因:

  • 因為一個專案可分成多個影片,個別的 SWF 檔案大小會較小。容量較小的檔案載入速度較快,且能較有效地管理記憶體。  
  • 其可讓您根據使用者在您的影片中執行的內容,而僅載入您需要的內容。
  • 瀏覽器不必載入其他 HTML 頁面即可連續播放多個 SWF 檔案。頁面沒有與重新載入相關的暫停或重新整理選項。
  • 這樣讓您的專案資產組織擁有較佳的彈性。
  • 可建立不仰賴單一 SWF 檔案的複雜使用者介面。能結合許多 SWF 檔案來建立介面。結合 SWF 檔案可簡化編輯,因為個別且容量較小的 SWF 檔案可在不影響介面其他部分的情況下進行修改。
  • 多位作者可透過使用個別的 FLA 檔案合力製作相同專案。

將內容置入個別的 SWF 檔案,類似於將內容置入其本身的影片片段符號。其中的差異在於內容不存在於主要 SWF 檔案中。您也可載入影像檔案,例如 JPG、PNG、GIF。

若要從內部其他 SWF 檔案載入外部 SWF 檔案,請使用以下其中一個選項:

  • ActionScript 3.0 Loader 類別
  • ActionScript 2.0 loadMovie 命令
  • ActionScript 2.0 MovieClipLoader 類別

使用 ActionScript 3.0 Loader 類別

ActionScript 3.0 中的 Loader 類別是您用於載入及顯示外部內容之 DisplayObject 的子類別。若要載入 SWF 檔案,您可使用類別的 load 方法。 load 方法有一個必要參數,即為包含載入內容之 URL 位置的 URLRequest 執行個體。

下列程式碼範例會建立 Loader 執行個體,並載入名為「myExternalMovie.swf」的外部 SWF 檔案。

var myLoader:Loader = new Loader();                     // create a new instance of the Loader class
var url:URLRequest = new URLRequest("ExternalSWF.swf"); // in this case both SWFs are in the same folder 
myLoader.load(url);                                     // load the SWF file
addChild(myLoader);                                     // add that instance to the display list, adding it to the Stage at 0,0

// (optional)
myLoader.x = 10;                                        // move the loaded SWF 10 pixels to the right (from the left edge)   
myLoader.y = 175;                                       // move the loaded SWF 175 pixels down from the top

// (optional) load a second external SWF file
var my2ndLoader:Loader = new Loader();
var url2:URLRequest = new URLRequest("ExternalSWF2.swf");
my2ndLoader.load(url2);
addChild(my2ndLoader);                                  // optionally, you could put the 2nd SWF beneath 
                                                        // the 1st by using addChildAt(my2ndLoader, 1);
                                                        // displacing the 1st SWF from position 1 to 2 in the display list

// (optional) scaling of the 2nd SWF file
my2ndLoader.scaleX = 2;                                 // scale the SWF horizontally by 200%
my2ndLoader.scaleY = 2;                                 // scale the SWF vertically by 200%

載入之 SWF 檔案的 URL 可為相對或絕對路徑。如需有關 Flash Player 如何處理 URL 的詳細資訊,請參閱下方的相對路徑。如需有關 Loader 類別的詳細資訊,請參閱 Platform ActionScript 語言參考中的 Loader

root 參照 (可使用時) 一律反映顯示清單樹狀結構之 SWF 檔案代表部分中最頂層的顯示物件。(若為影像,root 參考點陣圖物件。)

注意: 在 ActionScript 3.0 中,沒有與 ActionScript 2.0 _lockroot_level 相同的屬性。請參閱 ActionScript 3.0 開發人員指南中的顯示程式設計的基本概念

使用 ActionScript 2.0 loadMovie 命令

loadMovie 命令可在 ActionScript 2.0 中將一個外部 SWF 檔案或影像載入影片片段中,或者上層影片的其他層級中。

loadMovie 命令有兩種不同的型式:

  • MovieClip.loadMovie 方法: MovieClip 方法用於將外部內容載入特定的影片片段執行個體。
  • 全域 loadMovie 函數: 全域 loadMovie 功能可用於將內容載入影片或層級。全域型式也有兩種變體 (loadMovieloadMovieNum)。第一種變體會將內容載入影片或層級,而第二種變體 (loadMovieNum) 會特別載入層級中。

MovieClip.loadMovie

將外部內容載入影片片段執行個體時,Adobe 建議您使用 MovieClip 方法版本的 loadMovie。此版本直接從您要載入內容的影片片段呼叫,並透過內容的 URL 傳遞。

myMovieClipInstance.loadMovie("myExternalMovie.swf");  // here only the filename is given, indicating the SWF file 
                                                       // is in the same folder as the parent SWF.

載入之內容的 URL 可為相對或絕對路徑。如需有關 Flash player 如何處理 URL 的詳細資訊,請參閱下方的相對路徑

載入後,內容會顯示在容器影片片段中。容器影片片段的位置以及其他基本內容會保留。但是,任何在容器影片片段中定義的自訂屬性或函數將不再存在。新的內容會取代之前的所有內容 (包括程式碼和 onRelease 之類的事件處理常式)。因此,任何針對影片片段使用 onLoad 事件處理常式所做的嘗試都無法運作。在此情況下,請改用 MovieClipLoader 類別。如需有關 MovieClip.loadMovie 的詳細資訊,請參閱 ActionScript 2.0 語言參考中的 MovieClip.loadMovie

全域 loadMovie 和 loadMovieNum

loadMovie 命令也會以全域功能的型式存在。此功能有兩個必要的參數,即為外部內容的 URL 和載入內容的目標。目標參數可為字串或參照。下列文字行相當於將「myExternalMovie.swf」載入名為 myContainer 影片片段執行個體:

loadMovie("myExternalMovie.swf", myContainer);    // the target myContainer is an object reference
loadMovie("myExternalMovie.swf", "myContainer");  // the target "myContainer" is a string

loadMovie 還可以將內容載入 Flash Player 的不同層級。Flash Player 中層級就如同播放器階層。可在相同的 Flash player 執行個體中播放多個影片,不需以巢狀方式相互置入其中。每個層級代表一個獨特的根,在此處影片可獨立於其他層級內的影片進行播放 (必須使用 _lockroot)。

您可以使用緊跟在代表層級號碼的數字之後的 _level 參照 ActionScript 中的層級。第一個載入 Flash Player 的影片在 _level0 上。其他層級可新增到該層級的頂端。下列對 loadMovie 的呼叫會將「myExternalMovie.swf」載入目前在播放器中播放之影片頂端的層級 1。

loadMovie("myExternalMovie.swf", "_level1");

全域 loadMovie 函數的變體為 loadMovieNum。此方法就如同 loadMovie,但其只鎖定層級,且是透過數字鎖定,而不是名稱。若要將 SWF 檔案載入層級 1 (_level1),請使用以下內容:

loadMovieNum("myExternalMovie.swf", 1);

載入至層級時,Adobe 建議您使用 loadMovieNum 而非 loadMovie。如需詳細資訊,請參閱 ActionScript 2.0 語言參考中的全域 loadMovie

使用 _lockroot 預防 _root 衝突

將外部影片載入其他影片時,載入之影片片段的 _root 參照會從其主要時間軸變更為載入之影片的時間軸。也就是說,_root 一律參考階層中最頂端的時間軸。如果您不希望 _root 參考最頂端的時間軸,可將載入影片片段之主要時間軸的 _lockroot 屬性設為 true。此屬性告知該時間軸的子項目,當其參考 _root 時要參考該時間軸。

this._lockroot = true;     // add this code in the main timeline of the SWF file that will be loaded into another SWF

注意: _lockroot 屬性僅在發佈到 Flash Player 7 或更新版本時才可使用。

 使用 ActionScript 2.0 MovieClipLoader 類別

ActionScript 2.0 中的 MovieClipLoader 類別設計可使將外部內容載入 MovieClip 執行個體的過程變得更容易。如同之前提及的,當新的內容載入至這些影片片段後,影片片段中已定義的變數及函數就會移除。像 onLoad 之類的回呼是不可能的。不過,MovieClipLoader 以代理這類事件的方式避開此限制。您可以建立不同的 MovieClipLoader 執行個體,管理將內容載入至其他影片片段的載入作業。因此不會發生清除影片片段中之變數及函數的情形。

透過 MovieClipLoader 類別將內容載入影片片段中時,首先要製作類別的新執行個體。然後使用 loadClip 將內容載入目標影片片段中。在以下範例中,新的內容將會載入影片片段 myContainer 中。

var myLoader:MovieClipLoader = new MovieClipLoader();
myLoader.loadClip("myExternalMovie.swf", myContainer);

如果您想知道內容已載入,請使用 onLoadInit 事件處理常式以及您的 MovieClipLoader 執行個體。

var myLoader:MovieClipLoader = new MovieClipLoader(); 
myLoader.addListener(this); 
myLoader.loadClip("myExternalMovie.swf", myContainer); 

function onLoadInit(mc:MovieClip) 
    { 
        trace("content has been loaded into "+mc); 
    }

想掌控更多有關將內容載入影片片段中的資訊時,請使用 MovieClipLoader 類別,而不是 MovieClip.loadMovie。(例如,在您希望可以檢查載入進度時使用此事件處理常式。) 如需有關 MovieClipLoader 類別的詳細資訊,請參閱 ActionScript 2.0 語言參考中的 MovieClipLoader

注意: MovieClipLoader類別僅在發佈到 Flash Player 7 或更新版本時才可使用。

 使用相對路徑載入內容

使用具有 LoaderloadMovie 的相對路徑可能造成混亂。因為任何 SWF 檔案或影片片段的時間軸都可執行 loadMovie 動作,問題是「載入之影片相對於哪個時間軸?」其是否相對於 _level0 上的主要時間軸?又或,其是否相對於執行影片載入動作的時間軸?答案很簡單: 載入之影片一律相對於將其載入的時間軸。請參閱相對 URL 參照不正確 | Flash (tn_04157),取得相對路徑的討論,其與載入外部 SWF 檔案也有相關。

影格速率考量事項

多數情況下,載入之影片會繼承上層影片的影格速率。例如,在載入至影格速率為 24 fps 的影片後,原影格速率為 12 fps 的 SWF 檔案會以 24 fps 的速度播放。唯一的例外是,如果載入之影片的同步化選項設為「串流」,則時間軸上會包含聲音。只有在這個時候,主要影片才會繼承載入之影片的影格速率,以確保聲音正確播放。

注意: ActionScript 3.0 可讓您使用 Stage.frameRate 屬性自動變更影格速率。

關鍵字: Flash Player, 載入影片; ActionScript; 指令碼; 層級; 告知目標; 變數; 目標; 執行個體; SWF; loadMovie; tn_14190

此産品由 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 授權  Creative Commons 條款未涵蓋 Twitter™ 與 Facebook 文章。

法律說明   |   線上隱私權政策