as3加载外部资源

简介: 在as3的开发中,经常会加载外部共用资源,比如某一个公用的图片或者其它小特效。这时候为了避免重复请求,一般会将这些资源放在一个fla文件中,为每一个资源添加链接。这里以一张图片为例(flower.fla):   这样就生成了一个名为flower.

在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

目录
相关文章
如何确保延迟加载的资源能够在需要时及时加载?
【10月更文挑战第14天】保障延迟加载资源的及时加载是一个复杂而持续的过程,需要我们不断地探索和实践。通过合理的设计、优化和管理,我们能够为用户提供更流畅、高效的体验,同时也能更好地发挥资源的价值。
76 2
|
11月前
|
Flask读取本地资源供外部访问
Flask读取本地资源供外部访问
122 0
|
11月前
|
外部函数
外部函数
101 0
3500/42 GE / 本特利内华达 带内部屏障和内部终端的I/O模块
3500/42 GE / 本特利内华达 带内部屏障和内部终端的I/O模块
|
11月前
|
C#
C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件
C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件
110 0
Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用
使用 Resource 加载资源 要使用 Resource 接口加载资源,首先需要获取一个 ResourceLoader 实例,通常可以通过依赖注入来获得。接下来,您可以使用 ResourceLoader 来获取 Resource 对象,然后使用它来访问资源的内容。
208 0
Java代理模式:如何优雅地控制对象访问?
Java代理模式:如何优雅地控制对象访问?
302 1
C++在资源管理类中提供对原始资源的访问
C++在资源管理类中提供对原始资源的访问
178 0
加载、读取资源的方式(底层都是以流的方式获取资源,具体是通过类加载器进行加载,通过流的方式进行读取,从而获取资源)
加载、读取资源的方式(底层都是以流的方式获取资源,具体是通过类加载器进行加载,通过流的方式进行读取,从而获取资源)
142 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等