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

目录
相关文章
|
4月前
|
测试技术 API C++
C/C++ 实现动态资源文件释放
当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)的情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中。在某些情况下,我们可能需要从可执行文件中提取自定义资源并保存为独立的文件。在这篇博客文章中,我们将讨论如何使用C++和WinAPI实现这个目标。首先,让我们考虑一个场景:我们有一个 Windows 应用程序,其中包含了一个自定义的二进制资源比如默认的配置文件,我们希望将这个资源提取出来并保存为一个独立的文件以用于初始化程序配置项。为了实现这个目标,我们可以使用`Windows API`提供的相关函数,来完成对资源的释放工作。
48 0
|
12月前
|
消息中间件 网络协议 关系型数据库
Java应用程序读取外部配置文件
当我们在服务器上安装一些软件服务时,如 MySQL、Kafka、ES 等,在启动服务的时候,脚本会读取默认路径下的配置文件,如果配置文件没有放到默认的路径下,我们也可以通过参数的方式指定,通过这个配置文件,可以灵活方便的开始某些功能或调整某些参数,不用重新对源码进行修改、编译和发布了。 所以,我们工作当中有时希望可以把配置文件放在程序外,这样就可以做到配置与业务分离,在项目中使用的 properties,这里就说一下如何用 properties 配置文件,默认加载 classpath 下的文件,如果通过参数指定了文件路径就可以使用外部配置了。
配置静态和动态
介绍: 静态nat 和 动态nat 的配置 静态nat 配置步骤 第一步 配置接口地址 第二步 配置静态地址转换 ip nat inside source static 内部私有地址 转换之后的公网地址 动态nat 配置步骤 第一步 配置接口地址 第二步 配置标准acl 指定需要转换的多个内部主机地址 access-list 编号 permit 网段地址 子网掩码反码 第三步 配置 转换后的公网地址地址池 ip nat pool 地址池名字 起始地址 结束地址 子网掩码 第四步 配置动态地址
118 0
|
Java 应用服务中间件 开发者
配置外部应用| 学习笔记
快速学习配置外部应用代理,介绍了配置外部应用系统机制, 以及在实际应用过程中如何使用。
83 0
|
缓存
读源码长知识 | 动态扩展类并绑定生命周期的新方式
在阅读viewModelScope源码时,发现了一种新的方式。 协程需隶属于某 CoroutineScope ,以实现structured-concurrency,而 CoroutineScope 应
136 0
|
安全 编译器 API
C++在资源管理类中提供对原始资源的访问
C++在资源管理类中提供对原始资源的访问
125 0
|
存储 Java Spring
AutoConfiguration加载元数据和自动配置组件
@EnableAutoConfiguration 加载元数据配置 加载元数据配置主要是为后续操作提供数据支持。 我们先来看加载相关源代码的具体实现,该功能的代码依旧日在 selectlmpots 方法内。 @Override publicString[] selectImports (AnnotationMetadata annotationMetadata) { AutoConfigurat ionMetadata autoConf igurationMetadata = AutoConfigurationMetadataLoader. loadMetadata(this. bea
163 0
AutoConfiguration加载元数据和自动配置组件
|
Java 数据库连接 Spring
加载、读取资源的方式(底层都是以流的方式获取资源,具体是通过类加载器进行加载,通过流的方式进行读取,从而获取资源)
加载、读取资源的方式(底层都是以流的方式获取资源,具体是通过类加载器进行加载,通过流的方式进行读取,从而获取资源)
99 0
|
安全 C++ Windows
C++调用外部应用程序的方法的整理总结(常用)
一、三个SDK函数:  WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
2788 0
|
Java 开发者
获取类路径下的资源 | 学习笔记
快速学习获取类路径下的资源。