as3.flex.air面试题

发布时间:

Flex3,ActionScript面试题集
1.as2as3.的最主要区别是什么?
答:首先,as2as3是完全不同的语言,几乎没有兼容性可言。as2编译用的AVM1虚拟机,as3用的AVM2,速度快,提供了一些基础异常处理。as3是纯的OOP,强类型语言。as2不是。具体的差别有太多太多。
2.flex的开发框架有哪些,它们有什么优缺点?
答:最常见的当然是CairngormPuremvc了,此外还有MateSwiz等等,据说被广泛应用的已经有10几款了。Cairngorm作为Adobe官方出品,有着贵族血统的它比较全面,是这些框架中已知bug最少的,但是基于他的应用相对臃肿复杂一些,需要对每个可以被触发的事件写一个对应的Command,编码量巨大,并且单元测试很不容易,不适合敏捷开发。Puremvc应该是现在用的最多的as框架了。比较完善、并且与Cairngorm相比,更适合中小型应用的开发,它与Cairngorm一样,也是以MVC模式为中心,并以Façade作为中央存储器的单件类的形式进行开发的。说下Mate,它是一个比较奇怪的框架,是基于标签的事件驱动型的。也就是说你不能再随意的写as类的,在使用Mate的情况下,只能用MXML来做这些事情。SwizMate的孪生兄弟,长的挺像,没具体用过,不大了解。
3.flex开发中,很多代码都写在mxml文件里,为了做到mvc模式,你是怎么处理的。我认为mxml并不影响mvc模式啊。分两种情况来讨论,首先,是自己创建整个应用结构的时候,那我们可以手动将UI所在的mxml归为一类,然后由Mediator去操作或者说控制这些组件既可了,然后Mediator又统一交给Controller去操作。如果采用其他框架来进行开发的话,那就更不用来考虑这个问题了,CairngormPuremvc之类的框架已经很好的为我们解决了这些问题。只要按照它们的使用规范来进行开发,自然没有问题。4.如果发生内存泄露,你是如何解决的?
profile观察中已经内存泄漏是没有很好的解决办法的,至少我不知道,我能做的只是尽量去避免这种情况的发生,比如说注意不要循环引用,特别是在使用Timer的时候要格外注意,不要忘记全局对象上的引用的清除,在创建控制器和模型的时候要注意一定要使用单件模式。在addEventListener时候尽量采用弱引用、自引用、或者子对象引用,以避免内存泄漏。
5as3.0垃圾回收器是如何工作的?
flashplayer8之前采用的是引用计数法,flashplayer8之后用的是标记法,简单的说就是:从应用的根节点开始,遍历所有其上的引用,标记每个它所发现的对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过程第归进行,直到Player遍历了应用的整个对象树并标记了它所发现的每个东西。在这个过程技术的时候,可以安全地认为,内存中那些没有被打标记的对象没有任何活动引用,因此可以被安全地释放内存。一般来说,flashplayer采用的是一种低频的垃圾回收机制,FlashPlayer的垃圾回收发生在FlashPlayer需要另外请求内存之前。但并不是每次应用申请内存时都会导致垃圾回收的执行,只有当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,一定程度上取决于客户端计算机的物理内存的大小。6flex和后台语言是如何交互的?
无疑就这两种方法:remoteobject或者是Httpservice7。你是如何处理前端速度慢的问题?
flex前端速度慢其实仔细说应该分2部分,1.flex生成的swf由于SDK庞大的关系,swf体积也跟着庞大了,这我们可以做的就是用Module动态加载,还有就RSL了。2.处理

速度慢,远程方法速度慢,这是AVM的硬伤了,基本没有很好的解决方法,我们能做的只是让这个异步进行的更完美一些,让用户在等待的过程中,做其他的事情,以至于让用户忽略这段等待的时间。
8.flashflex是如何协调开发的?
这个问题可以这样来理解,如果是确实需要用到FLEXSDK的应用,那我们就可以建立一flex工程,具体需要flashUI的时候,输出成swc作为flexskin,如果说并不需要flexsdk只是为了编码方便而选择flex的话,那我们只要建立一个as工程,flex作为flash的编码器。
9.使用FlexBulider3建立一下新的.mxml的页面时默认的背景是蓝色的,请问用什么办法能修改掉此背景颜色,以至于下次创建时背景不是为默认的蓝色的呢?写出你认为正确的方法.还真不会,我的做法一般是在这个工程里面,建一个总的css,都在里面规范起来,包括背景色啊,还有字体大小等等。
10.使用FlexBulider3如何跟踪程序?
装个debug版本的flashplayer,到时候在FB里面F11debug它咯。
11.请问enterFrametimerEvent2个事件有什么区别?请说下具体的使用方法和相关的使用场合?
不会我觉得差不多,不过我一般用enterFrame,还请高人指点。
12.请说下你理解AS3的事件机制是什么机制?你认为正确的就可以说出来.AS3事件流分三个阶段:
1.捕获阶段(即由根节点流向子节点,检测每个节点是否注册了监听器2.目标阶段(激发在目标对象本身注册的监听程序
3.冒泡阶段(从目标节点到根节点,检测每个节点是否注册了监听器
当中涉及了两个属性targetcurrentTarget,target是事件的派发者,currentTarget是正在检测的对象,当开始了事件,事件的currentTarget属性处于不断变化中.
PS:注册事件时捕获阶段默认是关闭的,无论事件是否开启了捕获,事件流只会两选一去执行注册的监听程序
关于EventDispatcher三个函数的参数:
1.addEventlistener(事件类型,监听函数,否打开捕获阶段,监听器优先级别,是否打开弱监听2.removeEventListener(事件类型,监听函数,是否打开捕获阶段(前两个参数是必须的,如果注册监听器时打开了捕获阶段,那么第三个参数也是必须的,否则会出现错误3.dispatchEvent(newEvent(事件类型,是否冒泡,是否可以取消事件关于Event扩展有两点要注意:
1.可以定义字符串常量代表事件类型.
2.构造函数必须调用父类的构造函数,super(type,bubbles,cancelable3.扩展Event可以使Event带自定义变,从而可以传递数据.
13.请问addEventListener里面有几个参数,你能说出具体的使用方法嘛?
这题出的有点像考API记忆力呵呵,它的五个参数分别是addEventlistener(事件类型,监听函数,是否打开捕获阶段,监听器优先级别,是否打开弱监听具体使用方法:详见手册,这里我copy来了。addEventListener(方法
publicfunctionaddEventListener(type:String,listener:Function,useCapture:Boolean=false,priority:int=0,useWeakReference:Boolean=false:void语言版本:ActionScript3.0

RuntimeVersions:AIR1.0,FlashPlayer9
使用EventDispatcher对象注册事件侦听器对象,以使侦听器能够接收事件通知。可以为特定类型的事件、阶段和优先级在显示列表的所有节点上注册事件侦听器。
成功注册一个事件侦听器后,无法通过额外调用addEventListener(来更改其优先级。要更改侦听器的优先级,必须首先调用removeListener(。然后,可以使用新的优先级再次注册该侦听器。
typeuseCaptureaddEventListener(,则会创建单独的侦听器注册。例如,如果首先注册useCapture设置为true的侦听器,则该侦听器只在捕获阶段进行侦听。如果使用同一个侦听器对象再次调用addEventListener(,并将useCapture设置为false,那么便会拥有两个单独的侦听器:一个在捕获阶段进行侦听,另一个在目标和冒泡阶段进行侦听。
不能只为目标阶段或冒泡阶段注册事件侦听器。这些阶段在注册期间是成对出现的,因为冒泡阶段只适用于目标节点的始祖。
如果不再需要某个事件侦听器,可调用removeEventListener(删除它,否则会产生内存问题。由于垃圾回收器不会删除仍包含引用的对象,因此不会从内存中自动删除使用已注册事件侦听器的对象。
复制EventDispatcher实例时并不复制其中附加的事件侦听器。(如果新近创建的节点需要一个事件侦听器,必须在创建该节点后附加该侦听器。但是,如果移动EventDispatcher例,则其中附加的事件侦听器也会随之移动。
如果在正在处理事件的节点上注册事件侦听器,则不会在当前阶段触发事件侦听器,但会在事件流的稍后阶段触发,如冒泡阶段。
如果从正在处理事件的节点中删除事件侦听器,则该事件侦听器仍由当前操作触发。删除事件侦听器后,决不会再次调用该事件侦听器(除非再次注册以备将来处理)参数
type:String事件的类型。
listener:Function处理事件的侦听器函数。此函数必须接受Event对象作为其唯一的参数,并且不能返回任何结果,如下面的示例所示:function(evt:Event:void函数可以有任何名称。
useCapture:Boolean(default=false确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。如果将useCapture设置为true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果useCapturefalse则侦听器只在目标或冒泡阶段处理事件。要在所有三个阶段都侦听事件,请调用addEventListener两次:一次将useCapture设置为true一次将useCapture设置为false.
priority:int(default=0事件侦听器的优先级。优先级由一个带符号的32位整数指定。数字越大,优先级越高。优先级为n的所有侦听器会在优先级为n-1的侦听器之前得到处理。如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为0
useWeakReference:Boolean(default=false确定对侦听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的侦听器被当作垃圾回收。弱引用则没有此作用。

类级别成员函数不属于垃圾回收的对象,因此可以对类级别成员函数将useWeakReference设置为true而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将useWeakReference设置为true,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。
14.请问我想判断一个字体是否是数字,用什么办法去判断呢?这问题问的有点奇怪。字体怎么可能是数字。。如果是问,类型是否为数字,那就typeof一下,看他是不是int或者Number,如果是问字符串内容是否为数字,那也有很多办法,比如说,读出每个字符的ascii码,判断范围,或者是vara:String=”1232d4″;varb:Number=Number(a;varc:String=String(b;if(a==c{
Alert.show(“yes”;}else{
Alert.show(“no”;}
15.请问我想判断一个字符或者一个对象的类型怎么判断呢?应该没人出这样的题吧?if咯。类型的话就typeof
ActionScript3.0面试题
1.as2as3的有哪些区别?5个特征)2.flashplayer10.1有哪些新特征?
3.Adobeflash平台可以开发胖客户端程序?说说你的了解。4.Adobeflash家族还有哪些产品?怎么做选择。
5.Flash可以直接去读数据库数据吗?如果要实现有哪些方法?
6.你认为flash这个技术怎样?它可以做哪方面的事情?(从功能和行业说)7.Flash目前最大的问题是什么?
8.请列举一下,你认为不错的网站或者blog.9.请列举一下你知道的影响性能的几个因素?10.Flash可以实现cookies功能吗?用什么方法?11.代码vara=true;trace(a?”a”:”b”;输出什么?a
12.代码varf:Function;trace((f=function({return10},f(/2;输出什么?5
13.请问你知道loader,URLLoader,URLStream这个三种动态加载资源的具体使用场合,以及有什么区别嘛?
14.请问我现在有一个正方形的图片,我想把他做成圆形,有什么办法呢?前提是用flex或者as3
15.Flash可以实现套接字通信吗?
16.varletters:Array=["a","b","c"];我想在这个数组里搜索„b‟字符,请问怎么办?

for(vari:number=0;i<=letters.length;i++{
if(letters==‟b'{
trace(i;}}
17.怎么样转换数组为字符串,怎么样将字符串转化为数组?18.怎样判断一个值,是string还是int?varmySprite:String=newString(“1″;trace(mySpriteasString;trace(mySpriteasint;
19.请问enterFrametimerEvent2个事件有什么区别?请说下具体的使用方法和相关的使用场合?
20.我现在给你100万做一个flex项目,你认为成功的要素在哪呢?
SD-Java&FlexJava&Flex高级开发工程师面试题
如果克服FLEX的缺点如何动态变换皮肤
FLEX与后台交互的方法FLEXJS的交互方法项目中所使用到的框架
官方框架与PUREMVC有何区别PUREMVC框架的机制
FlexAS面试题
第一部分:AS3Flex基础
1AS3语言中,Array里面是不是可以放不同类型?2,创建常量知道怎么创建嘛?
3,请说出用privateinternalprotectedstaticfinalpublic关键字修饰的对象的访问权限以及子对象的继承权限?
4,请说出uintintnumber的区别,我想判断一个对象是不是String类型或者是int类型如何做?
5如何返回一个对象的类型,undefinednull是否一样,如果不一样能否说出其中的区别?

6,如何判断一个字符串s是不是数字?
7parseInt此方法转化为int型的方法,你知道此方法的第二个参数是什么意思嘛?8,将一个number型的数值n如何转换成int型和String?9,如何清空一个数组?
10,写一个函数delArray(start:int,sum:int:Array.start表示删除开始的位置,sum表示删除的个数,返回一个新数组。
12Math.round(Math.floor(Math.ceil(三个方法都是四舍五入,有什么区别?
13,写一个函数给一个数组倒序排列,不使用数组自带的reverse方法。能不能只用一次遍?
14,有一个字符串s=‟12,12,34,13,56,76′;能不能以‟,'为分隔符将它转换成一个数组?
15,自己写一个方法实现以固定符号为分割的将字符换转换成数组的功能,也就是将第14题目的功能自己实现。
16,用最快速的方式给一个数值型数组按大小排序。17,如何在数组里面查找元素?
18,请说下你理解AS3的事件机制是什么机制?
19addEventListener里面有几个参数,分别是什么意思?20,用AS3如何自定义一个事件?
21,不用AS3代码方式能不能自定义一个事件?
22addItemAt(Item:*,index:int。并说明一下*是什么意思。23,写一个方法去除数组中的重复记录并返回新的数组。
24Flex的项目运行时如何修改背景颜色?Flex3如何修改,Flex4如何修改?25,使用FlexBulider如何跟踪程序?
26,请问Flexbulider3可以创建几种不同的项目?FlexBuilder4可以创建几种不同的项目?27,什么是RSL,如何使用?
28,如何使应用去掉水平滚动条而显示垂直滚动条?29,我想创建的视图居中怎么办?
30,如何把MouseEventlocalXlocalY属性转化成全局坐标?31,我怎么设置把一个文本框(textInput,设置成一个密码框?32,我想让一个button鼠标移动上去变成手型,需要怎么设置?33Flex4VGroup的垂直间距如何设置?
34Alert如何添加一张图片,如何设置背景图片?
35Alert确定和取消按钮我想让他显示为同意拒绝;如何做?36ArrayCollectionArray在使用上有什么区别?37DataGrid能不能用自带的方法改变行颜色?38,导航器组件都有什么?
39TitleWindow的组件是可以拖动的,我不想让他拖动我要怎么办呢?40Embed绑定图片有什么缺点?
41,我自己定义了一个组件,我想在组件里的属性里设置几个默认值,我要怎么设置呢?42,列举出flex里面的几个绑定数据对象的方式。43DataGridList组件如何设置可以多选?44tree控件中如何使用图片?
45,我想设置TabNavigator在运行时加载子页面如何设置?
46Image组件能加载baidu上面的图片吗?或者网络上面的图片,如何加载?

47Image组件如何设置不等比例缩放?
48,如何给下拉列表框增加一个默认首选项?比如:请点击选择49Flex中有线程的概念吗?如果我想实现线程怎么做?
50enterFrametimerEvent2个事件有什么区别?请说下具体的使用方法和相关的使用场合?
第二部分,程序题目请编写代码Flex实现功能。
51,写一个DataGrid绑定ArrayCollection数据的例子。要求每隔一秒钟,数据刷新一次。52,在1的基础上,去掉刷新实现选中多行删除。
53,在2的基础上实现选中多行移动到另外一个DataGrid,并且原来的DataGrid将选中的移除。
541的基础之上,AdvanceDataGriid实现一个每隔一秒钟刷新数据的例子,并且设置不同的2中行字体风格,比如红色和绿色字体。
55,用Flex4写一个只有加法功能的计算器,不要求和计算其界面一样,只要有2个输入数值一个计算按钮和一个显示结果的文本框即可。
56Flex4调用远程的xml数据并显示在tree控件中。
57,在6的基础之上过滤远程的xml数据,并显示在tree上。58,在DataGrid中放入图片和button
59,一个button本身有一张背景图片,实现鼠标移动上去换一张背景图片,鼠标移开恢复原来的图片。
60FlexColumnChartxField?:http://zhidao.baidu.com/question/254612141.html?an=0&si=761,将ArrayCollection转换成xml并弹出转换结果。
62Flex过滤ArrayCollection的数据,并且将符合条件的数据显示在下拉列表里面,过滤掉的显示在另一个下拉列表里面。
63,给一个Alert弹出框实现zoom弹出效果。
64,判断输入的一个数值是不是素数,如果是弹出,否则弹出65,输入一个数值,然后求出它的阶乘。
66,编写一个调用远程图片的例子。一个文本输入框,一个确定按钮,一张图片,输入远程的地址,点击按钮图片内容显示远程的图片。68,编写一个小例子,实现label文字点击变色。
69,自定义实现一个加载进度条。越漂亮越美观越好。
70,完成一个图片浏览的例子,自己设计界面,自己完成功能,遇到问题可以交流。要能读xml文件,展示图片,界面风格随意,界面效果随意。越漂亮越好,越美观越好。
第三部分,高级题目逻辑加操作
给定足够的5角,3角,1角,9分,2分,1分这六种零钱,1(100换成零钱,一共有多少种换法?用程序实现,并显示出所有的结果。要求能输入要转换的零钱,以固定分隔符”,”分隔开不同的零钱。

Flex面试题
1.使用FlexBulider3建立一下新的.mxml的页面时默认的背景是蓝色的,请问用什么办法能修改掉此背景颜色,以至于下次创建时背景不是为默认的蓝色的呢?请写出你认为正确的方法。答:修改sdk\frameworks\projects\framework\default.cssApplicationbackgroundColor:#0000FF;
2.使用FlexBulider3如何跟踪程序?
答:我知道的三种1.trace(2.设置断点3.当不在调试模式时可以调用asAlert.show(jsalert(如:navigateToURL(newURLRequest(“javascript:alert(traceMsg”,“_self”;
3.请问enterFrametimerEvent2个事件有什么区别?请说下具体的使用方法和相关的使用场合?
答:enterFrame是按帧发生,timeEvent是根据设置的Timer类参数发生。如:ENTER_FRAME控制小球圆周运动:
addEventListener(Event.ENTER_FRAME,ballMove;TIMER控制小球圆周运动:
varmyTimer:Timer=newTimer(83.3,0;//关于该数的设置见TIMER类的说明myTimer.start(;
myTimer.addEventListener(TimerEvent.TIMER,ballMove;
4.请说下你理解AS3的事件机制是什么机制?你认为正确的就可以说出来.
答:建立一个完整的事件机制需要四个步骤:注册侦听、分发事件、侦听事件、移除侦听。建立成功后,触发事件,事件流会进行捕获、目标和冒泡三个阶段。捕获阶段由FP沿显示列表从根容器往下层层寻找触发事件的目标对象,找到后即进入目标阶段。然后,事件对象从目标对象再次沿显示列表往上移动至根容器,遇到注册侦听的节点就调用侦听函数。如果想中途中断冒泡,可以使用stopPropagation
5.请问addEventListener里面有几个参数,你能说出具体的使用方法嘛?答:addEventListener(type:String,事件的类型listener:Function,监听函数
useCapture:Boolean=false,是否打开捕获功能priority:int=0,监听器优先级别
useWeakReference:Boolean=false是否使用弱引用
6.请问我想判断一个字体是否是数字,用什么办法去判断呢?答:isNaN(parseInt(strParastrParaisNumber
7.请问我想判断一个字符或者一个对象的类型怎么判断呢?答:typeof(obj

8.请问你了解internal控制符么?能说下具体使用方法和场合嘛?
答:internal是默认的包内访问,体现了封装思想和package模块化思想。举例来说,A类需要使用B类和C类的方法和属性,但又不希望它们对其他类暴露,只要将A,B,C放入同一包内,包外的其他类就无法使用BC类了。
9.我想在某一点不去执行任何内容,也就是说我想停止执行了,你知道要怎么做嘛?答:设置断点
10.请问undefinednull是否一样,如果不一样能否说出其中的区别呢?
答:undefined是尚未初始化的无类型变量或未初始化的动态对象属性的特殊值。null是一个可以分配给变量的或由未提供数据的函数返回的特殊值。它们的相同之处在于都未初始化,不同在于undefined是无类型或动态类型的。如:varv1;trace(v1;//undefinedvarv2:*;trace(v2;//undefinedvarv3:Object;trace(v3;//null
11.创建常量知道怎么创建嘛?说下你是怎么创建的.
答:constPI:Number=3.1415926;publicstaticconstSTARTUP:String=“startup”;
12.请问用什么方法自定义一个事件呢?说下具体的方式.答:(1扩展Event类或其子类
(2定义一个staticconst常量作为事件的type传入构造函数
(3定义一个私有变量作为事件的Data保存数据,并为其添加gettersetter(4覆盖toString(clone(方法
13.请问怎么样检测本机的内容呢,比如说,我想知道本机的操作系统,是否有视频等这些.答:flash.system.Capabilities.os当前的操作系统
flash.system.Capabilities.hasStreamingVideo系统是否可以播放视频流
14.请问用什么办法解决安全域的问题?如果你不知道安全域的问题的话,可以在本机中绑定一下图片,然后再放到服务器上,就会出现此问题了.
答:配置安全沙箱的策略文件crossdomain.xml放置到服务器根目录,如:
15.有三种基本数字类型:number,int,uint请问有什么区别.具体说一下.答:number数字类型包含浮点型(0;int整型(0;uint(无符号整型
16.parseInt此方法转化为int型的方法,请问你知道此方法的第二个参数是什么意思嘛?答:指定第一个参数字符串的进制,范围为2-36。例如parseInt(“100”,2=4
17.Math.round(Math.floor(Math.ceil(三个方法都是四舍五入,请问有什么区别?

答:round是取最接近的整数,即原数+0.5后取整;floor向下取整;ceil向上取整
18.请问一个数组里可以放不同的类型嘛?
答:可以,如varx:Array=['a',1,newButton(];
19.varletters:Array=["a","b","c"];我想在这个数组里搜索„c‟字符,请问怎么办?答:for(vari:*inletters
if(letters[i]==„c‟trace(“c‟spositionis”+i;if(letters.toString(.indexOf(„c‟>0
trace(“c‟spositionis”+letters.toString(.indexOf(„c‟;
20.怎么样转换数组为字符串,怎么样将字符串转化为数组?
答:数组->字符串:trace(newArray(„a‟,'b‟,'c‟.join(“”.toString(;字符串->数组:vararr:Array=newString(“a,b,c”.split(„,‟;
21.我想创建的视图居中怎么办?
答:布局策略里面限定为居中,即horizontalAlign=”center”verticalAlign=”middle”;或者在每个控件都以舞台的中心作为相对坐标来计算各自的xy值。
22.请问知道层级的概念嘛?如果知道请问怎么样交换2个组件的层级呢?
答:层级表示的是显示对象在显示列表中的位置,从第0层开始,位于最下面。交换组件层级可以使用id交换,也可以直接交换层级索引。如:my_sprite.swapChildren(my_ball2,my_ball1;my_sprite.swapChildrenAt(2,1;
23.请问你知道loader,URLLoader,URLStream这个三种动态加载资源的具体使用场合,以及有什么区别嘛?
答:(1Loader2.0MovieCliploadMovie功能,用于加载外部的图片和SWF文件。使用load(方法来启动加载。被加载的显示对象将作为Loader对象的子级添加。在使用Loader加载数据,添加侦听事件时,一定要给LoadercontentLoaderInfo属性增加事件,而不是给Loader对象增加事件。
(2URLLoader类以文本、二进制数据或URL编码变量值对的形式先从URL下载数据,然后才将数据用于ActionScript它会发出有关下载进度的通知,通过bytesLoadedbytesTotal属性以及已调度的事件,可以监视下载进度。
(3URLStream类提供对下载URL的低级访问。数据一下载,便可随即为应用程序使用,这和使用URLLoader需要等到整个文件下载完不同。并且URLStream类还允许在完成下载前关闭流。已下载文件的内容将作为原始二进制数据提供。
(4URLStreamURLLoaderLoader等读取外部数据的类,类里的load方法参数值是URLRequest对象。如:
varrequest:URLRequest=newURLRequest(“httpURL地址”;loader.load(request;
24.如何把MouseEventlocalXlocalY属性转化成全局坐标?答:全局坐标系:stageX,stageY。原点位于舞台左上角。

本地坐标系:localX,localY。原点位于相对组件的左上角。
内容坐标系:contentMouseXcontentMouseY。描述鼠标相对于整个容器内容的位置,用于当子组件的高或宽可能超出容器自身设置高宽的情况。转换方法:
contentToGlobal内容到全局坐标contentToLocal内容到本地坐标globalToContent全局到内容坐标globalToLocal全局到本地坐标localToContent本地到内容坐标localToGlobal本地到全局坐标
25.请问我现在有一个正方形的图片,我想把他做成圆形,有什么办法呢?前提是用flex或者as3答:不清楚,是不是用BitMapDatadraw方法实现呢?会的朋友请告诉我。
26.请问新创建的一个sprite能否被直接加到ui容器里?如果不能请说出用什么办法能加入.答:不能。先将sprite加入一个扩展自UIComponent的类,再加入UI容器。
27.我怎么设置把一个文本框,设置成一个密码框?答:将displayAsPassword属性设置为true
28.我想在文本框里只能输入abcd,有什么办法能做到呢?如果我想输入除abcd以外的其它都能输入又怎么做呢?
答:restrict=”a-drestrict=”^(a-d”
29.请问condenseWhite这个属性在TextInput里是表示什么意思?
答:仅会应用于通过htmlText属性设置的文本,默认为false。当设置为true时,会删除文本中额外的换行和空白。
30.我现在刚创建的文件的textthisisatext,我想设置光标在is,请问怎么设置?答:触发事件,在侦听函数上让selectionBeginIndex=5,selectionEndIndex=6
31.请问怎么样在文本框里添加超链接?
答:(1使用文本框的htmlText属性添加必须以”event:”开头的超链接,如这儿
(2添加对TextEvent.LINK事件类型的侦听,如addEventListener(TextEvent.LINK,clickLink;(3”event:”后面的字符串将被包含在侦听事件的text属性里,如privatefunctionclickLink(event:TextEvent:void{
varcmdArray:Array=event.text.split(“|”;if(cmdArray[0]==”geturl”
navigateToURL(newURLRequest(cmdArray[1],cmdArray[2];}
32.我想获取系统里的字体,请问怎么办?答:importflash.text.Font;

varallFonts:Array=Font.enumerateFonts(true;
allFonts.sortOn(“fontName”,Array.CASEINSENSITIVE;varfontsLength:int=allFonts.length;for(vari:int=0;i
trace(":"+allFonts[i].fontName+":"+allFonts[i].fontStyle+":"+allFonts[i].fontType
33.substring(substr(,slice(,请说下3种解析字符串的不同之处,以及适用场合?答:substring(v1,v2:截取从v1v2的字符串,包括v1,不包括v2substr(v1,v2:v1开始,截取v2长度
slice(v1,v2:类似于substring,不过可以接受负值参数,表示倒数第几位
34.varfruits:XML=AppleOrangePear
Watermelon;
以下有一个字符串,我现在知道了colororange,我想知道此color相对应的name节点的值,我应该怎么做?
答:原题的XML不规范。找到name节点值可以用fruits.fruits(@color==‟orange‟.name
35.请说下目前使用flex和后台交互的几种方法,以及适用场合.
答:(1基于AMF消息格式的RemoteObject组件,如Lcds/BlazeDsAMFPHP等。(2基于SOAP消息格式的WebService,对于使用SOAP的服务器方便连接。(3基于纯文本或拥有良好格式的XML消息格式的HTTPService组件。一般来说,选用高效稳定的RemoteObject中间件。36.我现在想在flex里调用JS方法,我要怎么办呢?
答:直接在AS中使用ExternalInterface.call(来调用JS方法。如:importflash.external.ExternalInterface;ExternalInterface.call("simpleJSFunction";
ExternalInterface.call("simpleJSFunctionWithParameters","myParameter";varresult:String=ExternalInterface.call("simpleJSFunctionWithReturn";
37.我想用JavaScript调用ActionScript函数,我要怎么办呢?
答:使用ExternalInterface.addCallbackJavaScript里设置对Flex的回调方法并且在JavaScript里调用ActionScript方法。AS:
ExternalInterface.addCallback("function1",callback1;privatefunctioncallback1(:void{
Alert.show("callback1executed";}JS:

container[swf].function1(;
38.FileReference请说下此对象的几个相关事件
答:browse(typeFilter:Array=null:Boolean显示一个文件浏览对话框,让用户选择要上载的文件。
cancel(:void取消正在对该FileReference对象执行的任何上载或下载操作。download(request:URLRequest,defaultFileName:String=null:void打开对话框,以允许用户从远程服务器下载文件.
upload(request:URLRequest,uploadDataFieldName:String="Filedata",testUpload:Boolean=false:void开始将用户选择的文件上载到远程服务器。
1.as2as3的最主要区别是什么?
答:首先,as2as3是完全不同的语言,几乎没有兼容性可言。as2编译用的AVM1虚拟机,as3用的AVM2,速度快,提供了一些基础异常处理。as3是纯的OOP,强类型语言。as2不是。具体的差别有太多太多。
2.flex的开发框架有哪些,它们有什么优缺点?
答:最常见的当然是CairngormPuremvc了,此外还有MateSwiz等等,据说被广泛应用的已经有10几款了。Cairngorm作为Adobe官方出品,有着贵族血统的它比较全面,是这些框架中已知bug最少的,但是基于他的应用相对臃肿复杂一些,需要对每个可以被触发的事件写一个对应的Command,编码量巨大,并且单元测试很不容易,不适合敏捷开发。Puremvc应该是现在用的最多的as框架了。比较完善、并且与Cairngorm相比,更适合中小型应用的开发,它与Cairngorm一样,也是以MVC模式为中心,并以Façade作为中央存储器的单件类的形式进行开发的。说下Mate,它是一个比较奇怪的框架,是基于标签的事件驱动型的。也就是说你不能再随意的写as类的,在使用Mate的情况下,只能用MXML做这些事情。SwizMate的孪生兄弟,长的挺像,没具体用过,不大了解。
3.flex开发中,很多代码都写在mxml文件里,为了做到mvc模式,你是怎么处理的。答:我认为mxml并不影响mvc模式啊。分两种情况来讨论,首先,是自己创建整个应用结构的时候,那我们可以手动将UI所在的mxml归为一类,然后由Mediator去操作或者说控制这些组件既可了,然后Mediator又统一交给Controller去操作。如果采用其他框架来进行开发的话,那就更不用来考虑这个问题了,像CairngormPuremvc之类的框架已经很好的为我们解决了这些问题。只要按照它们的使用规范来进行开发,自然没有问题。
4.如果发生内存泄露,你是如何解决的?
答:在profile观察中已经内存泄漏是没有很好的解决办法的,至少我不知道,我能做的只是尽量去避免这种情况的发生,比如说注意不要循环引用,特别是在使用Timer的时候要格外注意,不要忘记全局对象上的引用的清除,在创建控制器和模型的时候要注意一定要使用单件模式。在addEventListener时候尽量采用弱引用、自引用、或者子对象引用,以避免内存泄漏。
5.as3.0垃圾回收器是如何工作的?
答:flashplayer8之前采用的是引用计数法,在flashplayer8之后用的是标记法,简单的说就是:从应用的根节点开始,遍历所有其上的引用,标记每个它所发现的对象。然后迭代遍

历每个被标记的对象,标记它们的子对象。这个过程递归进行,直到Player遍历了应用的整个对象树并标记了它所发现的每个东西。在这个过程进行的时候,可以安全地认为,内存中那些没有被打标记的对象没有任何活动引用,因此可以被安全地释放内存。一般来说,flashplayer采用的是一种低频的垃圾回收机制,FlashPlayer的垃圾回收发生在FlashPlayer需要另外请求内存之前。但并不是每次应用申请内存时都会导致垃圾回收的执行,只有当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,一定程度上取决于客户端计算机的物理内存的大小。
6flex和后台语言是如何交互的?答:见第35题。
7.你是如何处理前端速度慢的问题?答:flex前端速度慢其实仔细说应该分2部分,1.flex生成的swf由于SDK庞大的关系,swf体积也跟着庞大了,这我们可以做的就是用Module动态加载,还有就是RSL了。2.理速度慢,远程方法速度慢,这是AVM的硬伤了,基本没有很好的解决方法,我们能做的只是让这个异步进行的更完美一些,让用户在等待的过程中,做其他的事情,以至于让用户忽略这段等待的时间。
8.flashflex是如何协调开发的?
答:这个问题可以这样来理解,如果是确实需要用到FLEXSDK的应用,那我们就可以建立一个flex工程,具体需要flashUI的时候,输出成swc作为flexskin,如果说并不需要flexsdk,只是为了编码方便而选择flex的话,那我们只要建立一个as工程,让flexflash的编码器。组件
1.我不想在容器里显示滚动条怎么办?
答:指定horizontalScrollPolicyverticalScrollPolicyoff
2.请问Flexbulider3可以创建几种不同的项目?
答:三种。FlexProjectASProjectFlexLibraryProject
3.你了解RSL?请说明下RSL的使用方法,以及使用RSL为了解决什么问题?
答:RSL(Runtimesharedlibraries即动态链接库,在程序运行时由FlashPlayer动态加载。静态链接库是SWC文件,通过编译器的library-pathinclude-libraries编译进应用程序。采用静态链接的应用程序SWF会产生比较大的文件以及更长的下载时间。使用RSL的应用程序载入时间短且文件比较小,而且提高了内存使用效率,只是在开始需要花点时间下载RSLRSL的强大体现在多个应用程序共享公共代码时,因为RSL只需要被下载一次,多个应用程序动态链接到相同的RSL,访问其中已经缓存在客户端的资源。使用RSL
(1.在项目文件夹中点右建,选择"properties"-"FlexBuildPath"-"LibraryPath"
(2.该选项卡上我们看到"FrameWorklinkage",默认是"Mergedintocdoe"(FLEX4默认是RSL(3.点开下拉,选择"runtimesharedlibrary(RSL"(4.针对自定义的SWC修改其linktypeRSL选择None,同时勾上Automaticallyextractswftodeploymentpath(自动将SWF提取到部署路径。如果想对不同域的RSL共享,则选择

Digests(摘要),同时指定其Policyfileurl(策略文件)。具体可参考FLEXSDK中的SWC文件处理方式。(5.点击OK
4.请问SWC是做什么用的,怎么样自己制作一个SWC?答:静态链接库是SWC文件,通过编译器的library-pathinclude-libraries编译进应用程序。新建FlexLibraryObject或使用compc命令可以制作SWC
5.flex生成出来的文件都是很大,请问你用什么办法进行缩小呢?答:(1RSL(2Module
(3外部加载资源
6.请问trace(NaN==NaN结果为true还是false,为什么?
答:NaN具有独特的数学性质,任何与其相关的比较都会得到false的计算结果。改用全局isNaN(函数检测NaN值,如下所示:trace(NaN==NaN;//false!
trace(NaN!=NaN;//falseagain!trace(isNaN(NaN;//true
7.warning:unabletobindtoproperty”onclass„Object‟(classisnotanIEventDispatcher在使ItemRender,经常会出现这种警告,请问想去除的话怎么办呢?
答:ArrayCollection的子元素是无法作为数据源绑定的。可以声明中间变量,在overridesetdata时将ArrayCollection的子元素传入,然后再将中间变量作为新的绑定源即可。
8.现在流行MVC,但是as代码有的时候还是大部分写在mxml里面,请问我想代码分离怎么办?
答:严格按照MVC框架规范书写代码。如果还是不行,可以考虑重写组件或者从业务逻辑上解耦。没必要用source引用外部as文件来达到代码分离,那没有意义。
9.我想继承UIComponent重新写一个正方形的组件,我应该怎么做?请说重点部分即可.答:(1使用getset初始化组件边长等必要数据,指定能通过MXML标记设置的属性。(2如果组件内有子元素,覆盖createChildren(方法,使用addChild加入这些子元素。(3覆盖commitProperties(方法,提交边长等组件属性变化。(4覆盖measure(方法,设置组件缺省size和缺省最小size
(5覆盖updateDisplayList(方法,依据布局确定子元素大小及位置。最后,使用graphicsdrawRect方法画出正方形边框。
10.常用的几个切换数据的组件比如:TabNavigator等都有属性creationPolicy你知道这种策略的使用方式是什么嘛?以及优,缺点呢?
答:延迟实例化。优点是可以更快地加载组件,缺点是首次访问其他组件时,由于需要重新加载此组件,可能会有一定的延迟。
11.我想在application里获取当前运行的URL,我要怎么获取.

答:Application.application.url
12.请说下事件里的currentTargettarget的区别?
答:在事件流的过程中,目标阶段确定的目标对象由Event中的target属性来记录,冒泡阶段移动的游标则由currentTarget来记录。事件对象冒泡过程中每往上移动一级,就会克隆出一个仅与前副本currentTarget不同的新副本。
13.请列举下你常用的几种effects,并说明使用原因.答:SoundEffect,为了播放MP3TweenLite很多特效
14.HBox,VBoxcanvas有什么区别呢?试说出其中几点答:canvas只有绝对布局,没有布局管理器。
HBox,VBox则相反,没有绝对布局,只有相对布局。
15.请问我想在list里选中多行信息,我要怎么做呢?答:设置allowMultipleSelectiontrue
16.Alert里面有几个属性,我想设置图片怎么办呢?答:使用iconClass属性指定图片
17.请问你是否设置过样式呢,我想动态设置样式怎么办呢?如果我想在as代码里设置样式我又要怎么办呢?
答:使用setStyle()
18.你能说一下UIComponent的生命周期嘛?以及相关的使用场合呢?答:(1调用组件构造函数(2设置组件属性
(3调用addChild(将组件添加到父组件显示列表(4组件的parent属性设置为对父容器的引用(5设置样式
(6组件分发preinitialize事件(7调用组件createChildren(
(8调用invalidateProperties(invalidateSize(invalidateDisplayList(失效方法,FLEX将在”(rendereventcommitProperties(measure(updateDisplayList(方法进行调用。这个规则唯一例外就是当用户设置组件的heightwidth,Flexmeasure(explicitWidthexplicitHeight属性是NaNFlex才会调用measure(方法。
(9组件分发initialize事件。此时组件所有的子组件初始化完成,但组件尚未更改size和布局,可以利用这个事件在组件布局之前执行一些附加的处理(10在父容器上分发childAdd事件(11在父容器上分发initialize事件
(12在下一个渲染事件”(renderevent,Flex执行以下动作:a.调用组件的commitProperties(方法

b.调用组件的measure(方法
c.调用组件的layoutChrome(方法d.调用组件的updateDisplayList(方法e.在组件上分发updateComplete事件(13如果commitProperties(measure(updateDisplayList(方法调用了invalidateProperties(invalidateSize(invalidateDisplayList(方法,则Flexh会分发另外一个render事件(14在最后的render事件发生后,Flex执行以下动作:a.设置组件visible属性使其可视
b.组件分发creationComplete事件,组件的大小(size和布局被确定,这个事件只在组件创建时分发一次
c.组件分发updateComplete事件。无论什么时候,只要组件的布局(layout,位置,大小或其它可视的属性发生变化就会分发这事件,然后更新组件来正确地显示。
19.请问你是否发现过flex3里的bug,请列举一些?答:flexModule内存泄露,对象无法释放。20.列举出flex里面的几个绑定数据对象的方式答:对自已的类或者变量添加绑定功能:
(1类前使用[Bindable]表示所有属性都支持绑定,此类必须实现IEventDispatcher接口。(2可以给变量声明前或变量gettersetter前使用[Bindable]。如果gettersetter方法同名,那么给其中一个[Bindable],相当于给两个都用了[Bindable]使用拥有绑定功能的属性:
(1MXML{}方式,如:{myInput.text}{myVar1+myVar2}{myBtn}(2MXML的方式。和{}相同,可以多绑一,可以双向绑定。如
(3ASmx.binding/utils.BindingUtils类的bindProperty(方法或bindSetter(方法(4ASmx.binding.utils.ChangeWatcherwatch(方法
21.请问我自己定义了一个组件,我想在组件里的属性里设置几个默认值,我要怎么设置呢?答:在定义组件时,初始化组件属性时即可指定默认值。
22.callLater(方法怎么使用,为什么要使用这个方法呢?答:callLater(method:Function,args:Array:void
其中method是函数名,args是要传入函数的参数。callLater指定的函数在下次刷新屏幕的时候才会执行,这可以确保在对某个对象进行操作时对象已经创建完毕。当然也可以利用这个特点来制作渐进动画。
23.请问你是否使用过module这种方法去做项目呢?他的优,缺点是什么呢?使用组件的方式加载的话,他的优,缺点是什么呢?
答:优点是合理分割了主Application,模块化开发。更小的SWF文件体积,配合RSL和延迟加载策略,大大减少用户等待时间。缺点就是容易引起内存泄露。
24.目前网页里都有导航,请问在Flex要做导航要注意一些什么呢?以及怎么样做呢?答:注意默认的延迟实例化可能会导致某些对象为空。
25.我想在一个错误的图片链接里,定义一下默认的图片怎么做呢?

答:控制Imagesource属性,当图片链接出现错误时,指定默认链接。
26.请试写一个自定义的验证组件答:
packagemyCompenent{
importmx.validators.Validator;//引用Validator
importmx.validators.ValidationResult;//引用ValidationResultpublicclassmyValidatorsextendsValidator{
publicfunctionmyValidators(//构造函数{
super(;}
privatevarresults:Array;//定义一个数组,用以存储错误//重写验证函数
overrideprotectedfunctiondoValidation(value:Object:Array{
vars:String=valueasString;results=[];//清空数组
results=super.doValidation(value;//先用继承类中的doValidation方法验证if(results.length>0//如果验证时有错,返回错误信息returnresults;
if(s.length>6//自定义验证,字符长度不超过6{
//记录出错信息
results.push(newValidationResult(true,”text”,”StringTooLong”,“字符长度超过6”;}
returnresults;}}}
27.请说明下triggertriggerEvent在验证组件里是什么意思,具体怎么使用呢?
答:指定触发验证的组件和触发事件,默认是source指定的组件和valueCommit事件。具体来说,多个validatorsource对应多个组件,但它们的trigger都指向一个提交按钮,triggerEvent都是click。这样,只会在点击提交按钮时,才触发所有验证。
28.ExternalInterface,LocalConnection2者有什么区别?答:ExternalInterfaceFlexJavascript通迅使用;
LocalConnection可以让运行于同一台计算机的本地应用程序进行交互,使用AMF3格式通信,兼容以前版本。
29.你是否使用过flex的测试工具呢?请说明下具体是哪种,以及使用方式,你为什么使用这种工具?

答:没有,只听过FlexUnitFlexMonkey
30.我能把CSS编译成swf?
答:可以,在CSS文件上右键选择CompileCSStoSWF
31.请用as3列举下你用过的模式答:工厂模式,单例模式
32.Embed绑定图片有什么缺点?
答:直接编译到swf文件中,造成其体积过大。而且由于嵌入代码中,维护不便。
33.TitleWindow的组件是可以拖动的,我不想让他拖动我要怎么办呢?
答:让isPopUp属性=false,同时设置弹出窗口为模态窗口,禁止与其他窗口交互。
34.你是否使用过profile,你觉得这个工具怎么样,,缺点是什么呢?答:可以很方便地观察对象的创建和销毁,帮助检查内存泄露问题。
35.你是否做过flex前端的性能优化,你觉得怎么做是比较完美的?答:(1、避免容器的多级嵌套,减少相对尺寸、相对定位的使用。(2、尽量使用轻量级的容器
(3、避免使用大体积的组件,比如DataGridAdvancedDataGrid(4、处理数据时多用分页的方式(5、少使用setStyle
(6、使用延迟实例化加载子组件
36.你是否了解E4X,请说明一下优,缺点?
答:E4X是在ECMA-357标准中定义的,并成为AS3的一部分。优点是提供更简明和可读性强的语法从XML中查找和提取数据。
37.请列举一下你知道的影响性能的几个因素?答:同上面第35题。
38.请说明一下ShareObject的使用方法?以及优,缺点?答:getLocal(用来指定存储在客户端的路径。data属性用来指定要存储的数据内容。flush方法负责把数据内容写入。clear方法用于清除储存的信息。
39.请列举一下,你认为不错的网站或者blog.
答:insideRIAAS天地会,AIRIAjaveeyeN神,杜增强,牛牛猪研究所,黑羽40.我现在给你100万做一个flex项目,你认为成功的要素在哪呢?答:(1数据和需求等传统软件项目的成功要素(2模块化开发,MVC框架
(3swf文件减肥,运行效率,内存泄露问题,前台优化

(4开源组件的使用
FlexActionScript面试题库
1什么是面向对象?如何理解面向对象?2用过哪些软件?看过哪些专业书籍?3FlashCS元件与类如何绑定?4编程中遇到问题如何解决的?
5Int(-1==uint(-1TrueorFalse?(false,另Int要写成int6如何加载图片?
7连接服务器?用到什么类?如何操作?8事件流机制的三个阶段?
9如何理解垃圾回收机制?程序中如何应用?10forinforeachin的区别?
11数组排序的关健字用哪些?各有何作用?12直接继承自DisplayObject类有哪些?13事件类如何传递参数?
14DisplayObjectContainer.MouseChildren什么作用?15LoaderLoaderURL的区别16Event的属性有哪些?
17ArrayIndexOf的作用?
18Arrayspliceslicer的区别?
19生成一个随机正整数,且该数小于等于100,判断是否为回文数?20Array中头部新增一个元素的属性名是什么?21AS3.0的核心类有多少?你用过哪些?22随机生成一种颜色?23Is的作用?
24==和===的区别?25如何理解封装?26GetSet的作用?
27静态属性和动态属性的区别?28静态常量的关键字是什么?29静态属性的作用有哪些?30Timer类用过哪些属性?31BitmapData的作用?
32ShapeSpriteBitMap哪些可以接受鼠标事件?33继承自DisplayObjectContainer有哪些类?34异常:try-catch-finally如何使用?35XML36Flex

介绍一下flex生命周期
一、为什么要重写组件
1、在Flex已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展。举例,继承BUTTON组件的长文本却不自动换行的自定义控件。
2、为了模块化设计或进一步重用,需要对Flex组件进行组合。比如一个包括TEXTAREA,BUTTON的复合控件。二、重写Flex组件需要经常换位思考的三个角色
1、作为重写组件的使用者,有哪些需求。比如需要在MXML标签和AS代码中暴露哪些属性及对应默认值、事件和事件的处理逻辑。2、重写组件一般需要使用Flex原有组件,要站在原有开发者的角度了解设计规则。
3、作为重写组件的设计者,在满足需求的情况下尽量做到可复用、低耦合易扩展等设计原则,让新组件像Flex原组件一样好用。三、重写Flex组件AS方式和MXML方式的采用规则
1MXML文件和AS文件最后都会被编译成AS类,只不过MXML编译速度稍慢一些2、如果MXMLAS都能完成的一个简单组件,MXML更容易被创建和控制布局3、当要覆盖组件的某些方法时只能用AS方式
4、创建一个直接继承UIComponent的子类时只能用AS
5、创建非可视化组件比如FormattervalidatorEffect……时,只能用AS6、要为组件添加日志功能时,只能用AS.四、AS方式重写Flex组件常规步骤
1、如果有必要,为组件创建所有基于标记(tag-based)的皮肤(skins2、创建ActionScript类文件
⑴从一个基类扩展,比如UIComponent或者其他的组件类⑵指定使用者能够通过MXML标记进行设置的属性
⑶嵌入(Embed)所有的图片和皮肤文件,文件大小尽可能小
⑷实现构造器,可以设置属性和样式的缺省值,或者初始化数据结构,比如数组⑸根据需要,确定是否覆盖以下五个方法
(aUIComponent.createChildren(方法,创建组件的子组件
(bUIComponent.commitProperties(方法,提交组件所有的属性变化,设置measure(方法可能使用的属性值。绝大多数情况下,都是对影响组件如何在屏幕上显示的属性使用这个方法
(cUIComponent.measure(,设置组件的缺省sizemeasuredWidthmeasuredHeight)和缺省的最sizemeasuredMinWidthmeasuredMinHeight
(dUIComponent.layoutChrome(方法,用于定义容器的边框区域和确定边框区域的位置,以及确定要在边框区域中显示的附加元素。例如,Panel容器使用layoutChrome(方法定义panel容器的title区域,这个区域用来包含title文本和close按钮。
通常,使用RectangularBorder类来定义容器区域的边框,而不是用图片资源去包围组件。比如创建一个RectangularBorder对象,然后在重载的createChildren(方法,将其作为一个内容子控件添加到组件中,再用updateDisplayList(方法来确定其位置。将容器的内容区域和容器边框区域分开处理的主要原因是为了应对Container.autoLayout
属性被设置为false的这种情况。当autoLayout(自动布局)属性使用默认值true时,只要容器子控件的大小和位置发生变化,容器及子控件就会进行度量和布局。而当其为false时,度量和布局只在子控件被添加或移出容器时才执行。分开处理让Flex在这两种情况下都执行layoutChrome(从而在autoLayout属性为false的情况下,容器仍能够更新它的边框区域。
(eUIComponent.updateDisplayList(方法,根据以前所设置的属性和样式来确定组件的子组件在屏幕上的大小(size)及位置(position,并且画出组件所使用的所有皮肤(skins)及图形化元素。组件的父容器负责确定组件本身大小(size
要在updateDisplayList(方法中确定一个组件的大小,当子组件是UICOMPONENT时使用setActualSize(方法,而不是UICOMPONENT则使用与组件大小相关的属性widthheight。要确定组件的位置,当子组件是UICOMPONENT时使用move(方法,而不是UICOMPONENT则使用xy属性。一个区别就是move(方法不仅改变了组件位置,而且在调用这个方法之后立即分发了一个move事件,设置xy属性也更改组件的位置,但却在下一个屏幕更新事件中才会分发move事件。

组件支持很多类型的可视元素,比如皮肤,样式和边框。在updateDisplayList(方法中,可以添加这些可视元素,并对它们进行一些控制。由于UICOMPONENT继承自SPRITE所以可以使用Graphics对象中的Flash绘画APIs进行绘制图形,比如使用Graphics类去画边框水平线以及其他图形元素:
graphics.lineStyle(1,0×000000,1.0;
graphics.drawRect(0,0,unscaledWidth,unscaledHeight;updateDisplayList(方法形式如下:
protectedfunctionupdateDisplayList(unscaledWidth:NumberunscaledHeight:Number:void
以像素为单位的组件坐标系中,unscaledWidthunscaledHeight是由父容器确定的组件大小,而不管组件的scaleX,scaleY是多少。缩放发生在FlashPlayer或者AIR中,发生时机是在updateDisplayList(执行之后。比如一个组件的unscaledHeight属性是100,而其scaleY属性是2.0,那么它在FlashPlayerAIR中出现的高度为200像素。
需要注意的是,定义新组件时不一定要重载所有的五个方法,只需重载实现组件功能所必需的即可。比如实现一个自定义的Button控件,该控件使用新的机制来定义缺省大小(size。在这种情况下,只需要重载measure(方法。或者,要实现VBox容器的一个新子类。新子类利用VBox已有的所有有关设定大小(sizing)的逻辑,但是变更了VBox类的布局逻辑以实现从底部到顶部的方式来布局容器中的子控件,而不是自顶向下的布局。在这种情况下,只需要重载updateDisplayList(方法
(6增加属性(properties方法methods,样式(styles,事件(events)以及元数据3、以ActionScript文件或者SWC文件的形式部署组件五、深入Flex组件生命周期1、生命周期(LifeCycle)简述
⑴调用组件构造函数。构造函数没有返回类型,没有参数,使用super(调用父类的构造器⑵使用set,get设置组件属性,常在set方法内监控一个布尔变量来实现失效机制
addChild(FlexcreateChildren(invalidateProperties(invalidateSize(invalidateDisplayList(。只有将组件添加到父容器中,Flex才能确定它的大小(size,设置它所继承样式(style属性,或者在屏幕上画出它⑷组件的parent属性设置为对父容器的引用⑸样式(style设置
⑹组件分发preinitialize事件⑺调用组件createChildren(方法
⑻调用invalidateProperties(invalidateSize(invalidateDisplayList(失效方法Flex将在下一个渲染事件”(renderevent期间对相应的commitProperties(measure(updateDisplayList(方法进行调用。这个规则唯一例外就是当用户设置组件的heightwidth属性时,Flex不会调measure(方法。也就是说,只有当组件的explicitWidthexplicitHeight属性是NaNFlex才会调用measure(方法
⑼组件分发initialize事件。此时组件所有的子组件初始化完成,但组件尚未更改size和布局,可以利用这个事件在组件布局之前执行一些附加的处
⑽在父容器上分发childAdd事件⑾在父容器上分发initialize事件
⑿在下一个渲染事件”(renderevent,Flex执行以下动作:a.调用组件的commitProperties(方法b.调用组件的measure(方法c.调用组件的layoutChrome(方法d.调用组件的updateDisplayList(方法e.在组件上分发updateComplete事件
⒀如果commitProperties(measure(updateDisplayList(方法调用了invalidateProperties(invalidateSize(invalidateDisplayList(方法,则Flexh会分发另外一个render事件
⒁在最后的render事件发生后,Flex执行以下动作:a.设置组件visible属性使其可视
b.组件分发creationComplete事件,组件的大小(size和布局被确定,这个事件只在组件创建时分发一次

c.组件分发updateComplete事件。无论什么时候,只要组件的布局(layout,位置,大小或其它可视的属性发生变化就会分发这事件,然后更新组件来正确地显示。
2、为什么使用失效机制(invalidationmechanism
ButtonlabeliconcommitProperties(,measure(,updateDisplayList(方法而不是设置过label属性后执行一遍这些方法然后在设置icon属性后又执行一次这些
另一种情况是几个组件同时更改了它们的字体大小。程序更改字体大小的执行速度大大快于Flex更新应用的速度,因此要在确定最终更改字体之后才开始更新布局。另外,Flex需要协调布局操作以消除任何冗余过程,而不是在每个组件更新它的字体大小之后都执行一次布局操作。Flex使用失效机制(invalidationmechanism来同步组件的更改。Flex用一系列方法的调用,比如在setter方法内监控一个变更变量来标记组件西rendereventcommitProperties(,measure(,layoutChrome(updateDisplayList(检查这些布尔变量来完成最终的变更逻辑。这样做的额外好处就是setter方法可以更迅速地返回,把对新属性值的处理留给了commitProperties(方法
失效方法及其对应的触发函数如下:
invalidateProperties(通知组件,以使下次屏幕更新时,它的commitProperties(方法被调用。invalidateSize(通知组件,以使下次屏幕更新时,它的measure(方法被调用。invalidateDisplayList(通知组件,以使下次屏幕更新时它的layoutChrome(方法updateDisplayList(方法能被调用。
当组件调用一个失效方法时,它就通知Flex该组件已经被更新。当多个组件调用失效
方法Flex会在schedules中协调这些更新,以使这些更新操作在下一次屏幕更新时一起执行。注意,createChildren(没有对应的失效方法,它会在调用后被立即执行。


as3.flex.air面试题

相关推荐