將應用程式分為多個 SWF 檔案。
行動裝置可能只能存取受限的網路。若要快速載入您的內容,請將應用程式分成多個 SWF 檔案。請嘗試重複使用整個應用程式的程式碼邏輯與資源。例如,假設應用程式已經分為多個 SWF 檔案,如下圖所示:
將應用程式分割成多個 SWF 檔案
在這個範例中,每個 SWF 檔案都會包含其相同點陣圖的副本。若要避免這項重複,可以使用執行階段共享元件庫,如下圖所說明:
使用執行階段共享元件庫
使用這項技術時,會載入執行階段共享元件庫,以便將點陣圖提供給其他 SWF 檔案使用。ApplicationDomain 類別會儲存所有已載入的類別定義,並透過
getDefinition()
方法讓它們在執行階段可供使用。
執行階段共享元件庫也可以包含所有的程式碼邏輯。整個應用程式可以在執行階段更新,而不需重新編譯。下列程式碼會載入執行階段共享元件庫,並在執行階段擷取包含在 SWF 檔案中的定義。這項技術可與字型、點陣圖、音效或任何 ActionScript 類別搭配使用。
// Create a Loader object
var loader:Loader = new Loader();
// Listen to the Event.COMPLETE event
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingComplete );
// Load the SWF file
loader.load(new URLRequest("library.swf") );
var classDefinition:String = "Logo";
function loadingComplete(e:Event ):void
{
var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target );
// Get a reference to the loaded SWF file application domain
var appDomain:ApplicationDomain = objectLoaderInfo.applicationDomain;
// Check whether the definition is available
if ( appDomain.hasDefinition(classDefinition) )
{
// Extract definition
var importLogo:Class = Class ( appDomain.getDefinition(classDefinition) );
// Instantiate logo
var instanceLogo:BitmapData = new importLogo(0,0);
// Add it to the display list
addChild ( new Bitmap ( instanceLogo ) );
} else trace ("The class definition " + classDefinition + " is not available.");
}
取得定義的更簡單方法,是在載入 SWF 檔案的應用程式網域中載入類別定義:
// Create a Loader object
var loader:Loader = new Loader();
// Listen to the Event.COMPLETE event
loader.contentLoaderInfo.addEventListener ( Event.COMPLETE, loadingComplete );
// Load the SWF file
loader.load ( new URLRequest ("rsl.swf"), new LoaderContext ( false, ApplicationDomain.currentDomain) );
var classDefinition:String = "Logo";
function loadingComplete ( e:Event ):void
{
var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target );
// Get a reference to the current SWF file application domain
var appDomain:ApplicationDomain = ApplicationDomain.currentDomain;
// Check whether the definition is available
if (appDomain.hasDefinition( classDefinition ) )
{
// Extract definition
var importLogo:Class = Class ( appDomain.getDefinition(classDefinition) );
// Instantiate it
var instanceLogo:BitmapData = new importLogo(0,0);
// Add it to the display list
addChild ( new Bitmap ( instanceLogo ) );
} else trace ("The class definition " + classDefinition + " is not available.");
}
現在可以呼叫目前應用程式網域上的
getDefinition()
方法,來使用載入的 SWF 檔案中的可用類別。您也可以呼叫
getDefinitionByName()
方法來存取類別。這項技術透過只載入字型與大型資源一次,以節省頻寬。在任何其他的 SWF 檔案中絕不會匯出資源。唯一的限制是必須測試應用程式,並透過 loader.swf 檔案來執行。這個檔案會先載入資源,然後載入撰寫該應用程式的不同 SWF 檔案。