as3加載外部資源


在as3的開發中,經常會加載外部共用資源,比如某一個公用的圖片或者其它小特效。這時候為了避免重復請求,一般會將這些資源放在一個fla文件中,為每一個資源添加鏈接。這里以一張圖片為例(flower.fla):

 

這樣就生成了一個名為flower.swf文件,將其放在b.com域下,訪問路徑為:http://b.com/swf/flower.swf

新建一個名為main.fla文件,如果是在fla內加載flower.swf文件,可以這樣定義(本地加載文件,不需要設置LoaderContext的securityDomain屬性,否則會報錯):

ldr = new Loader();
var url:String = 'http://b.com/swf/flower.swf';
var req:URLRequest = new URLRequest(url);
var ldrContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain));

ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
ldr.load(req, ldrContext);
 
如果需要獲取MyFlower這個類
var MyFlower:Class = ldr.contentLoaderInfo.applicationDomain.getDefinition('MyFlower') as Class;

trace(MyFlower + '--' + ApplicationDomain.currentDomain.hasDefinition('MyFlower'));

var bmpData:BitmapData = new MyFlower(359, 629);
var bmp:Bitmap = new Bitmap();
bmp.bitmapData = bmpData;
bmp.x = 0;
bmp.y = 0;

addChildAt(bmp, 0);

因為使用的是子域名加載(new ApplicationDomain(ApplicationDomain.currentDomain)),所以使用當前域ApplicationDomain.currentDomain,是不能獲得到MyFlower類的定義。而loader.contentLoaderInfo.applicationDomain無論是以:當前域(ApplicationDomain.currentDoamin)、子域(new ApplicationDomain(ApplicationDoamin.currentDomain))、新域(new ApplicationDomain()),都可以訪問到加載的swf。

如果main.swf與flower.swf屬於同一域則不需要設置ldrContext的securityDomain屬性,而假設main.swf放在a.com下,而flower.swf放在b.com域下,則需要設置該屬性(ldrContext.securityDomain = SecurityDomain.currentDomain;)。否則在訪問加載的swf時,會報安全沙箱沖突,而main.swf在第一次加載flower.swf時,會先加載b.com根目錄下的crossdomain.xml(http://b.com/crossdomain.xml)文件。

image

 

完整的Main.as(舞台上先放置了一個從庫里拖拽出來的button,而且取消了“自動聲明舞台實例”)

package 
{
import flash.display.Sprite;
import fl.controls.Button;
import flash.events.*;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.system.SecurityDomain;
import flash.external.ExternalInterface;

public class Main extends Sprite
{
public var loadBtn:Button;
private var ldr:Loader;

public function Main()
{
initView();
}

private function initView():void
{
loadBtn.label = '加載swf';

loadBtn.addEventListener(MouseEvent.CLICK, onClickHandler);
}

private function onClickHandler(evt:MouseEvent):void
{
if (ldr == null)
{
ldr = new Loader();

}

var url:String = 'http://b.com/swf/flower.swf';
var req:URLRequest = new URLRequest(url);
var ldrContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain));
ldrContext.securityDomain = SecurityDomain.currentDomain;

ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
ldr.load(req, ldrContext);
}

private function onCompleteHandler(evt:Event):void
{
var MyFlower:Class = ldr.contentLoaderInfo.applicationDomain.getDefinition('MyFlower') as Class;

trace(MyFlower + '--' + ApplicationDomain.currentDomain.hasDefinition('MyFlower'));

var bmpData:BitmapData = new MyFlower(359, 629);
var bmp:Bitmap = new Bitmap();
bmp.bitmapData = bmpData;
bmp.x = 0;
bmp.y = 0;

addChildAt(bmp, 0);
}

}
}
image
 
點擊“加載swf”按鈕后,最終的效果圖:
image

 

有興趣可以擴展閱讀更多(很經典的文章):

教程:深入理解Flash的沙箱 – Application Domains

教程:深入理解Flash的沙箱 – Security Domains


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM