AS3中,swf加载另一个swf时,两者之间的通信问题跟被加载到的应用程序域有很大关系。应用程序域大概有四种,这里直接引用Flash帮助文档的说 明:
- 加载器的 ApplicationDomain 的子级。 默认值。 可以使用语法 new ApplicationDomain (ApplicationDomain .currentDomain) 显式表示这种选择。 这将允许所加载的 SWF 文件直接使用父级的类,例如,可通过编 写 new MyClassDefinedInParent() 来使用 。 但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用 ApplicationDomain .getDefinition() 来检索它们。 这种选择的优点是,如果子级定义的类与父级已经定义的类同名,不会出现错误结果;子级只会继承父级对该类的定义,除非子级或父级调用 ApplicationDomain .getDefinition() 方法来检索子级的冲突定义,否则将不使用此定义。
- 加载器自己的 ApplicationDomain 。 使 用 ApplicationDomain .currentDomain 时请使用此应用程序域。 加载完成后,父级和子级可以直接使用对方的类 。 如果子级试图定义的类与父级已经定义的类同名,将出现错误并放弃加载。
- 系统 ApplicationDomain 的子级。 使 用 new ApplicationDomain (null) 时请使用此应用程序域。 这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。 一方查看另一方的类的唯一方式是调用 ApplicationDomain .getDefinition() 方法。
- 其它 ApplicationDomain 的子级。 有 时可能会有更复杂的 ApplicationDomain 层次结构。 可以将 SWF 文件从您自己的 SecurityDomain 加载到任何 ApplicationDomain 中。 例如,new ApplicationDomain (ApplicationDomain .currentDomain.parentDomain.parentDomain) 将 SWF 文件加载到当前域父级的父级的新子级中。
第四种稍微复杂点,我们不讨论。
1,子swf访问父swf文档类方法:
在子swf被加载完成后,一般都是采用同一种方式:this.parent.parent.函数名()进行访问;
2,子swf访问父swf中的类:
很多人认为子swf是不能获得父swf的类,其实是可以的。大概思路是:获取父swf的应用程序域,然后通过getDefinition方法。
而1和2,要在子swf被加载完成而且父swf也初始化完毕后调用才正确,否则有可能出现错误。这里一个比较好的方法是在父swf中,当子swf被加载完 成时调用子swf的两个方法,分别将父swf本身的引用和父swf应用程序域的引用传给子swf。示例代码:
var swfTarget = event.target.content;
swfTarget.traceFromLoaded();
swfTarget.getParent(this);//getParent为子swf的一个方法
swfTarget.getParentDomain(ApplicationDomain.currentDomain);//getParentDomain 为子swf的一个方法
其中getParent与getParentDomain方法实现为:
private var _parentObj:Object;
private var _parentDomain:ApplicationDomain;
public function getParent(parentObj:Object):void {
_parentObj = parentObj;
}
public function getParentDomain(parentDomain:ApplicationDomain):void {
_parentDomain = parentDomain;
}
3,父swf访问子swf文档类方法:
用Loader的属性content得到对子swf的引用,然后就可以调用其方法了。示例代码:
var swfTarget = event.target.content;
swfTarget.函数名();
4,父swf访问子swf中的类:
a,不管是上述的哪种域环境,通用的一种方法是,获得子swf的域引用,然后用getDefinition获得要用到的类引用,示例代码:
//LoaderInfo对象承载载入swf文件的信息
var swfTarget:LoaderInfo=event.target as LoaderInfo;
//swfTarget的只读属性applicationDomain返回一个ApplicationDomain
//创建被加载swf的应用程序域
var appDomain:ApplicationDomain=swfTarget.applicationDomain as ApplicationDomain;
//getDefinition方法从指定的应用程序域获取一个公共定义。
//该定义可以是一个类、一个命名空间或一个函数的定义。
//其中"myClass"为被加载swf文件里影片剪辑链接属性里的类
var MCClass:Class=appDomain.getDefinition("MyClass") as Class;
//创建MCClass实例,并返回影片剪辑对象
var myMCA:MovieClip=(new MCClass()) as MovieClip;
var myMCB:MovieClip=(new MCClass()) as MovieClip;
b,如果子swf跟父swf在同一应用程序域中,则可直接通过getDefinitionByName()方法对子swf的类进行调用,其他域则不行;
总结:getDefinition是子父swf相互调用对方类的通用方法,但其中上面文档中的红色字体的,我实验了下,应该是不可以的。编译都报错,怎么 可行?是文档用词不恰当还是我方法不对
发表评论
-
AS3 父SWF与子SWF之间传值
2011-02-20 15:19 2624FLASH中 父SWF加载子SWF并向子SWF传值在很多应用上 ... -
flash as3.0 被加载的swf 控制主swf文件触发事件
2011-02-19 14:48 3039比如有两个swf文件 1.swf,2.swf 1.swf ... -
一些很有创意的导航栏设计,给大家分享下。
2011-02-19 11:08 1584希望对各位同学有所帮助。啊哦………… 陆续完善i ... -
浅谈webgame游戏开发技术要点
2011-02-19 11:02 1012写这些只是想和大家交 ... -
aswing
2011-02-19 10:43 870AsWing是一套UI组件框架,纯ActionScript开发 ... -
as3加载外部XML文件
2011-02-18 19:50 1448加载过程如下: 1.使用URLRequ ... -
如何保护swf文件不被反编译软件破解?
2011-02-18 19:42 2187How to protect SWFs from decomp ... -
45度地图编辑器及游戏开发心得
2011-02-15 19:12 1469转载 这个编辑器是本人为公司项目专门开发 的一个功能比较齐 ... -
BulkLoader开源文件加载类
2011-02-09 22:10 1218BulkLoader是一个不错且使用简单的开源加载类, ... -
社区客户端开发技术总结
2011-01-29 22:57 863不管是什么样的项目,都会拆分成一个一个小的模块。最终实现都是些 ... -
“神之惩戒”--国内MMORPG游戏的困局1
2011-01-28 15:13 806《神之惩戒——MMOR ... -
adobe alchemy资料整理
2011-01-28 14:56 2441Adobe 自从2007年中推出了AS3支持 ... -
hitTest(BitmapData.hitTest 方法)
2011-01-25 18:14 1195public hitTest(firstPoint:Poi ... -
AS3使用外部SWF文件的库文件
2011-01-25 15:32 1473在swf文件中使用外部swf文件的库文件,从而达到类似素材 ... -
Flash摄像头游戏课件设计与开发
2011-01-25 11:07 1204[导读] Flash摄像头游戏课件设计与开发 ... -
AS3图像复制BitmapData.copyPixels()
2011-01-22 16:35 1947//舞台属性设置 stage.align ... -
ps样式介绍
2011-01-22 14:32 859PS样式就是效果的集合。“窗口”“样式”就可以打开样式面板。里 ... -
获取当前SWF的绝对路径
2011-01-20 19:22 1380首先 ,说明我测试的系统地址和网络地址的情况: 某电脑 ... -
PureMVC中观察者模式运用
2011-01-20 09:36 1296刚一个开始看PureMVC,一个字乱,摸不着头脑,不过这个要慢 ... -
获取当前SWF的当前路径
2011-01-19 20:00 1446首先 ,说明我测试的系统地址和网络地址的情况: 某电脑 ...
相关推荐
该案例中TestLocalConnection为主SWF文件加载了TestLocalConnectionReceiver.SWF,两者之间是在同一个域下的通信,工程代码编译路径需要下载者手动修改下。其他技术细节参见Flex_API中的LocalConnection章节。本机...
首先,理解SWF加载的基本原理是至关重要的。在Flash中,我们可以使用`Loader`类来加载SWF文件。`Loader`类是ActionScript 3.0中的一个关键组件,它允许我们加载各种类型的内容,包括图像、SWF文件、视频等。为了加载...
以下是一个基本的示例代码,展示了如何在AS3中加载SWF: ```actionscript import flash.display.Loader; import flash.events.Event; var loader:Loader = new Loader(); loader.contentLoaderInfo....
2. **控制加载的SWF**: 一旦SWF被加载到主应用程序中,可以通过Loader对象与之通信。你可以访问加载的SWF中的公共类、函数或变量,实现对它的控制。例如,如果SWF有一个名为`play()`的公开方法,你可以这样调用它: ...
以下是一个基本的加载SWF文件的步骤: 1. **创建Loader对象**:首先,你需要创建一个`Loader`对象,它是负责加载内容的容器。 ```as3 var loader:Loader = new Loader(); ``` 2. **添加事件监听器**:在加载过程中...
接下来,我们讨论如何控制被加载SWF的当前帧。当SWF加载完成后,我们可以将其添加到舞台,并通过`Loader.content`属性访问加载的电影剪辑。然后,可以使用`play()`和`stop()`方法来控制播放: ```actionscript ...
3. **SWF嵌套与控制**:加载的SWF文件会被包含在`Loader`对象的`content`属性中,可以将其转换为`MovieClip`类型,以便于在主SWF中对其进行操作。例如,通过按钮点击事件来播放不同的动画片段。 ```actionscript ...
在Flex中,我们可以使用`flash.display.Loader`类来加载SWF文件。这个类提供了加载二进制数据(如SWF文件)并将其作为显示对象插入显示列表的能力。`Loader`类的`load()`方法接受一个`URLRequest`对象,其中包含了...
6. **交互与通信**:一旦SWF加载成功,你就可以通过`Loader`对象的`content`属性访问其内部的类和对象。如果SWF包含公开的类或方法,你可以实例化这些类或调用这些方法。 例如,假设SWF库有一个名为`MyClass`的类,...
如果SWF文件内部没有暴露必要的控制接口,我们可能需要通过反射或者其他方式与SWF进行通信。ActionScript 3的`flash.utils.getDefinitionByName()`函数可以帮助我们获取SWF内部的类或函数。 6. **Flex与Flash集成...
- 两个SWF需要在同一个目录下或者Flex应用通过`SWFLoader`加载Flash SWF,以便它们可以在运行时互相通信。 **AS3的SWF之间通讯:** - AS3的SWF可以直接进行跨脚本通讯(Cross-Scripting),不需要`LocalConnection`...
SWF文件通常包含ActionScript代码,这是一种基于ECMAScript的脚本语言,用来控制动画的行为、处理用户输入和与其他网页元素通信。 1. ActionScript:ActionScript是SWF文件的核心,它赋予了Flash内容动态性和交互性...
这里的`onLoaded`函数会在SWF加载完成后被调用,可以用来处理加载的SWF文件。 一旦SWF加载完成,我们可以通过`Loader`对象的`content`属性访问加载的内容。如果加载的SWF包含可交互的元件类,这些类通常会作为`...
总的来说,这个技术方案通过Java与Flash间的socket通信实现了动态加载SWF文件,有效地防止了浏览器缓存问题。这种实时性对于那些需要频繁更新内容或需要个性化服务的应用场景非常有用,比如在线游戏、实时数据可视化...
ActionScript使得SWF文件不仅可以展示静态图像和动画,还能响应用户输入、处理数据和与其他网络资源通信。 SWF播放器通常具备以下特性: 1. 兼容性:支持不同版本的SWF文件,确保老版本和新版本的文件都能正常播放...
加载SWF文件的核心在于使用`Loader`类,它是AS3中的一个核心组件,负责加载各种类型的媒体资源,包括SWF文件。 以下是一段基本的Flex代码示例,展示了如何加载和控制外部SWF文件: ```actionscript import flash....
- **应用**:主要用于创建动画效果、处理用户输入、与服务器通信等。 3. **网页设计中的应用**: - **增强用户体验**:SWF文件可以用来制作吸引人的加载动画、交互式导航栏和动态展示内容,提高用户在网站的停留...
3. **Flash Player API**:在支持的情况下,JavaScript可以通过Flash Player提供的ActionScript External Interface (ASEI)与SWF进行通信。这允许JS调用SWF内部的方法,如播放、停止、前进或后退等。 4. **定时器...
以下是一个基本的加载SWF的示例代码: ```actionscript var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded); loader.load(new URLRequest("path_to_your_...
1. **JavaScript通信**:使用Flash External Interface (ExternalInterface) API,SWF文件可以与JavaScript进行双向通信。这使得你可以控制SWF的行为,如播放、暂停、跳转等,也可以根据SWF的事件更新HTML页面状态。...