Flex--转自新浪微博

Flex开发资料集锦

 (2011-03-09 17:44:50)
标签: 

杂谈

 

(一)典型Flex应用程序开发步骤

一个典型的Flex应用程序开发可以遵循下面的步骤:
1.使用编辑器或可视化工具创建包含根标记的一个MXML文件;
2.添加一个或多个容器;
3.添加对容器的控制,如输入框、按钮和输出框;
4.定义数据模型;
5.添加WebService,HTTPService或请求远程Java对象操作;
6.添加对数据字段的验证;
7.添加脚本扩展组件;
8.调试

 

(二)开发Flex程序要注意的问题

 

      一. Flex中有些控件只有在使用的时候才会初始化。这个特性在一些Navigator容器,如ViewStack,Navigator和Accordion中表现得最为明显。当这些容器初始化的时候,它只会初始化显示在最前面的的子容器,其它的容器其实没有初始化,如果你现在要对那些容器中的某些控件进行操作,就会出现:TypeError: Error #1009: 无法访问空对象引用的属性或方法。昨天这个东西困扰了我长达几个小时,后来终于恍然大悟。

二.如何限制TextInput中的输入。其实文本输入控件TextInput和TextArea都有一个restrict属性,它可以控制TextInput的输入。这个东西挺有用,可以防止输入恶意字符串。不过Flex 帮助文档中对这个属性介绍的不够全面,经过我实验N次,总结出了几条新的经验:
1.如果你想要控制用户只能输入字母和数字,就这样写:restrict="a-zA-Z0-9"。帮助中只给出了一个例子说"a-z"就是只允许输入小写字母,但是没有说如何多重限制,自己实验了一下,终于成功。你按照我上面写的那样做就可以多重限制了,中间不用加空格,我实验过了。
2.帮助文档中写了“^”符号可以限定不允许输入的字符串,比如"^0"就是不允许输入0。同样,帮助中也没有说明如何限定多个字符。实验结果如下:想要控制多个字符的时候需要加括号,这样歇restrict="^(';:)",就可以限定多个字符了。另外,你想控制的字符有<>这样在MXML中有特殊意义的字符的话,请转换成 < 的形式。至于每个符号的编码是怎么样的,请打开DreamWeaver,在代码编辑器中输入&,然后查看代码提示,方便又快捷!

三.DataGrid的labelFunction。我需要在DataGrid中显示时间,但是后台传回的是格林威治时间,很长,我得需要格式化,这就要用到 labelFunction 属性。这个属性的值是一个函数,这些都在帮助文档中有说明,我就不多说了,我想说的是如何用这个东西。先说一下这个函数需要的两个参数:item:类型Object,column:类型DataGridColumn。其中item保存的是显示在DataGrid中的每一个对象的引用,而column表示的就是当前列,这个column好像没什么用。我一直以为必须要用到column才可以,结果总是显示错误。最后终于成功。代码如下:
程序代码
private function formatLabel(item:Object,column:DataGridColumn):String
       {
return df.format(item.dates);
// df是一个DateFormatter,item中
          //的dates放的是格林威治时间
}

补充一点:DataGrid的dataProvider是一个ArrayCollection。当你为DataGrid设定dataProvider的时候可能会给它一个对象数组,但是当你操作的时候要记住,dataProvider不再是对象数组了,你必须把它作为ArrayCollection来操作。List控件估计也是一样.

 

(三)Flex应用现状

 

目前在开发应用Flex上遇到的问题:

1.Flex的确是提高了用户体验度,酷了,但是没有什么实质的更新,旧网站改版不值,除非是新做。

2.Flex无法完成与硬件的交互操作,比如获得扫描仪图片,获得数码相机图片。

2.网速问题,多少还是有点障碍。如果没有FDS,整个的网站要发布成一个SWF,初始化要慢些!

3.如果是企业内部应用,网速的问题可以解决,但是感觉Flex对系统的要求还是比较高,经常出现短时间的“不流畅”“假死机”现象。毕竟很多企业(家用)的计算机还是win2000甚至win98的配制。

4.Flex的对手:

1)Ajax,相对网速、流畅问题,Ajax好点。当然Ajax开发效率不如Flex。但是容易被用户接受。

2)微软的.Net Framework3.0已经出来了。特别是WPF(Windows Presentation Foundation),开发的用户界面的确很酷,不亚于目前基于Flash的Flex,也同样有着基于XML的XAML语言(针对Flex的MXML语言),还有配套的开发软件:Acrylic Graphic Designer(图像处理-针对Photoshop+Illustrator),Sparkle Interactive Designer(动画创作-针对Flash),Quartz Web Designer(网页设计-针对Deamweaver)。发布后的程序可以应用在桌面(.exe)也可以移植到网络……

微软的这套开发工具有个最大的优点,就是可以配套VS开发底层应用。Flex针对硬件的接口编程上就弱很多了。

 

(四)Flex UI组件库

 

(1)google flexlib

flexlib是一个开源的FLEX用户界面组件,使用与FLEX 2和FLEX 3版本.
包括一下组件:
AdvancedForm, Base64Image, EnhancedButtonSkin, CanvasButton, ConvertibleTreeList, Draggable Slider, Fire, Highlighter, HorizontalAxisDataSelector IconLoader, ImageMap, PromptingTextArea, PromptingTextInput, Scrollable Menu Controls, SuperTabNavigator, Alternative Scrolling Canvases, Horizontal Accordion, TreeGrid, FlowBox, Docking ToolBar, Flex Scheduling Framework

在此查看每个组件的文档说明和实例。
http://code.google.com/p/flexlib/wiki/ComponentList
在此下载最新的flexlib-.2.4.z版本。

 

(2)Yahoo Flex Skin

 

(3)Macromedia提供的六款Flex特效

切换效果
仿Mac弹出窗口效果
仿Mac界面
鱼眼效果Fisheye(给一个鱼眼效果的Fisheye特效图片吧)

拓扑图显示SpringGraph(上传几个我自己项目中的截图吧)
MDIWindow,多窗口显示配合立方体旋转

(4) Flex UI组件权限控制框架 Flex Security

 

 

 

(五)Flex图表技术

图表方面Flex能够做到如下:

1,两个甚至多个纵坐标

2,图表水平分组和垂直分组

3,图表切换

4,图表与表格数据绑定

5,图表导出为PNG,JPG,BMP图片

6,图表打印

7,图表导出到PDF,Excel

8,图表特效,样式美化

9,图表与人的交互

 

 

(六)Flex-UI组件的生命周期之成长阶段

 

不知道能不能这样理解,其中大部分应该不会有问题,但是存在细节问题。

组件的构造初始化就不必说了,主要是重要的成长阶段。

成长阶段主要是 失效-》生效-》更新列表 机制。

首先在UIComponent基类中(UI组件的基础类)具备三个失效方法(invalidateProperties,invalidateSize,invalidateDisplayList),分别代表组件属性,大小,显示列表这几个关于布局以及相关样式的方法,这三个方法默认是可以被调用的,其分别具备一个控制的变量,可以称之为锁,在调用之后无法在这个周期内调用了,其被锁住了;

同样的UIComponent也具备三个生效方法(validateProperties,validateSize,validateDisplayList) 这三个则是用来调用具体的生效方法以及解锁,然后属性可以继续进入失效阶段。

UIComponent的实际生效方法也有三个对应的方法(commitProperties,measure,updateDisplayList) 这三个是被上面生效验证过后调用的,并且执行在绘制之前的最后更新。

而从UIComponent的失效到UIComponet的生效到最后的实际更新,需要通过LayoutManager的一个失效-生效周期。

具体是UIComponent(简称为UI)到LayoutManager(简称为Layout) 的失效验证调用。

UI的失效方法会调用Layout的失效方法,进入Layout的周期中。

Layout也有同样的验证方式,以一个变量来判断是否验证通过,每一次的失效验证都会将要验证的对象加入到失效队列中,按照对象的nestLevel级别,一般越是里面的对象值越大,这个用来调整生效的对象的顺序的,称之为优先级。

在每一次的失效中会判断是否绑定了listeners(很重要的监听器组,用来完成失效到生效的过渡),绑定了listeners,则listener会开始监听这个周期过程:

如果一帧还不够,我的理解是因为一帧包含多个时间片,如果在一帧还不足够时则应该要等待1到更多的帧(SystemManager的初始化过程实际也是一帧一帧的转换过程,从一帧创建预加载到创建主应用程序),这个时候就会注册侦听一帧的ENTER_FRAME事件(此事件在一帧开始的时候派发一次),用来完成一帧的等待,如果一帧完毕则注册两个监听器,分别是位于一帧的两个不同的时期,一个位于一帧开始的时候ENTER_FRAME监听器,以及在即将渲染之前最后的一次更改机会时候(RENDER),中间的时间片可能用于完成其他的代码执行,这样在这俩个时期都会进入验证阶段,所以不必担心UI中的失效会一直被锁住而无法再一次验证失效,在进入验证阶段后,默认是一个一个的顺序验证,不过验证的过程根据优先级进行验证,比如measurement阶段会按照从内到外的方式调用队列中的验证对象,layout阶段则是会按照由外到内,commit阶段则按照由外到内的方式验证。

验证的过程中会调用UI中的validate××方法,之后进入UI的后续验证过程。

Layout这里工作还没有完毕,它会将验证过的组件加入到更新队列,之后在最后阶段如果验证都通过了(如果没通过,则停止验证,进入下一个失效阶段)则开始取出更新队列中的组件进行更新操作(1、设置UI的初始化完成,调用initialized属性的setter会派发出一个CREATE_COMPLETE事件,至此完成创建工作,2、派发UPDATE_COMPLETE; 3、标记updateCompletePendingFlag为false表示更新已完成),然后自身派发出更新事件。

 

 

(七)Flex-preloader机制

 

preloader 是在SystemManger的第一帧上面,其加入的时机是在initialize()中加入的。

调用是 constructor->initHandler(这里因为需要读取主swf对象自身的属性,所以在发出Event.INIT事件之后才能进行属性读取以及相关的操作,这些操作包括侦听帧的状态以便加载一些额外的内容)->initialize(),进入到这个方法的时候,flex开始建立一个用于rsl,resource,本身的预加载器,这个加载器旨在提供友好的用户提示,表示应用完成构造需要一定的时间.

preloader 必然是位于当前的所有管理器的最顶端,因为App没有加载完毕之后应该是不可见的,尽管其确实没有完成创建也不可见。

在这里,通过读取来自根swf的一些参数信息(由外部传入,猜测应该是有编译器传入的参数)控制一些样式信息,比如backgroundColor backgroundSize backgroundImage 等,还有就是rsl以及resource的资源链接地址以及相关信息参数,需要一并传递给preloader,这里采用preloader.initialize(..params)来初始化相关的数据,默认是需要传入确实是否使用一个提示加载器的,并且需要把这个提示加载器的类名字给传递过去,这个也是由外部传入的参数,这个参数可以通过MXML里面的Application标签中的 preloader=”sss.ss.ss” 来传递一个自己定义的提示加载器,注意这个提示加载器是我取的名字,实际是一个(downloaderProgressBar,默认的位于preloaders/下面,有两个默认的可供使用)反正作用就是一个加载的提示,这个要自定义需要实现特定的接口,而且和这里的preloader不是一个概念,为什么呢?

因为preloader是必须的,它需要完成自身的一些东西的载入,它是在后台运行的一个必须的过程,而提示器则是可有可无,没有,preloader照样要加载,因为主swf本身需要用到其加载的某些过程事件,rsl以及resource可能也许要,尤其是rsl,如果使用了共享链接库,则必须要加载,而downloaderprogressBar 则不是必需品,它只是外在的UI提示界面,告诉用户,我这个程序正在加载一些我自己要的东西,如果应用比较大,那么这样做体验就好些。默认使用的是SparkDownloaderProgressBar(flex4以后的版本)这个与使用的主题有关,以前是DownloaderProgressBar。

那么preloader是如何完成的呢,它有几个阶段,初始化阶段就是初始化所有的属性,如果要启用downloaderprogressbar,则会根据displayClass 创建一个progressbar ,并且开始加载数据,同时注册一个timer,当作一个加载的监听器,不断的测试加载的进程,这将主要做如下的事情:

如果frameloaded 到2表示可以进行application的构造工作了,发出  FlexEvent.PRELOADER_DOC_FRAME_READY

如果每次加载数据已满(bytesloaded和bytestotal 实际是自身加上rsl库的大小以及resource的大小,只是并不一定确定,因为这里rslloader不但是rsl的,而且是resource的加载器,),需要检测rsl是否加载完毕,完毕了就需要检查resource是否都已经加载完毕了,如果加载完毕了则开始派发Event.COMPLETE ,此事件实际给downloaderProgressBar使用,以帮助其确定这里所有的数据都加载完毕(默认没有用到,不过预留了监听器),当然这里并不代表整个初始化就真完了,也只是数据完毕了,后面还需要看Application的创建,所以这个时候其还会派发一个FlexEvent.INIT_PROGRESS事件,提示初始化仍在进行中。

这个时候就有Flex注册Application给preloader,通过registerApplication(app:Application)方法(这个注册是在Application构造完成时注册的,而且由flex自己完成,无法自己控制),注册的过程实际就是监听Application的验证以及创建过程包括:

app.addEventListener(“validatePropertiesComplete”, appProgressHandler);

app.addEventListener(“validateSizeComplete”, appProgressHandler);

app.addEventListener(“validateDisplayListComplete”, appProgressHandler);

app.addEventListener(FlexEvent.CREATION_COMPLETE, appCreationCompleteHandler);

最后根据Application完成自身的所有创建,更新显示列表之后,派发出CREATION_COMPLETE ,这里监听之后再次派发一个INIT_COMPLETE事件,表示初始化完成,在这里还不算完,因为这里也仅仅代表Application可用,创建完成,莫要忘记了如果使用的downloaderProgressBar,这个东西有没有完成还不知道,所以这个时候需要监听其Event.COMPLETE事件(如果没有启用,将直接调用收尾函数完成一些清理工作),一旦它完成了则最后收尾,取消掉不用的监听器,并且可能的话某些不要的对象设置为null,以便于垃圾回收器工作,并且派发出

FlexEvent.PRELOADER_DONE

自此,也就完毕了,而从preloader派发的这些事件都被SystemManger来使用,这里没有提到的一些rslevent,则是在rsl加载过程中派发出来的,在SystemManager需要用到,来判断rsl的载入情况

 

 

(八)重写flex组件

一、为什么要重写组件
1、在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展。举例,继承BUTTON组件的长文本却不自动换行的自定义控件。

2、为了模块化设计或进一步重用,需要对FLEX组件进行组合。比如一个包括TEXTAREA,BUTTON的复合控件。

 

二、重写组件需要经常换位思考的三个角色

1、作为重写组件的使用者,有哪些需求。比如需要在MXML标签和AS代码中暴露哪些属性及对应默认值、事件和事件的处理逻辑。

2、重写组件一般需要使用FLEX原有组件,要站在原有开发者的角度了解设计规则。

3、作为重写组件的设计者,在满足需求的情况下尽量做到可复用、低耦合易扩展等设计原则,让新组件像FLEX原组件一样好用。

 

三、重写组件AS方式和MXML方式的采用规则

1、MXML文件和AS文件最后都会被编译成AS类,只不过MXML编译速度稍慢一些

2、如果MXML和AS都能完成的一个简单组件,MXML更容易被创建和控制布局

3、当要覆盖组件的某些方法时只能用AS方式

4、创建一个直接继承UIComponent的子类时只能用AS

5、创建非可视化组件比如Formatter、validator、Effect……时,只能用AS

6、要为组件添加日志功能时,只能用AS.

 

四、AS方式重写组件常规步骤

1、如果有必要,为组件创建所有基于标记(tag-based)的皮肤(skins)

2、创建ActionScript类文件

⑴从一个基类扩展,比如UIComponent或者其他的组件类

⑵指定使用者能够通过MXML标记进行设置的属性

⑶嵌入(Embed)所有的图片和皮肤文件,文件大小尽可能小

⑷实现构造器,可以设置属性和样式的缺省值,或者初始化数据结构,比如数组

⑸根据需要,确定是否覆盖以下五个方法:

(a)UIComponent.createChildren()方法,创建组件的子组件

(b)UIComponent.commitProperties()方法,提交组件所有的属性变化,设置measure()方法可能使用的属性值。绝大多数情况下,都是对影响组件如何在屏幕上显示的属性使用这个方法

(c)UIComponent.measure()方法,设置组件的缺省size(measuredWidth、measuredHeight)和缺省的最小size(measuredMinWidth、measuredMinHeight)

(d)UIComponent.layoutChrome()方法,用于定义容器的边框区域和确定边框区域的位置,以及确定要在边框区域中显示的附加元素。例如,Panel 容器使用layoutChrome()方法定义panel 容器的title 区域,这个区域用来包含title 文本和close 按钮。通常,使用RectangularBorder 类来定义容器区域的边框,而不是用图片资源去包围组件。比如创建一个RectangularBorder 对象,然后在重载的createChildren()方法中,将其作为一个内容子控件添加到组件中,再用updateDisplayList()方法来确定其位置。将容器的内容区域和容器边框区域分开处理的主要原因是为了应对Container.autoLayout属性被设置为false 的这种情况。当autoLayout(自动布局)属性使用默认值true时,只要容器子控件的大小和位置发生变化,容器及子控件就会进行度量和布局。而当其为false时,度量和布局只在子控件被添加或移出容器时才执行。分开处理让Flex 在这两种情况下都执行layoutChrome(),从而在autoLayout属性为false 的情况下,容器仍能够更新它的边框区域。

(e)UIComponent.updateDisplayList()方法,根据以前所设置的属性和样式来确定组件的子组件在屏幕上的大小(size)及位置(position),并且画出组件所使用的所有皮肤( skins)及图形化元素。组件的父容器负责确定组件本身大小(size)。要在updateDisplayList()方法中确定一个组件的大小,当子组件是UICOMPONENT时使用setActualSize()方法,而不是UICOMPONENT则使用与组件大小相关的属性width 和height。要确定组件的位置,当子组件是UICOMPONENT时使用move()方法,而不是UICOMPONENT则使用x 和y 属性。一个区别就是move()方法不仅改变了组件位置,而且在调用这个方法之后立即分发了一个move 事件,设置x和y属性也更改组件的位置,但却在下一个屏幕更新事件中才会分发move 事件。组件支持很多类型的可视元素,比如皮肤,样式和边框。在updateDisplayList()方法中,可以添加这些可视元素,并对它们进行一些控制。由于UICOMPONENT继承自SPRITE,所以可以使用Graphics对象中的Flash绘画APIs进行绘制图形,比如使用Graphics 类去画边框水平线以及其他图形元素:graphics.lineStyle(1, 0x000000, 1.0);graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);updateDisplayList()方法形式如下:protected function updateDisplayList(unscaledWidth:Number,unscaledHeight:Number):void以像素为单位的组件坐标系中,unscaledWidth和unscaledHeight是由父容器确定的组件大小,而不管组件的scaleX,scaleY是多少。缩放发生在Flash Player或者AIR中,发生时机是在updateDisplayList()执行之后。比如一个组件的unscaledHeight属性是100,而其scaleY 属性是2.0,那么它在Flash Player或AIR中出现的高度为200像素。需要注意的是,定义新组件时不一定要重载所有的五个方法,只需重载实现组件功能所必需的即可。比如实现一个自定义的Button 控件,该控件使用新的机制来定义缺省大小(size)。在这种情况下,只需要重载measure()方法。或者,要实现VBox 容器的一个新子类。新子类利用VBox 类已有的所有有关设定大小(sizing)的逻辑,但是变更了VBox 类的布局逻辑以实现从底部到顶部的方式来布局容器中的子控件,而不是自顶向下的布局。在这种情况下,只需要重载updateDisplayList()方法。

(6)增加属性(properties),方法(methods),样式(styles),事件(events)以及元数据

 

3、以ActionScript文件或者SWC文件的形式部署组件

五、深入组件生命周期

1、生命周期(LifeCycle)简述

   ⑴调用组件构造函数。构造函数没有返回类型,没有参数,使用super()调用父类的构造器

⑵使用set,get设置组件属性,常在set方法内监控一个布尔变量来实现失效机制

⑶调用addChild()方法将组件添加到父组件显示列表中,FLEX将自动调用createChildren(),invalidateProperties(),invalidateSize(),invalidateDisplayList()。只有将组件添加到父容器中,FLEX才能确定它的大小(size),设置它所继承样式(style)属性,或者在屏幕上画出它

⑷组件的parent 属性设置为对父容器的引用

⑸样式(style)设置

⑹组件分发preinitialize事件

⑺调用组件createChildren()方法

⑻调用 invalidateProperties(),invalidateSize(),invalidateDisplayList()失效方法,FLEX将在下一个“渲染事件”(render event)期间对相应的commitProperties(),measure(), updateDisplayList()方法进行调用。这个规则唯一例外就是当用户设置组件的height 和width 属性时, Flex 不会调用measure()方法。也就是说,只有当组件的explicitWidth 和explicitHeight 属性是NaN 时Flex才会调用measure()方法。

⑼组件分发initialize事件。此时组件所有的子组件初始化完成,但组件尚未更改size和布局,可以利用这个事件在组件布局之前执行一些附加的处理

⑽在父容器上分发childAdd事件

⑾在父容器上分发initialize事件⑿在下一个“渲染事件”(render event)中, 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、为什么使用失效机制(invalidation mechanism)一种情况是,当设置了组件的多个属性后,比如Button 控件的label 和icon 属性,我们需要所有属性被设置后一次性执行commitProperties(), measure(), updateDisplayList()方法,而不是设置过label 属性后执行一遍这些方法,然后在设置icon属性后又执行一次这些方法。另一种情况是几个组件同时更改了它们的字体大小。程序更改字体大小的执行速度大大快于Flex 更新应用的速度,因此要在确定最终更改字体之后才开始更新布局。另外,Flex 需要协调布局操作以消除任何冗余过程,而不是在每个组件更新它的字体大小之后都执行一次布局操作。Flex 使用“失效机制(invalidation mechanism)”来同步组件的更改。Flex 用一系列方法的调用,比如在setter方法内监控一个变更变量来标记组件的某些东西已经发生变化, 然后在下一个“渲染事件(renderevent)”中触发组件的commitProperties(), measure(), layoutChrome(),updateDisplayList()检查这些布尔变量来完成最终的变更逻辑。这样做的额外好处就是setter方法可以更迅速地返回,把对新属性值的处理留给了commitProperties()方法。失效方法及其对应的触发函数如下:invalidateProperties() 通知组件,以使下次屏幕更新时,它的commitProperties()方法被调用。invalidateSize() 通知组件,以使下次屏幕更新时,它的measure()方法被调用。invalidateDisplayList() 通知组件,以使下次屏幕更新时它的layoutChrome()方法和updateDisplayList()方法能被调用。当组件调用一个“失效”方法时,它就通知Flex该组件已经被更新。当多个组件调用失效方法,Flex 会在schedules中协调这些更新,以使这些更新操作在下一次屏幕更新时一起执行。注意,createChildren()没有对应的失效方法,它会在调用后被立即执行。

 

(九)flash as3.0 OO

 

AS3.0 中有两种方式的继承形式,

一种是沿用ECMASCRIPT标准的原型链继承,这是一种比较复杂的方式,并且是以函数式的变成方式进行。

另外一种也是主推的类继承方式,类继承是OO的重要基础,而且具备良好的扩展性,灵活性,维护性,其其他的一些特性也许要了解,as并不支持重载,但是支持以关键词override 描述的重写操作,也就是在子类中应用此关键词,并且使用一直的函数签名来重写父类的方法,并且可以通过super.xx()来调用父类的方法

;如果不使用关键词,那么也就是子类的一个普通方法。

对于类继承需要了解,类又分为动态类(dynamic)和密封类,动态类所实例化的对象具备可以扩展的特性,也就是可以动态添加属性。而密闭类就整好相反,例如LocalConnection之类的以前是动态类,现在密封类,如果需要设定回调的客户端,需要使用其client属性指定,这样可以指定本身也可以指定其他对象作为客户端回调

 

 

flex的特效

1.旋转
效果:http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/
代码:http://weblogs.macromedia.com/auhlmann/archives/DistortionEffects.zip

2.画布按钮
http://dougmccune.com/blog/2007/06/01/new-component-canvasbutton-added-to-flexlib/

3.鱼眼工具条
效果:http://dev.getoutsmart.com/labs/dock/
代码:http://dev.getoutsmart.com/labs/dock/dockdemo.zip

4.窗口
http://www.returnundefined.com/flexmdi/explorer/
http://window.diaztorres.com/bin-release/test_window.html

5.切换效果
http://blogs.digitalprimates.net/codeSlinger/samples/carousel/CarouselTest.html

6.图片展示
效果:http://flex.diaztorres.com/samples/aladinotest/aladino_test.html
代码:http://www.madeinflex.com/img/entries/2008/01/aladino.zip

7.自定义载入进度条
http://blog.diaztorres.com/2007/05/mipreloader/mipreloaderdemo.html

8.Flex Mac弹出窗口
http://blog.xsive.co.nz/archives/244

9.果冻特效弹出窗口
http://blog.sban.com.cn/2008/04/01/jelly-effect-alert-window.html

10.Alert弹出效果
http://www.cnblogs.com/taobataoma/archive/2008/01/13/1037082.html

11.自定义ToolTip
图片:http://everythingflex.com/flex2/ImageToolTip/Index.html
视频:http://labs.flexcoders.nl/samples/ToolTip/video/002/
弹性:http://labs.flexcoders.nl/samples/ToolTip/spring/001/

12. http://flanture.blogspot.com/2008/05/simple-flex-effects-example.html

13.果冻效果: http://blog.sban.com.cn/2008/04/01/jelly-effect-alert-window.html

14.BOOK: http://www.quietlyscheming.com/blog/components/flexbook/

1:聚光灯效果:
实例:http://www.rphelan.com/flex/SpotlightDemo/SpotlightDemo.html
ambientColor - color to apply to all pixels of the image
angle - angle at which the spotlight is projected (in degrees)
azimuth - angle between the image plane and the spotlight (in degrees)
coneAngle - angle of the spotlight's "opening" (in degrees)
distance - distance from the spotlight to the center point
intensity - intensity of the spotlight
position - x, y, z position of the spotlight
spotColor - color of the spotlight
源文件:http://www.rphelan.com/flex/SpotlightDemo/srcview/index.html

2:放大镜效果:
实例:http://www.rphelan.com/flex/MagnifyDemo/MagnifyDemo.html
center ([0-2048, 0-2048]) - the center coordinates of the magnified area
outerRadius (0-500) - the radius of the magnified part of the image
innerRadius (0-500) - the radius of the fully magnified part of the image
magnification (1-50) - the amount to magnify the image by (e.g. set to 2 for a 2x magnification)
源文件:http://www.rphelan.com/flex/MagnifyDemo/srcview/index.html

3:缩放模糊效果:
实例:http://www.rphelan.com/flex/ZoomBlurDemo/ZoomBlurDemo.html
amount (0 - 0.5) - the amount of blur to apply
center ([0 - 2048, 0 - 2048]) - the focal point of the blur
源文件:http://www.rphelan.com/flex/ZoomBlurDemo/srcview/index.html

4:浮雕效果:
实例:http://www.rphelan.com/flex/SharpenDemo/SharpenDemo.html
amount (0 - 20) - the amount to sharpen the image by
radius (0 - 1) - pixel distance to sample from
源文件:http://www.rphelan.com/flex/SharpenDemo/srcview/index.html

5:水波效果:
实例:http://www.rphelan.com/flex/WaveReflectionDemo/WaveReflectionDemo.html
学习flex如果不学习特效等于进了宝山空手而归,所以学习flex一定要学习flex的特效。
有个特效组叫做Distortion的,里面总共有6个特效,每个特效很令人惊讶。它们分别CubeRotate,flip,Push,Pop,Gate和Door。每个类都有一些公共属性,它们都是想通的,分别是duration持续时间,target(效果作用的对象),siblings(转向哪个对象),id标志符,direction方向,Smoothing Mode是否为平坦模式,默认为true,倘若false,画面即变得粗糙,blur模糊,选中的话会有两个属性blurX和blurY,但画面出来或者出去的时候,画面会变模糊,distortion弯曲,本人认为默认的就可以了,太大或者太小都将严重影响画面质量,lightLocationa光亮的地方,有水平和垂直之分,最后是strength了,这个不必多说。在这里贴一段代码
<mxeffects:Door id="doorIn" target="{login}" siblings="{[registration]}" direction="LEFT" horizontalLightingLocation="LEFT" duration="1000"/>
<mxeffects:Door id="doorOut" target="{registration}" siblings="{[login]}" direction="RIGHT" horizontalLightingLocation="RIGHT" duration="1000"/>
   <mx:ViewStack id="viewStack">
  <sides:Login id="login" title="login" hideEffect="{doorIn}"  change="viewStack.selectedChild=registration"/>
  <sides:Registration id="registration" hideEffect="{doorOut}"   change="viewStack.selectedChild=login" title="registration"/>
</mx:ViewStack>

posted @ 2012-04-24 11:00  avenxia  阅读(803)  评论(0编辑  收藏  举报