flex 学习.docx

上传人:b****8 文档编号:30509563 上传时间:2023-08-16 格式:DOCX 页数:24 大小:30.80KB
下载 相关 举报
flex 学习.docx_第1页
第1页 / 共24页
flex 学习.docx_第2页
第2页 / 共24页
flex 学习.docx_第3页
第3页 / 共24页
flex 学习.docx_第4页
第4页 / 共24页
flex 学习.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

flex 学习.docx

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

flex 学习.docx

flex学习

1、避免容器的深层嵌套(因为每个容器都会对其子容器进行计算和调整,一般建议HBox,VBox最好不要超过3层,但对于复杂系统这个很难避免)

2、对于容器和空间的位置和尺寸尽量采用绝对坐标和硬编码。

(减少FlashPlayer深层次的嵌套计算)

3、合理恰当的使用Grid容器,对于能用普通容器如HBox,VBox实现的尽量不要采用Grid(Grid嵌套层次深)

4、避免使用重复、冗余的容器嵌套,如:

1)在Panel,Application中添加一层VBox,Panel,Application本来就是继承于VBox的,添加无谓的VBox只能降低你系统的性能。

2)对于自定义的容器减少重复多余的父容器,比如:

VBoxbackgroundColor="#FFCCCC"borderStyle="solid">

VBox>

你完全可以采用下面的写法,对于myComponents可能它本身就是VBox

5、延迟实例化导航类容器(DeferredInstantiationNavigatorContainers)

如ViewStack,Accordion,TabNavigator等,本身就提供了延迟实例化的功能,你只需要修改其creationPolicy='auto'即可,它将只实例化第一个要显示的子控件,其余的将在需要的时候实例化。

6、对于flex的效果(Effects)要做到尽量平滑(Smoothly),比如延长它的持续时间(duration),避免使用bmp格式的图片作背景。

7、对于DataGrid的复杂ItemRenderer,尽量用Canvas而不是VBoxorHBox,这个和Flex1.5中是不同的。

8、如果DataGrid的ItemRenderer是ComboBox等,尽量用ItemEditor而不是ItemRenderer,只有当选中的cell才会显示其Renderer(避免一次性把所有的cellRenderer都画出来)

9、记得随时Remove没有用的Listener或采用弱引用,这个我在事件机制中提到过(URL...);null不用的变量和数组。

10、对于大批量的数据采用需要的时候去取或者分页

11、提前声明频繁使用的变量,如:

varl:

int=list.length;

varw:

int=stage.stageWidth;

for(vari:

int=0;i

list[i].x=w-100;

}

这样也能提高Flex的性能,可能很多人都会不屑,但至少对于Flex来讲它能减少不必要的计算,改善性能,我想这个编程习惯问题要改还真是不容易,至少我写了1年多直到最近才注意到这个问题。

12、另外和代码组织有关的建议,如:

1)系统性的常量写在一个常量类里头并用const关键字,一些ItemRenderer代码尽量独立成一个文件而不是直接到处都写

2)不要在界面元素中引用一大串的parent.parent.parent...,一旦界面重新组织将给你带来很大麻烦。

如果你用Cairngorm框架,那么就应该用ViewHelper,尽量的松耦合你的代码。

13、修改production-mode属性为true,2.01在文件flex-webtier-config.xml中。

它一般是产品发布的时候要设置的,你可以理解为c++的Release和Debug版本之间的差异。

网上到处流传着cairngormview部分的用法,如下

∙View部分

再来看看View中都有什么。

View中有ViewHelper和ViewLocator。

ViewLocator是一个单例类,用于统一管理和获取ViewHelper。

类似于ServiceLocator,和FrontController,在这里可以注册多个ViewHelper,并通过关键字直接找到需要的ViewHelper实例。

ViewHelper是具体用来操作某个视图的类,它是通过其成员变量view来引用到具体的视图,当它被实例化的时候就会在ViewLocator中注册一个ViewHelper

如:

ListViewHelper/>

将实例化一个ViewHelper,并在ViewLocator中注册一个名为listViewHelper的ViewHelper实例,通过该id可以得到其实例的引用,如:

varlistViewHelper:

ViewHelper=(ViewHelper)ViewLocator.getInstance().getViewHelper(”listViewHelper”)

其中

ListViewHelper/>甚是让我费解,通过测试,其用法如下

Mxml代码

1.xmlns:

viewhelper="com.adobe.cairngorm.view.*"   

2.

ViewHelper id="appMainFrame"/>  

xmlns:

viewhelper="com.adobe.cairngorm.view.*"

ViewHelperid="appMainFrame"/>

 

 页面上加入这两行代码,至于加在什么位置,写过mxml的人应该很清楚。

 

在command中获取这个页面

As代码

1.private var mainFrame:

ViewHelper = ViewLocator.getInstance().getViewHelper("appMainFrame");  

FLEX内存释放优化原则

1.被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉;

2.父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除;

3.如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null;

4.本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉;

5.除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失;

6.父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除;

7.如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除;

8.注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件jian听器都要记得移除干净。

9.父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。

内存泄露举例:

1.引用泄露:

对子对象的引用,外部对本对象或子对象的引用都需要置null;

2.系统类泄露:

使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用,否则使用此函数的对象将不会被删除;

类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。

3.效果泄露:

当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null;如果不停止掉动画直接把Effect置null将不能正常移除对象。

4.SWF泄露:

要完全删除一个SWF要调用它的unload()方法并且把对象置null;

5.图片泄露:

当Image对象使用完毕后要把source置null;(为测试);

6.声音、视频泄露:

当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null;

内存泄露解决方法:

1.在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(不管是VO还是组件的都需要删除),删除jian听器,调用系统类的清除方法)

先remove再置null,确保被remove或者removeAll后的对象在外部的引用全部释放干净;

2.利用Flex的性能优化工具Profile来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息;

总结:

关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。

以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。

避免表单重复提交:

出于一些原因,我们需要避免表单被多次重复提交,否则就会得到重复的记录。

这可能是由于粗心用户在提交表单之后又点击了“刷新”按钮,使数据再次提交。

更坏的情况是有人故意通过反复提交同一表单来攻击站点。

这样不仅会造成数据混乱问题,还会吞食宝贵的站点资源。

下面举例如何避免重复提交:

xmlversion="1.0"?

>

Applicationxmlns:

mx="initialize="init(event)">

  

Buttonid="btn1"label="Clickme"click="clickbtn(event)"/>

  

Script>

     

[CDATA[

        importmx.events.FlexEvent;

       importmx.controls.Alert;

       importflash.events.TimerEvent;

       importflash.utils.Timer;

       [Bindable]

       privatevartimer:

Timer      

       [Bindable]

       privatevarflag:

Boolean

       [Bindable]

       privatevarnum:

int

       privatefunctioninit(event:

FlexEvent):

void{

          num=0;

          flag=true;

          timer=newTimer(1000,1); //这里用Timer来设置按时间。

          timer.addEventListener("timer",timerCom);

       }

        privatefunctionclickbtn(event:

MouseEvent):

void{

             if(flag==true){

               txt.text=(++num).toString();

               flag=false;

               timer.start();

           }           

        }

        privatefunctiontimerCom(event:

TimerEvent):

void{

           flag=true;

        }

     ]]>

       

Script> 

       

Textid="txt">          

       

Text>

Application>

 

关于Flex及AS3的百多条小小知识

(一)

【改变输出swf的尺度,背景颜色或帧频】

在"Navigator"窗框里右键你的项目>选中"Properties">选中"ActionScriptCompiler">在"Additionalcompilerarguments"里输入你所需要的命令

如想改变背景颜色,请输入:

-default-background-color0xffffff

【鼠标坐标】

mouseXmouseY

【检查变量类型并返回布尔值】

Is

【检查变量类型并返回类型】

Typeof

【检查对象类型并返回该对象】

As

【是数字但不是有效数字问题】

varquantity:

Number=15-"rabbits";

trace(typeofquantity);//显示:

"number",但它是NaN(notanumber)

trace(quantityisNumber);//true

trace(quantity!

=NaN);//false

//使用isNaN()函数检测:

isNaN(quantity);//true

//检测变量是否内含有效数字:

!

isNaN(quantity);//false

【取消默认的严格编译模式】

在"Navigator"窗框里右键你的项目>选中"Properties">选中"ActionScriptCompiler">取消"Enabelcompile-timetypechecking"选项

【基元数据类型和复杂数据类型好比"值类型"和"引用类型"】

基元数据类型类似按值传递:

varintOne:

int=1;

varintTwo:

int=1;

trace(intOne==intTwo);//true

【复杂数据类型类似按引用传递】

vararrayOne:

Array=newArray("a","b");

vararrayTwo:

Array=arrayOne;

trace(arrayOne==arrayTwo);//true

//-----------------------------------

vararrayOne:

Array=newArray("a","b");

vararrayTwo:

Array=newArray("a","b");

trace(arrayOne==arrayTwo);//false

【优化逻辑AND(&&)和OR(||)的小知识】

对于逻辑And(&&):

除非条件表达式的前半部分为真,否则,ActionScript不会再去求算逻辑AND运算符的后半部.如果前半部为假,整个条件表达式一定为假,所以再去求算后半部就没效率了.

对于逻辑OR(||):

除非条件表达式前半部为假,否则,ActionScript不会再去求算逻辑OR运算符的后半部,如果前半部为真,整个条件表达式一定为真.

总结:

使用逻辑AND(&&)时,把结果最可能为false的表达式放到前面;使用逻辑OR(||)时,把结果最可能为true的表达式放到前面.

【Timer类注意事项】

不要认为Timer可以极其准确;使用Timer时间间隔不要低于10毫秒.

【private,protected,internal,public访问权限】

private:

只能在类本身内部访问,按惯例,命名私有成员时以下划线"_"开头;

protected:

可以由类本身或任何子类访问.但这是以实例为基础的.换言之,类实例可以访问自己的保护成员或者父类的保护成员,但不能访问相同类的其它实例的保护成员,按惯例,命名保护成员时以下划线"_"开头;

internal:

可以由类本身或者相同包内的任何类访问;

public:

可以在类内部访问,也可以由类实例访问,或者声明为static时,可以直接从类访问.

【一个函数具有未知个数的参数,用arguments对象或"...(rest)"符号访问它的参数】

注意:

使用"...(rest)"参数会使arguments对象不可用;

privatefuncitonaverage():

void{

trace(arguments.length);//输出参数的个数

//arguments的类型是:

object,但可以像访问数组一样去访问它

trace(arguments[1]);//输出第二个参数

}

privatefunctionaverage(...argu):

void{

trace(argu[1]);//输出第二个参数,argu参数名是自定义的.

}

【错误处理try,catch,finally】

privatefunctiontryError():

void{

try{

trace("测试开始-try");

throwError();

}catch(errObject:

Error){

trace("错误信息:

"+errObject.message);

trace("测试结束-catch");

return;

}finally{

trace("虽然catch里已经有return方法,但位于return方法后面的finally里的代码依然会被执行.其实无论return方法是在try里,还是catch里,finally里的代码始终会被执行");

}

trace("前面已经有return了,此处是不会再执行的.除非没有抛出错误,以使catch里的代码没有被执行");

}

privatefunctionthrowError():

void{

thrownewError("抛出错误");

}

【for...in与foreach...in的区别】

与for...in循环不同的是,foreach...in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引).

【命名包路径的小技巧】

使用相应于拥有者和相关项目的包名称会比较好.按惯例来讲,包名称的开头应该是逆向的网址名称.例如,如果ExampleCorp()写了一些ActionScript3.0类,就会把所有类放在com.examplecorp包内(或者com.examplecorp的子包内).如此一来,如果英国有另一家ExampleCorp(examplecorp.co.uk)也写了一些ActionScript3.0类,只要使用包uk.co.examplecorp,就可确保唯一性.

当类属于特定应用程序的一部分时,就应该放在该应用程序特定的子包内.例如,ExampleCorp可能有个应用程序名叫WidgetStore.如果WidgetStore应用程序使用一个名为ApplicationManager的类,则此类就应该放在com.examplecorp.widgetstore包内,或者位于该包的子包内.

按惯例来说,包名称的开头是小写字母.

【隐式的取出方法(getter)和设定方法(setter)】

publicfunctiongetcount():

uint{

return_count;

}

publicfunctionsetcount(value:

uint):

uint{

if(value<100){

_count=value;

}else{

throwError();

}

}

【确保类是绝不会有子类,使用final】

finalpublicclassExample{}

【super关键字的使用】

super();//父类的构造函数,只能在类实例构造函数内部使用

super.propertyName;//调用父类的属性,属性需要声明为public或protected

super.methodName();//调用父类的方法,方法需要声明为public或protected

【建立常数,使用关键字const而不是var】

staticpublicconstEXAMPLE:

String="example";

【检测播放器版本】

flash.system.Capabilities.version

对于8.5版以前的任何FlashPlayer版本,这种方法都不适用.

【判断客户端系统】

flash.system.Capabilities.os

【检测播放器类型】

flash.system.Capabilities.playerType

可能的值有:

"StandAlone",用于独立的FlashPlayer

"External",用于外部的FlashPlayer或处于测试模式下

"PlugIn",用于FlashPlayer浏览器插件

"ActiveX",用于MicrosoftInternetExplorer使用的FlashPlayerActiveX控件

【检测系统语言】

flash.system.Capabilities.language

【判断用户是否启用了IME(输入法编辑器)】

flash.system.IME.enabled

【检测屏幕的分辨率】

flash.system.Capabilities.screenResolutionX

flash.system.Capabilities.screenResolutionY

【把弹出窗口居中的算法】

X=(舞台宽/2)-(窗口宽/2)

Y=(舞台高/2)-(窗口高/2)

【控制影片配合Player的方式,包括缩放问题】

stage.scaleMode

可供选择值:

flash.display.StageScaleMode

【舞台的对齐方式】

stage.align

可供选择值:

flash.display.StageAlign

【隐藏FlashPlayer的右键菜单】

stage.showDefaultContextMenu=false;

【检测系统是否具有音频功能】

flash.system.Capabilities.hasAudio

【检测播放器是在具有MP3解码器的系统上运行,还是在没有MP3解码器的系统上运行】

flash.system.Capabilities.hasMP3

【检测播放器能(true)还是不能(false)播放流式视频】

flash.system.Capabilities.hasStreamingVideo

【检测播放器是在支持(true)嵌入视频的系统上运行,还是在不支持(false)嵌入视频的系统上运行】

flash.system.Capab

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

当前位置:首页 > 幼儿教育 > 少儿英语

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

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