SWF与SWF交互
2010年07月23日
在AS2里SWF与SWF交互是非常容易的,可在AS3里一切都似乎复杂化了。
主SWF访问子SWF:
比如有两个SWF。main.swf 、game.swf,main.swf加载game.swf。main 里有个按钮 _btn,game.swf里有一个gameMc:MovieClip 。
当按m1时,gameMc暂停播放。
在AS2里可以方便的写:
var mc=this.createEmptyMovieClip("mc",10)
var loader:MovieClipLoader=new MovieClipLoader()
loader.loadClip("game.swf",mc)
loader.addListener(loadListener)
var loadListener=new Object()
loadListener.onLoadInit = function(target_mc:MovieClip) {
_btn.onRelease=function(){
target_mc. gameMc.stop()
}
}
可是如果在AS3里直接这样操作的话是会出错的,有2个新地方要注意:
ApplicationDomain、LoaderContext、
在main.as:
package {
import flash.display.MovieClip;
import flash.events.*;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.ProgressEvent;
[b] import flash.system.ApplicationDomain
import flash.system.LoaderContext [/b]
import flash.display.SimpleButton
public class main extends MovieClip {
var _loader:Loader;
var _swfArray:Array;
var _urlRequest:URLRequest;
public function main() {
_swfArray=["game.swf","link.swf","news.swf"];
_loader=new Loader();
_btn.addEventListener(MouseEvent.CLICK,cm1);
[b] var loadContxt= new LoaderContext(false,ApplicationDomain.currentDomain) [/b]
/*这个在更复杂的例子中会遇到,比如
RuntimeAssetsExplorer。www.adobe.com/go/learn_programmingAS3samples_flash_cn
*/
_loader.contentLoaderInfo.addEventListener(Event.INIT,loaded);
_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,loading);
_loader.load(new URLRequest(_swfArray[n]),loadContxt);
}
function loaded(e=null) {
trace("加载完成...");
var mc:*=e.target.content;
//mc.name="mc";
addChild(mc);
}
function cm1(e=null) {
var mc:*=_loader.content
mc.gameMc.stop()
}
}
}
子SWF访问主SWF:
当按了下game.swf里的gameMc:MovieClip,让main.swf的按钮_btn为不可见
game.as
package {
import flash.display.MovieClip;
import flash.events.*;
public class game extends MovieClip {
public var gameMcs;
public function game() {
//gameMc.stop()
gameMcs="hrrrrrrh";
trace("kkk");
gameMc.buttonMode=true;
gameMc.useHandCursor=true;
gameMc.addEventListener(MouseEvent.CLICK,setAlpha);
}
public function Test() {
return ("s");
}
public function setAlpha(e=null) {
e.target.play();
[b]this.parent[’_btn’].visible=false; [/b]
}
}
}
最后,翻阅AS3帮助可以知道:
LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
checkPolicyFile 属性
:指定 Flash Player 是否应在开始加载对象本身之前,尝试从所加载对象的服务器上下载跨域策略文件。 此标志适用于 Loader.load() 方法,但不适用于 Loader.loadBytes() 方法。
如果是使用 Loader.load() 方法下载 SWF 文件,也尽量不要将 checkPolicyFile 设置为 true。 这是因为 SWF 到 SWF 的权限不是由策略文件控制的,而是由 Security.allowDomain() 方法控制的,因此在加载 SWF 文件时 checkPolicyFile 不起任何作用。 在这种情况下不必再检查是否存在策略文件,因为这样会延迟 SWF 文件的下载,并且可能会不必要地占用网络带宽 (Flash Player 无法判断您的主下载将是 SWF 文件还是图像,这是因为策略文件下载先于主下载进行)。
applicationDomain 属性
(这里比较重要一点):
指定用于 Loader.load() 或 Loader.loadBytes() 方法的应用程序域。 只应在加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件)时才使用此属性。
每个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。 应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。 如果是从其它域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。 但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。
在 LoaderContext.applicationDomain 中,您只可以传递您自己的安全域中的应用程序域。 如果试图传递任何其它安全域中的应用程序域,则会引发 SecurityError 异常。
securityDomain 属性
:指定用于 Loader.load() 操作的安全域。 只应在加载 SWF 文件(而不是图像)时使用此属性。
2010年07月23日
在AS2里SWF与SWF交互是非常容易的,可在AS3里一切都似乎复杂化了。
主SWF访问子SWF:
比如有两个SWF。main.swf 、game.swf,main.swf加载game.swf。main 里有个按钮 _btn,game.swf里有一个gameMc:MovieClip 。
当按m1时,gameMc暂停播放。
在AS2里可以方便的写:
var mc=this.createEmptyMovieClip("mc",10)
var loader:MovieClipLoader=new MovieClipLoader()
loader.loadClip("game.swf",mc)
loader.addListener(loadListener)
var loadListener=new Object()
loadListener.onLoadInit = function(target_mc:MovieClip) {
_btn.onRelease=function(){
target_mc. gameMc.stop()
}
}
可是如果在AS3里直接这样操作的话是会出错的,有2个新地方要注意:
ApplicationDomain、LoaderContext、
在main.as:
package {
import flash.display.MovieClip;
import flash.events.*;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.ProgressEvent;
[b] import flash.system.ApplicationDomain
import flash.system.LoaderContext [/b]
import flash.display.SimpleButton
public class main extends MovieClip {
var _loader:Loader;
var _swfArray:Array;
var _urlRequest:URLRequest;
public function main() {
_swfArray=["game.swf","link.swf","news.swf"];
_loader=new Loader();
_btn.addEventListener(MouseEvent.CLICK,cm1);
[b] var loadContxt= new LoaderContext(false,ApplicationDomain.currentDomain) [/b]
/*这个在更复杂的例子中会遇到,比如
RuntimeAssetsExplorer。www.adobe.com/go/learn_programmingAS3samples_flash_cn
*/
_loader.contentLoaderInfo.addEventListener(Event.INIT,loaded);
_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,loading);
_loader.load(new URLRequest(_swfArray[n]),loadContxt);
}
function loaded(e=null) {
trace("加载完成...");
var mc:*=e.target.content;
//mc.name="mc";
addChild(mc);
}
function cm1(e=null) {
var mc:*=_loader.content
mc.gameMc.stop()
}
}
}
子SWF访问主SWF:
当按了下game.swf里的gameMc:MovieClip,让main.swf的按钮_btn为不可见
game.as
package {
import flash.display.MovieClip;
import flash.events.*;
public class game extends MovieClip {
public var gameMcs;
public function game() {
//gameMc.stop()
gameMcs="hrrrrrrh";
trace("kkk");
gameMc.buttonMode=true;
gameMc.useHandCursor=true;
gameMc.addEventListener(MouseEvent.CLICK,setAlpha);
}
public function Test() {
return ("s");
}
public function setAlpha(e=null) {
e.target.play();
[b]this.parent[’_btn’].visible=false; [/b]
}
}
}
最后,翻阅AS3帮助可以知道:
LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
checkPolicyFile 属性
:指定 Flash Player 是否应在开始加载对象本身之前,尝试从所加载对象的服务器上下载跨域策略文件。 此标志适用于 Loader.load() 方法,但不适用于 Loader.loadBytes() 方法。
如果是使用 Loader.load() 方法下载 SWF 文件,也尽量不要将 checkPolicyFile 设置为 true。 这是因为 SWF 到 SWF 的权限不是由策略文件控制的,而是由 Security.allowDomain() 方法控制的,因此在加载 SWF 文件时 checkPolicyFile 不起任何作用。 在这种情况下不必再检查是否存在策略文件,因为这样会延迟 SWF 文件的下载,并且可能会不必要地占用网络带宽 (Flash Player 无法判断您的主下载将是 SWF 文件还是图像,这是因为策略文件下载先于主下载进行)。
applicationDomain 属性
(这里比较重要一点):
指定用于 Loader.load() 或 Loader.loadBytes() 方法的应用程序域。 只应在加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件)时才使用此属性。
每个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。 应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。 如果是从其它域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。 但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。
在 LoaderContext.applicationDomain 中,您只可以传递您自己的安全域中的应用程序域。 如果试图传递任何其它安全域中的应用程序域,则会引发 SecurityError 异常。
securityDomain 属性
:指定用于 Loader.load() 操作的安全域。 只应在加载 SWF 文件(而不是图像)时使用此属性。