zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    python
    python
    python
    Django学习手册
    python
    Django学习手册
    [ThinkPHP] 独立分组配置,坑!!!
    vim 代码片段:通过vundle插件管理器安装ultisnips |centos6.5|vim7.2
    CESHI
    thinkphp实现功能:验证码
  • 原文地址:https://www.cnblogs.com/avenxia/p/2467676.html
Copyright © 2011-2022 走看看