flex.docx

上传人:b****5 文档编号:5714800 上传时间:2022-12-31 格式:DOCX 页数:57 大小:40.74KB
下载 相关 举报
flex.docx_第1页
第1页 / 共57页
flex.docx_第2页
第2页 / 共57页
flex.docx_第3页
第3页 / 共57页
flex.docx_第4页
第4页 / 共57页
flex.docx_第5页
第5页 / 共57页
点击查看更多>>
下载资源
资源描述

flex.docx

《flex.docx》由会员分享,可在线阅读,更多相关《flex.docx(57页珍藏版)》请在冰豆网上搜索。

flex.docx

flex

IT博客网-真才实料才是最真-文章分类-FLEX

Dreamhavenolimit

AS3应用程序模块化开发与ApplicationDomain

当程序越来越大,我们需要把它拆分成多个swf,在需要的时候动态加载。

拆分时应该尽量把不同的类编译进唯一的swf,避免因swf文件增多而使整个程序的文件尺寸增大。

按此原则可以拆分出以下两种swf,借助ApplicationDomain共享其代码和资源。

*模块(Module)

按照程序逻辑,可以拆分出多个“功能模块”,如“注册”、“管理”等等;按照游戏或社区类程序的关卡或场景,可以拆分出不同的“场景模块”。

这些模块不是主程序运行必须的,只在需要的时候加载。

*运行时共享库(RSL)

主场景或者多个模块通用的资源,比如位图、声音、设计好的页面元素等,可作为“库”在主程序运行前加载。

可以整套更换的皮肤(skin)只需先加载一套。

  ApplicationDomain是存放AS3定义(包括类、方法、接口等)的容器。

使用Loader类加载swf时可以通过指定ApplicationDomain参数将swf加载到不同的域(Domain):

varloader:

Loader=newLoader();

varcontext:

LoaderContext=newLoaderContext();

/*加载到子域(模块)*/

context.applicationDomain=newApplicationDomain(ApplicationDomain.currentDomain);

/*加载到同域(共享库)*/

context.applicationDomain=ApplicationDomain.currentDomain;

/*加载到新域(独立运行的程序或模块)*/

context.applicationDomain=newApplicationDomain();

loader.load(newURLRequest("loaded.swf"),context);

  ApplicationDomain使用类似于显示列表(DisplayList)的树形结构。

相对于舞台(Stage),可以认为ApplicationDomain最根部的是系统域(systemdomain),包含FlashPlayer核心类定义。

主程序所在的域(以下简称主域)就是它唯一的子域,类似于Stage下的文档类(DocumentClass)。

  一个fla文档类里代码:

this.stage.addChild(mySprite);

this.addChild(myMC);

this.addChild(myShape);

  运行后的显示列表:

01.gif

  ApplicationDomain的类似结构:

02.gif

*加载到子域(模块)

类似于“继承”,子域可以直接获得父域所有的类定义,反之父域得不到子域的。

和继承关系不同的是,如果子域中有和父域同名的类,子域定义会被忽略而使用父域的定义。

*加载到同域(运行时共享库)

类似集合里的合并关系。

被加载swf里的所有类定义被合并到当前域中可以直接使用。

和加载到子域相同,和当前域同名的定义也会被忽略。

*加载到新域(独立运行的程序或模块)

swf载入指定域之前,先要检查该域及其父域中是否存在同名类,重复定义一概忽略。

如果加载别人写的程序,或者使用旧版本的主程序加载新版本的模块,为避免类名冲突就要加载到新域独立运行以使用自己的类。

  模块加载到同域不是一样可以吗?

为何要加载到子域呢?

好处就在于,卸载一个加载到子域的模块时,只要确保清除所有到该模块的引用,模块的所有类定义将被垃圾回收(GarbageCollection)。

  有两种方式可以访问ApplicationDomain:

*ApplicationDomain.currentDomain

currentDomain是ApplicationDomain的静态变量,表示当前代码所在的域。

该变量很奇特,在主程序里指向主域,在加载到子域的模块里则指向该模块所在的子域。

虽然ApplicationDomain有个parentDomain属性,但子域已经自动获得了父域的类定义,所以通过ApplicationDomain.currentDomain就可以获取父域定义了——包括主程序和加载到主域的共享库。

(注:

系统域不可直接访问,主域和所有新域即系统域子域的parentDomain属性为null)

*LoaderInfo类的applicationDomain属性

此方式可以访问任何方式加载的swf的ApplicationDomain。

对于主程序来说,加载到同域的库定义已经存在于ApplicationDomain.currentDomain,而模块的类主程序一般用不到。

所以这种方式个人不推荐使用。

  ApplicationDomain的hasDefinition()方法判断某定义是否存在,getDefinition()方法获取指定的定义。

下面以一个例子来介绍ApplicationDomain的具体用法和应用程序的拆分。

  本例有四个swf,shell.swf是主程序,lib.swf是共享库,login.swf和result.swf分别是“登录”和“结果”模块,所有的视图元件都在共享库中。

实际开发时可能有很多库,比如“位图库”、“音效库”、“模型通用库”等。

“通用库”里存放多个模块共用的资源,比如此例中的背景元素。

而各个模块独有的资源还是放在各自的swf中。

  主程序首先将共享库加载到同域,完成后将“登录模块”加载到子域。

主程序可以像操作普通的视觉对象(DisplayObject)一样操作加载的模块:

监听事件、调用方法。

因为编译器不会识别未定义的类,为使用强类型,建议为主类和模型定义相应的接口,使用少量的重复代码协助编程。

privatefunctionshowModule(p_module:

IModule):

void

{

if(this.m_moduleList[0]=="login.swf")

{

p_module.show(this);

p_module.addEventListener("login",this.onLogin);

}else

{

p_module.show(this,this.m_userName);

}

}

  模块“继承”了主程序和共享库的所有类和资源,可以通过ApplicationDomain.currentDomain.getDefinition()来获取相应的类。

注意获取不存在的类会抛出一个ReferenceError。

protectedfunctiongetClass(p_name:

String):

Class

{

try

{

returnApplicationDomain.currentDomain.getDefinition(p_name)asClass;

}catch(p_e:

ReferenceError)

{

trace("定义"+p_name+"不存在");

returnnull;

}

returnnull;

}

  登录模块获取库中的界面元素,并在点击按钮后抛出事件。

Event类不允许带参数,必须使用继承Event的自定义事件抛出参数。

主程序可以把模块的自定义事件也编译进去(这样就增大了整个程序的文件尺寸),或者让监听模块事件的函数接受一个Objcet参数,以获取其动态属性。

privatefunctiononLogin(p_e:

Object):

void

{

this.m_userName=p_e.userName;

varlogin:

IModule=p_e.currentTarget;

login.removeEventListener("login",this.onLogin);

login.dispose();

this.loadSwf();

}

  主程序收到事件之后卸载注册模块,加载“结果模块”到子域,并将登录模块传出的”userName”参数传给结果模块。

publicfunctionshow(p_parent:

DisplayObjectContainer,...rest):

void

{

varlibClass:

Class=this.getClass("net.eidiot.appDomainDemo.Libaray");

if(libClass!

=null)this.initUi(libClass,rest);

}

overrideprotectedfunctioninitUi(p_libClass:

Class,p_rest:

Array=null):

void

{

this.addUi(this.getClass(p_libClass.BG_NAME),"结果");

varresultFunc:

Function=p_libClass.getResult;

varuserName:

String=p_rest[0];

this.addChild(resultFunc(userName));

}

  注意initUi()方法分别使用了共享库中Libaray类的静态属性BG_NAME和静态方法getResult()。

但是直接调用此静态方法会报错,可以先用resultFunc变量取出此方法。

详细内容请参考源代码。

gavinkin5552007-09-1810:

14发表评论

Flex2DataGrid的Change和Click事件

在CFLEX上看到一则小经验,就是关于DataGrid控件的方法。

如果你不想把DataGrid中的数据绑定到控件上的话,你还可以用触发事件的方式来处理。

你可以使用Click事件,也可以使用Change事件,它们基本上没有分别,不过不同的是Click事件用的是event.currentTarget,而Change则是event.target。

例如,现在我们有一个控件叫someControl,它有一个text属性,用来显示你在DataGrid中选中的信息。

如果用click事件,这么写DataGrid:

DataGridid="DG1"click="clickHandler(event)"/>

Script>

publicfunctionclickHandler(event:

MouseEvent):

void

{

someControl.text=event.currentTarge.selectedItem.someDataField;

}

Script>

如果用change事件,这么写DataGrid和脚本:

DataGridid="DG2"change="changeHandler(event)"/>

Script>

publicfunctionchangeHandler(event:

Event):

void

{

someControl.text=event.target.selectedItem.someDataField;

}

Script>

gavinkin5552007-09-1415:

25发表评论

Flex学习进阶-使用

ComboBox>和其他元件关联

首先在设计模式下拖拽出需要演示效果的FLEX组件其中包括ComboBox,Button,Panel,Label将其排列整齐,方便自己看就可以了,代码如下:

xmlversion="1.0"encoding="utf-8"?

>

Applicationxmlns:

mx="layout="absolute">

Paneltitle="ComboBox"width="402"height="188"x="90.5"y="79"layout="absolute">

ComboBoxid="myComboBox"width="171"x="10"y="10">

ComboBox>

Buttonid="myButton"label="Send"x="200"y="10"/>

Labelid="myText"maxWidth="20"width="244"height="23"y="60"x="10"/>

Panel>

Application>

下面为添加内容并且将其改变后的值与Label属性值进行绑定

为ComboBox添加内容

ComboBoxid="myComboBox"width="171"x="10"y="10">

dataProvider>

Array>

String>ComboBox1

String>

String>ComboBox2

String>

String>ComboBox3

String>

Array>

dataProvider>

ComboBox>

将两个进行连接:

Labelid="myText"maxWidth="20"width="244"height="23"y="60"x="10"text="{myComboBox.value}"/>

可以在这个时候发布一下看看效果。

因为下面会有一些其他效果要体现。

有人会问到我要取的值不是ComboBox1,ComboBox2,ComboBox3怎么办,当然有方法了,需要修改String为Object,再将其data属性为你想要取出的值,改变如下:

dataProvider>

Array>

Objectlabel="ComboBox1"data="1"/>

Objectlabel="ComboBox2"data="2"/>

Objectlabel="ComboBox3"data="3"/>

Array>

dataProvider>

再次发布看看这次取的是不是data的值呀。

呦,我们的按钮还没有用上呢,你发现了没有,这回要用上代码了ActionScript3.0哦。

给大家秀一下:

xmlversion="1.0"encoding="utf-8"?

>

Applicationxmlns:

mx="layout="absolute">

Script>

[CDATA[

importflash.events.MouseEvent;

publicfunctionshow(event:

MouseEvent):

void{

myText.text=String(myComboBox.value);

}

]]>

Script>

Paneltitle="ComboBox"width="402"height="188"x="90.5"y="79"layout="absolute">

ComboBoxid="myComboBox"width="171"x="10"y="10">

dataProvider>

Array>

Objectlabel="ComboBox1"data="1"/>

Objectlabel="ComboBox2"data="2"/>

Objectlabel="ComboBox3"data="3"/>

Array>

dataProvider>

ComboBox>

Buttonid="myButton"label="Send"x="200"y="10"click="show(event);"/>

Labelid="myText"maxWidth="20"width="244"height="23"y="60"x="10"/>

Panel>

Application>

gavinkin5552007-09-1015:

31发表评论

解决Flex从URL里获取参数的问题

最近开始使用Flex进行开发。

需要从URL中获取参数,查了好些网页也没有找到适用的方法。

但最中还是找到了解决方法,现写出来,与大家分享,节省查阅的时间。

对于FLex使用参数就两个地方(我是个菜鸟,目前就知道两个),一个是mx:

Script里,另一个就是组件(如Label或TextInput等)。

有如下格式URL:

a.swfname=1&pass=2;在组件中使用只要定义好一个变量,然后直接使用{name}就可以了,而对于mx:

Script里则不行。

如下:

Applicationxmlns:

mx="creationComplete="initApplication()">

Script>

privatefunctioninitApplication():

void

{

trace(this.parameters.name+":

"+this.parameters.pass);

}

Script>

Labelid="path"width="100%"text="{name}"/>

Application>

gavinkin5552007-09-0520:

30发表评论

数组元素随机排序

发现flash中好像没有对数组元素进行随机排序的函数,就自己写了一个.虽然不是很科学,起码可以用...

--!

调用方法:

randomOrder(array)

函数会返回一个新数组,就是该数组随机排序后的结果

例子:

程序代码

varmyArray:

Array=["a","b","c","d"]

myArray=randomOrder(myArray)

程序代码

//随机改变数组的排序

functionrandomOrder(targetArray:

Array):

Array

{

vararrayLength:

Number=targetArray.length

//

//先创建一个正常顺序的数组

vartempArray1:

Array=[]

for(vari=0;i

{

tempArray1[i]=i

}

//

//再根据上一个数组创建一个随机乱序的数组

vartempArray2:

Array=[]

for(vari=0;i

{

//从正常顺序数组中随机抽出元素

tempArray2[i]=tempArray1.splice(Math.floor(Math.random()*tempArray1.length),1)

}

//

//最后创建一个临时数组存储根据上一个乱序的数组从targetArray中取得数据

vartempArray3:

Array=[]

for(vari=0;i

{

tempArray3[i]=targetArray[tempArray2[i]]

}

//

//返回最后得出的数组

returntempArray3

}

gavinkin5552007-09-0414:

03发表评论

Flex2.0数组的使用实例

Array

----------------------------------------------------------------

1.

Script>

[CDATA[

varmyArray:

Array=["AK","AL","AR"];

]]>

Script>

2.

Array>

String>AK

String>

String>AL

String>

String>AR

String>

Array>

3.

Script>

[CDATA[

varexpenses:

Array=[

{Month:

"January",Profit:

2000,Expenses:

1500,Amount:

450},

{Month:

"February",Profit:

1000,Expenses:

200,Amount:

600},

{Month:

"March",Profit:

1500,Expenses:

500,Amount:

300},

{Month:

"April",Profit:

500,Expenses:

300,Amount:

500},

{Month:

"May",Profit:

1000,Expenses:

450,Amount:

250},

{Month:

"June",Profit:

2000,Expenses:

500,Amount:

700}

];

]]>

Script>

-----------------------------------------------------------------------

----------------------------------------------------------------------

//UseArrayconstructor.

varmyArray:

Array=newArray();

myArray.push("one");

myArray.push("two");

myArray.push("three");

trace(myArray);//output:

one,two,three

//UseArrayliteral.

varmyArray:

Array=["one","two","three"];

trace(myArray);//output:

one,two,three

----------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1