您的位置:首页 > 其它

动态加载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);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: