动态加载swf并进行交互
2014-10-08 16:44
183 查看
综合http://blog.csdn.net/liyong199012/article/details/6085545
http://blog.sina.com.cn/s/blog_7e2d7da8010130gt.html http://blog.csdn.net/hu36978/article/details/4718840
下面转自 http://bbs.9ria.com/thread-133293-1-1.html
总结下as3反射的相关用法,主要是四个函数:
flash.system.ApplicationDomain.getDefinition(linkName:String):Class; //flashcs元件库中的某个元件链接名称
flash.utils.getDefinitionByName(name:String):Object; //返回name参数指定的类的类对象引用
flash.utils.getQualifiedClassName(value:*):String; //返回对象的完全限定类名
flash.utils.getQualifiedSuperClassNameTest; // 返回value参数指定的对象的基类的完全限定类名。
在as3.0中,你会发现在flash.utils包中有一系列函数提供了反射的功能。主要包含以下功能:
* 确定对象的类
* 确定接口声明的常数和方法
* 获取类的成员、构造函数、方法、父类信息
* 在运行时根据类名创建类的实例
* 在运行时根据成员名称来调用对象成员
* 在运行时根据方法名称来调用对象方法
看代码:
Main.as类
package
{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.Sprite;
import flash.system.ApplicationDomain;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;
import test.IPerson;
import test.PersonImplA;
/**
* as3反射实例
* @author xuechong
* @language as3 fp9
* @date 2012.06.03
* @QQ群交流 241294271
* */
public class Main extends Sprite
{
//private var _personAersonImplA;
public function Main()
{
//getDefinitionFunc();
getDefinitionByNameFunc();
//getQualifiedClassNameFunc();
//getQualifiedSuperClassNameFunc();
}
/**
* flash.system.ApplicationDomain类中的一个函数
* aa字符串就是flashcs元件库中的链接名称(也就是元件绑定的类的名字)
*/
public function getDefinitionFunc():void
{
var app:ApplicationDomain = ApplicationDomain.currentDomain;
try
{
var cls:Class = app.getDefinition("aa") as Class;
var mc:MovieClip = new cls() as MovieClip;
mc.y = 300;
this.addChild(mc);
}
catch(error:ReferenceError)
{
trace("反射错误", error.message);
}
}
/**
* flash.utils.getDefinitionByName(name:String):Object
* 返回name参数指定的类的类对象引用
* 注:如果是自定义类则要先定义上此类的引用
* */
public function getDefinitionByNameFunc():void
{
var ClassReference:Class = getDefinitionByName("test.PersonImplA") as Class; //[class PersonImplA]
var obj:IPerson = new ClassReference() as IPerson; //[object PersonImplA]
obj.sayHello();
}
/**
* flash.utils.getQualifiedClassName(value:*):String
* 返回对象的完全限定类名
* */
private function getQualifiedClassNameFunc():void
{
var sh:Shape = new Shape();
trace(getQualifiedClassName(sh)); //flash.display::Shape
var aersonImplA = new PersonImplA();
trace(getQualifiedClassName(a)); //test:ersonImplA
trace(getQualifiedClassName(this)); //Main
}
/**
* flash.utils.getQualifiedSuperClassNameTest
* 返回value参数指定的对象的基类的完全限定类名。
* 即返回继承关系上的父类
* */
private function getQualifiedSuperClassNameFunc():void
{
var sh:Shape = new Shape();
trace(getQualifiedSuperclassName(sh)); //flash.display:isplayObject
var aersonImplA = new PersonImplA();
trace(getQualifiedSuperclassName(a)); //flash.display::Sprite
trace(getQualifiedSuperclassName(this)); //flash.display::Sprite
}
}
}
复制代码
IPerson.as接口
package test
{
public interface IPerson
{
function sayHello():void;
}
}
复制代码
PersonImplA.as类
package test
{
import flash.display.Sprite;
public class PersonImplA extends Sprite implements IPerson
{
public function PersonImplA()
{
}
public function sayHello():void
{
trace("This is PersonImplA");
}
}
}
复制代码
PersonImplB.as类
package test
{
import flash.display.Sprite;
public class PersonImplB extends Sprite implements IPerson
{
public function PersonImplB()
{
}
public function sayHello():void
{
trace("This is PersonImplB");
}
}
}
复制代码
下面是总结上面几个网址去动态加载swf进行交互的demo
package {
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class LoadSwfExample extends Sprite {
private var loader:Loader;
private var completeLoaded:Boolean;
private var urlRequest:URLRequest;
private var getSwf:MovieClip;//对swf对象的引用变量
public function LoadSwfExample() {
loader= new Loader();
urlRequest=new URLRequest("Loaded.swf");// 该文档与Loaded.swf在一个目录
/**
* 第二种方式才需要加上
* **/
var context : LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
/* 加载到同域(共享库) */
context.applicationDomain = ApplicationDomain.currentDomain;
//context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
//下面我只注册个complete事件,对IOErrorEvent的事件在实际操作时也要注册,以便检测错误
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(urlRequest);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);//主要是改变加载进来的swf的背景颜色
}
private function onComplete(e:Event=null):void {
// 第一种方式下面这句很关键, 将加载进来的Loaded.swf强制转化为MovieClip类型
getSwf=MovieClip(e.currentTarget.content);
//第二种方式
var runtimeClassRef:Class = getClass("Loaded");
getSwf = new runtimeClassRef() as MovieClip;
//把主swf传给动态加载的swf
getSwf.getParent(this);
//然后可以将其当做影片剪辑来使用 也可以操作swf里的全局变量
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onComplete);
getSwf.x=100;
getSwf.y=200;
addChild(getSwf);
completeLoaded=true;
}
private function onDown(e:MouseEvent):void {
if (completeLoaded) {
getSwf._text+=1;//这里操作了_text全局变量
//调用Loaded.swf里的drawbackground()方法
getSwf.drawBackground(Math.random()*0xFFFFFF);//随机颜色值
} else {
trace("正在加载,请等待...");
}
}
/**
*该方法得是public,不然动态加载的swf调用不了该方法
**/
public function moveSWF():void{
getSwf.x+=10;
getSwf.y+=10;
}
//使用反射的方式
private function getClass(className:String):Class
{
//return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
try
{
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
} catch (p_e : ReferenceError)
{
trace("定义 " + className + " 不存在");
return null;
}
return null;
}
}
}
Loaded.swf的代码如下
package {
//该文档的大小是400*200的
// 为了使该swf被夹在后,其他swf能够调用相关变量 则,则该变量必须设为public的公共属性
//强制转换失败的原因
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
public class Loaded extends MovieClip {
public var _text:Number;//文本内容, 其在加载后的swf里要用的 故将其设为public
private var shape:Shape;
public var _textField:TextField;
private var __parent:Object;
public function Loaded() {
_text=0;
shape=new Shape() ;//shape放在外面
drawTextField();
drawBackground(0x6699FF);
addChild(shape);//end draw
addChild(_textField);
}
private function drawTextField():void {
_textField=new TextField ;
_textField.border=true;
_textField.background=true;
_textField.borderColor=0x000000;
_textField.backgroundColor=0xFFFFFF;
_textField.width=300;
_textField.height=100;
_textField.defaultTextFormat=new TextFormat("Arial",16,0x000000);
_textField.restrict="0-9";
_textField.text=String(_text);
_textField.x=50;
_textField.y=50;
_textField.addEventListener(MouseEvent.CLICK,function():void{
trace(__parent);
if(__parent){
__parent.moveSWF();
}
});
}
//创建背景矩形 在其他swf可以改变背景颜色, 故将其设为public
public function drawBackground(color:uint):void {
_textField.text=String(_text);
shape.graphics.clear();
shape.graphics.lineStyle(2,0);//定义矩形边宽
//画矩形
shape.graphics.beginFill(color);
shape.graphics.drawRect(2,2,398,198);
shape.graphics.endFill();
}
public function getParent(_parent:Object) : void {
__parent=_parent;//通过__parent 就可以使用文档类里的方法和属性了。
}
public function setTextFun(msg:String):void{
trace("msg =" + msg);
}
}
}
http://blog.sina.com.cn/s/blog_7e2d7da8010130gt.html http://blog.csdn.net/hu36978/article/details/4718840
下面转自 http://bbs.9ria.com/thread-133293-1-1.html
总结下as3反射的相关用法,主要是四个函数:
flash.system.ApplicationDomain.getDefinition(linkName:String):Class; //flashcs元件库中的某个元件链接名称
flash.utils.getDefinitionByName(name:String):Object; //返回name参数指定的类的类对象引用
flash.utils.getQualifiedClassName(value:*):String; //返回对象的完全限定类名
flash.utils.getQualifiedSuperClassNameTest; // 返回value参数指定的对象的基类的完全限定类名。
在as3.0中,你会发现在flash.utils包中有一系列函数提供了反射的功能。主要包含以下功能:
* 确定对象的类
* 确定接口声明的常数和方法
* 获取类的成员、构造函数、方法、父类信息
* 在运行时根据类名创建类的实例
* 在运行时根据成员名称来调用对象成员
* 在运行时根据方法名称来调用对象方法
看代码:
Main.as类
package
{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.Sprite;
import flash.system.ApplicationDomain;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;
import test.IPerson;
import test.PersonImplA;
/**
* as3反射实例
* @author xuechong
* @language as3 fp9
* @date 2012.06.03
* @QQ群交流 241294271
* */
public class Main extends Sprite
{
//private var _personAersonImplA;
public function Main()
{
//getDefinitionFunc();
getDefinitionByNameFunc();
//getQualifiedClassNameFunc();
//getQualifiedSuperClassNameFunc();
}
/**
* flash.system.ApplicationDomain类中的一个函数
* aa字符串就是flashcs元件库中的链接名称(也就是元件绑定的类的名字)
*/
public function getDefinitionFunc():void
{
var app:ApplicationDomain = ApplicationDomain.currentDomain;
try
{
var cls:Class = app.getDefinition("aa") as Class;
var mc:MovieClip = new cls() as MovieClip;
mc.y = 300;
this.addChild(mc);
}
catch(error:ReferenceError)
{
trace("反射错误", error.message);
}
}
/**
* flash.utils.getDefinitionByName(name:String):Object
* 返回name参数指定的类的类对象引用
* 注:如果是自定义类则要先定义上此类的引用
* */
public function getDefinitionByNameFunc():void
{
var ClassReference:Class = getDefinitionByName("test.PersonImplA") as Class; //[class PersonImplA]
var obj:IPerson = new ClassReference() as IPerson; //[object PersonImplA]
obj.sayHello();
}
/**
* flash.utils.getQualifiedClassName(value:*):String
* 返回对象的完全限定类名
* */
private function getQualifiedClassNameFunc():void
{
var sh:Shape = new Shape();
trace(getQualifiedClassName(sh)); //flash.display::Shape
var aersonImplA = new PersonImplA();
trace(getQualifiedClassName(a)); //test:ersonImplA
trace(getQualifiedClassName(this)); //Main
}
/**
* flash.utils.getQualifiedSuperClassNameTest
* 返回value参数指定的对象的基类的完全限定类名。
* 即返回继承关系上的父类
* */
private function getQualifiedSuperClassNameFunc():void
{
var sh:Shape = new Shape();
trace(getQualifiedSuperclassName(sh)); //flash.display:isplayObject
var aersonImplA = new PersonImplA();
trace(getQualifiedSuperclassName(a)); //flash.display::Sprite
trace(getQualifiedSuperclassName(this)); //flash.display::Sprite
}
}
}
复制代码
IPerson.as接口
package test
{
public interface IPerson
{
function sayHello():void;
}
}
复制代码
PersonImplA.as类
package test
{
import flash.display.Sprite;
public class PersonImplA extends Sprite implements IPerson
{
public function PersonImplA()
{
}
public function sayHello():void
{
trace("This is PersonImplA");
}
}
}
复制代码
PersonImplB.as类
package test
{
import flash.display.Sprite;
public class PersonImplB extends Sprite implements IPerson
{
public function PersonImplB()
{
}
public function sayHello():void
{
trace("This is PersonImplB");
}
}
}
复制代码
下面是总结上面几个网址去动态加载swf进行交互的demo
package {
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class LoadSwfExample extends Sprite {
private var loader:Loader;
private var completeLoaded:Boolean;
private var urlRequest:URLRequest;
private var getSwf:MovieClip;//对swf对象的引用变量
public function LoadSwfExample() {
loader= new Loader();
urlRequest=new URLRequest("Loaded.swf");// 该文档与Loaded.swf在一个目录
/**
* 第二种方式才需要加上
* **/
var context : LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
/* 加载到同域(共享库) */
context.applicationDomain = ApplicationDomain.currentDomain;
//context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
//下面我只注册个complete事件,对IOErrorEvent的事件在实际操作时也要注册,以便检测错误
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(urlRequest);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);//主要是改变加载进来的swf的背景颜色
}
private function onComplete(e:Event=null):void {
// 第一种方式下面这句很关键, 将加载进来的Loaded.swf强制转化为MovieClip类型
getSwf=MovieClip(e.currentTarget.content);
//第二种方式
var runtimeClassRef:Class = getClass("Loaded");
getSwf = new runtimeClassRef() as MovieClip;
//把主swf传给动态加载的swf
getSwf.getParent(this);
//然后可以将其当做影片剪辑来使用 也可以操作swf里的全局变量
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onComplete);
getSwf.x=100;
getSwf.y=200;
addChild(getSwf);
completeLoaded=true;
}
private function onDown(e:MouseEvent):void {
if (completeLoaded) {
getSwf._text+=1;//这里操作了_text全局变量
//调用Loaded.swf里的drawbackground()方法
getSwf.drawBackground(Math.random()*0xFFFFFF);//随机颜色值
} else {
trace("正在加载,请等待...");
}
}
/**
*该方法得是public,不然动态加载的swf调用不了该方法
**/
public function moveSWF():void{
getSwf.x+=10;
getSwf.y+=10;
}
//使用反射的方式
private function getClass(className:String):Class
{
//return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
try
{
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
} catch (p_e : ReferenceError)
{
trace("定义 " + className + " 不存在");
return null;
}
return null;
}
}
}
Loaded.swf的代码如下
package {
//该文档的大小是400*200的
// 为了使该swf被夹在后,其他swf能够调用相关变量 则,则该变量必须设为public的公共属性
//强制转换失败的原因
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
public class Loaded extends MovieClip {
public var _text:Number;//文本内容, 其在加载后的swf里要用的 故将其设为public
private var shape:Shape;
public var _textField:TextField;
private var __parent:Object;
public function Loaded() {
_text=0;
shape=new Shape() ;//shape放在外面
drawTextField();
drawBackground(0x6699FF);
addChild(shape);//end draw
addChild(_textField);
}
private function drawTextField():void {
_textField=new TextField ;
_textField.border=true;
_textField.background=true;
_textField.borderColor=0x000000;
_textField.backgroundColor=0xFFFFFF;
_textField.width=300;
_textField.height=100;
_textField.defaultTextFormat=new TextFormat("Arial",16,0x000000);
_textField.restrict="0-9";
_textField.text=String(_text);
_textField.x=50;
_textField.y=50;
_textField.addEventListener(MouseEvent.CLICK,function():void{
trace(__parent);
if(__parent){
__parent.moveSWF();
}
});
}
//创建背景矩形 在其他swf可以改变背景颜色, 故将其设为public
public function drawBackground(color:uint):void {
_textField.text=String(_text);
shape.graphics.clear();
shape.graphics.lineStyle(2,0);//定义矩形边宽
//画矩形
shape.graphics.beginFill(color);
shape.graphics.drawRect(2,2,398,198);
shape.graphics.endFill();
}
public function getParent(_parent:Object) : void {
__parent=_parent;//通过__parent 就可以使用文档类里的方法和属性了。
}
public function setTextFun(msg:String):void{
trace("msg =" + msg);
}
}
}
相关文章推荐
- XMLHttpRequest动态加载php脚本进行数据交互
- 加载外部swf并与其进行交互
- Flex中实时动态加载(图像swf)皮肤的方法
- Flex实现加载as2的swf交互
- MFC 进行全屏显示并动态加载菜单进行还原
- Flex动态加载swc和swf中的class
- C#动态加载DLL并进行类型转换
- asp jscript, vbscript 的 动态交互 与 动态加载 By shawl.qiu
- 多数据源的动态配置与加载使用兼框架交互的问题调试
- Flex动态加载swc和swf中的class
- flex4/flash builder中动态加载Module并与之交互的正确方式
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之与其他Fragments进行交互
- 动态加载swf的奇怪问题
- 使用FLEX的HttpService与ASP.NET进行动态交互之一
- EXTJS开发笔记01_ext grid动态加载数据库.可根据值进行来进行判断是否选中
- QT和flex swf进行相互调用和交互
- 使用FLEX的HttpService与ASP.NET进行动态交互之一
- 使用FLEX的HttpService与ASP.NET进行动态交互之一
- 使用FLEX的HttpService与ASP.NET进行动态交互之一(转载)
- 对外部加载的swf进行静音控制