`

创建Flash CS3组件(二) Flash CS3组件体系

阅读更多


在Flash MX 2004时代,组件体系相当庞大.核心有UIObject,UIComponent,管理器有 StyleManager,DepthManager,FocusManager,为了广播事件还有 EventDispatcher,UIEventDispatcher,除了这些还有n多辅助类,皮肤类等等等等.
到了Flash CS3,得益于新的类结构和全新的深度管理,组件体系得到极大的精简,核心类仅有四个:UIComponent,StyleMananger,FocusManager,InvalidationType,至多再加上三个FocusManager的接口.
1.Flash CS3组件的层次结构
见下图:


从图中可以看出,Flash CS3中的组件分类更加简单明了,组件结构也更加清晰.
下面介绍一下各个组件基类的大体功能,这会方便与选择组件的基类

1.UIComponent
UIComponent 类是所有组件的基类,实现了组件的基本功能,它大概相当于v2版组件中的UIComponent类.它包括处理焦点,键盘事件,鼠标事件,样式管理,组件无效,组件基本事件,输入法设置以及基本的屏幕支持.

2.BaseScrollPane
UIComponent 类处理基本的滚动窗格功能,包括事件、样式、绘制遮罩和背景、滚动条的布局,以及滚动位置的处理.

3.SelectableList
SelectableList 类是所有基于列表的组件(例如 List,TileList,DataGrid 和 ComboBox 组件)的基类,实现了基本的数据提供者,滚动列表,有关列表的事件,属性,方法.

4.BaseButton
BaseButton 类是所有按钮组件的基类,用于定义所有按钮共有的属性和方法.此类仅仅实现改变按钮状态,按钮事件及样式.

5.LabelButton
LabelButton 类添加了标签,图标及切换功能.

6.ScrollBar
ScrollBar 类是一个滚动条,有横,竖两个方向,实现了滚动事件,样式,方法.

2.Flash CS3组件体系的实现与运作方式
(1)深度管理
因为AS3有了新的深度管理,所以在组件中并不需要进行深度管理.

(2)样式管理
由于v2版组件样式管理效率不佳,广为诟病,所以在Flash CS3中采用了一种全新的样式管理方式.
先说说为什么v2版组件效率不佳.在v2版组件中,当样式发生改变时,UIObject类从_root开始递归,将fla文件中的每个MovieClip都访问一遍,所以样式改变的速度极慢,而且存在递归256级的限制.
在Flash CS3中,StyleManager会将每个组件实例都缓存在自己的变量中(这多亏了新的Dictionary类),然后在改变样式时直接设置组件,不存 在多余的循环,使得效率大大增加,所以完全可以在运行时改变样式而不必担心Flash Player因此"崩溃".
再有是每个类都有一个默认的样式列表(可以通过类方法getStyleDefinition()访问),组件实例的所有未设定的样式都会直接读取默认的样式列表,只有被用户更改了的样式才会存储于实例变量中,尽量减少了内存的占用.
样式管理是由UIComponent和StyleManager共同完成的,我们在定义组件时不应直接访问存储了样式的变量,而是使用UIComponent提供的样式方法来获取样式.
UIComponent提供的有关获取样式的方法:
public function getStyle(style:String):Object//获取指定样式的值,这个值是存储与实例上的样式,默认情况下都是null
protected function getStyleValue(name:String):Object//获取指定样式的值,这是为制作组件准备的,获得的值是真实值,即如果实例上没有设定值,则会返回该类的默认样式值.在组件中,我们使用的是这个方法.
protected function copyStylesToChild(child:UIComponent,styleMap:Object):void//将自身的样式复制到子元件 上.如果你在组件中嵌套使用了其它组件,则可以用这个方法复制样式,显然比自己写一个方法要好得多.child是子组件,styleMap是一个样式映射 表,就是将自己的样式映射为子组件的样式,即类似于 {childStyle1:"MyStyle1",childStyle2:"MyStyle2",childStyle3:"MyStyle3"}

(3)焦点管理
首先,UIComponent会自动为stage创建一个FocusManager,但是,问题是UIComponent并 没有使用try...catch...final,也就是说CS3版组件只运行在单一的swf中,如果你要载入一个使用了组件的swf,要确保已经允许载 入的swf访问stage,否则会产生错误,使所有组件都无法运行.
对于焦点管理的细节,我们无需了解,只要知道FocusManager根据组件实现的接口来决定焦点管理的方式.
IFocusManagerComponent:表明这是一个可以接受FocusManager焦点管理的类.
           //指示是否可以从FocusManager获取焦点
           function get focusEnabled():Boolean;
           function set focusEnabled(value:Boolean):void;
           //指示是否可以通过鼠标点击获取焦点
           function get mouseFocusEnabled():Boolean;
           //指示是否可以通过键盘获取焦点
           function get tabEnabled():Boolean;
           //通过键盘获取焦点的顺序
           function get tabIndex():int;
           //自己已经获取了焦点,在这个函数中显示焦点框
           function setFocus():void;
           //绘制焦点框,draw参数指明是否获取了焦点
           function drawFocus(draw:Boolean):void;
注 意:事实上UIComponent已经实现了IFocusManagerComponent的全部方法,但并没有实现 IFocusManagerComponent接口,这意味着:如果你要进行焦点管理,要在子类上实现IFocusManagerComponent接口 (尽管不需要额外的方法),如果不实现该接口,则意味着不需要焦点管理.
FocusManager不对组件 tabEnabled、tabChildren 和 mouseFocusEnabled 属性的变化进行监视,所以改变这些属性后,需要将组件从新添加到显示列表(addChild),才能使FocusManager更新这些属性
IFocusManagerGroup:表明几个同样的类组成了一个整体,作为焦点的对象,就像几个RadioButton一样.
           //作为一个整体(group)的名字
           function get groupName():String;
           function set groupName(value:String):void;
           //指示自己是否被选择了
           function get selected():Boolean;
           function set selected(value:Boolean):void;
这个类是为类似RadioButton的组件专用的.
IFocusManager:这个接口是用来自定义一个FocusManager的,在这里不做过多介绍
只要继承里UIComponent,你几乎不必考虑焦点管理的问题,因为UIComponent会帮你处理焦点.如果你需要更高级的焦点管理,则可以监听FocusEvent.FOCUS_IN和FocusEvent.FOCUS_OUT事件.

3.UIComponent类的实现以及如何继承UIComponent类
既然UIComponent类是组件的基类,那么我们要知道该如何继承UIComponent类.
(1)在类的构造函数中,初始化你的变量,然后记得调用super(),让UIComponent来完成剩下的工作.
(2) 使用override protected function configUI():void覆盖configUI()方法.在这个方法中,你要完成组件UI的设置工作.这个方法仅仅在组件初始化时调用一次,所以把 所有只需要执行一次的方法(比如新建一个Sprite之类的)放在这里执行.最后,还是记得调用super.configUI()
(3)然后是组 件的核心方法:draw方法.每当组件的样式(InvalidationType.STYLES),大小 (InvalidationType.SIZE),渲染器(InvalidationType.RENDERER_STYLES),状态 (InvalidationType.STATE),数据(InvalidationType.DATA),滚动 (InvalidationType.SCROLL),选择(InvalidationType.SELECTED)或是所有 (InvalidationType.ALL)发生改变时,都会调用draw方法来重新绘制组件.当然,每次重新绘制所有太浪费了,所以Adobe提供了 InvalidationType类,用常量来标记组件所发生的改变.
首先,在组件发生改变后调用 invalidate(invalidationStyles),invalidationStyles就是InvalidationType类的某个常 量,UIComponent就会记录下发生的更改,然后在draw函数中,用isInvalid(...properties)来检查更改,并根据结果来 绘制不同的部分.
例如调用invalidate(InvalidationType.STYLES),就是表明组件的样式发生了更改.
isInvalid(InvalidationType.SIZE,InvalidationType.STYLES),就是说当SIZE或STYLES发生了更改时返回true.
最后,还是记得调用super.draw().
注意:UIComponent在最开始时已经调用了invalidate(InvalidationType.ALL),来重绘所有部分,无需再手动调用.
(4)组件的延迟处理技术
我 们为什么要使用invalidate()而不是直接调用draw()?答案是为了效率.这是从v2版就开始使用的一项技术,作用是尽量晚的调用 draw(),使用户在同一时间做的许多更改可以在一次draw()内被处理,而不是调用多次draw()来浪费资源.在CS3中使用的是监听stage 的Event.RENDER事件,就是先将要调用的方法用callLater(fn:Function)方法缓存起来,然后在stage重绘时一起调用. 由于使用Event.RENDER事件,而不是以前的EnterFrame.这就带来了一些问题:子组件可能不会及时的得到处理,这时我们只能手动的调用 drawNow(),强制重绘.

下面,一起重新回顾一下组件类执行的过程:
1.构造函数,初始化变量
2.构造函数,调用super()
3.自动执行configUI(),设置组件UI
4.调用super.configUI()
5.由UIComponent调用invalidate(InvalidationType.ALL),等待组件被绘制
6.经过一段时间,draw()被调用,在这里检查组件发生更改的部分,并且绘制更改的部分
7.调用super.draw()
8.当用户发生了交互,或者用AS设置了组件,调用invalidate()方法
重复6 - 8

4.UIComponent类鲜为人知的秘密:)
(其实就是一些protevted的函数而已)
因为UIComponent重写了x,y,scaleX和scaleY,所以我们无法获得正确的scaleX和scaleY,而这两个函数就是干这个的
setScaleY()
getScaleY()
setScaleX()
getScaleX()
设置输入法的状态(是否可用)
setIMEMode(enabled:Boolean)
检查是否处于实时预览状态,如果是的话,会返回true,是一个比较好用的方法
checkLivePreview():Boolean
//检查发生更改的部分
isInvalid(...properties):Boolean
我 最喜欢的函数:从样式中返回DisplayObject,把作为皮肤的样式传入这个函数,如果样式是个类名(Class),它返回这个类的实例;如果样式 是库中的类名(String),它会自动查找类,并返回一个实例;如果样式是个显示对象,就直接返回这个对象.总之,在读取皮肤是很是好用.
getDisplayObjectInstance(skin:Object):DisplayObject
前面已经介绍过了,就不多说了
getStyleValue(name:String):Object
copyStylesToChild(child:UIComponent,styleMap:Object):void
等会调用fn,就是在stage重绘前再调用fn
callLater(fn:Function)
UIComponent中两个抽象方法(就是等待子类去重写的方法),分别是键按下和释放时的监听器
protected function keyDownHandler(event:KeyboardEvent):void {
// You must override this function if your component accepts focus
}
protected function keyUpHandler(event:KeyboardEvent):void {
// You must override this function if your component accepts focus
}

上面说了一大堆,只是用来参考的,我们会用实例来真正了解该如何创建组件:)

  • 大小: 34.3 KB
分享到:
评论

相关推荐

    Flash CS3 PPT课件

    Flash CS3是Adobe公司推出的一款强大的二维动画制作软件,主要用于创建互动式的网络内容、游戏、动画短片以及教育演示。这份“Flash CS3 PPT课件”旨在帮助学习者掌握Flash CS3的基本操作和高级技巧,通过PPT的形式...

    Flash CS3 Professional Help

    2. **绘图工具**:Flash CS3提供了丰富的绘图工具,如线条、矩形、椭圆、刷子、铅笔和钢笔工具等,用于创建矢量图形。其中,钢笔工具是核心,能够绘制出复杂的曲线路径,理解锚点、贝塞尔曲线的概念至关重要。 3. *...

    Flex Component Kit for Flash CS3

    Flex Component Kit for Flash CS3 是一个专门为Adobe Flash CS3设计的插件,它极大地扩展了Flash开发工具的功能,使得开发者可以更加便捷地在Flex项目中重用和集成由Flash创建的组件。Flex是一种开放源代码的框架,...

    flash cs3源代码

    通过研究这些源代码,我们可以深入理解Flash CS3的工作原理以及如何运用其强大的功能来创建互动丰富的Web内容。 一、ActionScript 3.0基础 Flash CS3引入了ActionScript 3.0,这是一种基于ECMAScript规范的脚本...

    flash CS3 网站开发素材

    在本压缩包中,我们收集了关于“Flash CS3 网站开发”的一系列素材,主要涵盖PPT格式的教学材料。这些文件详细介绍了Flash在网站开发中的应用,特别是交互技术的使用,ActionScript的基础知识,以及Flash组件和动画...

    flash cs3用户指南.rar

    - Flash CS3包含预设的组件,如按钮、文本输入框等,简化UI设计。 - 学习如何创建自定义组件,并将其保存在库中以供重复使用。 - 探索库管理,理解库面板中的组织和链接功能。 6. **声音与视频处理**: - 了解...

    Flash.CS3网站商业设计从入门到精通第1章__初识Flash_CS3

    - **增强的集成功能**:Flash CS3加强了与Adobe其他软件的协同工作,如Adobe Bridge,允许用户在Creative Suite CS3的不同组件间轻松交换资源。同时,改进了与Photoshop和Illustrator的导入功能,提高了工作效率。 ...

    flash cs3 课件

    在教学应用中,Flash CS3可以帮助创建互动性强、视觉效果出色的课件,提升学生的学习兴趣和参与度。通过ActionScript,开发者还能实现更复杂的交互逻辑,比如响应用户的点击、拖拽等操作,使得课件不仅仅是静态的...

    flash cs3 源代码

    Flash CS3作为Adobe Creative Suite 3中的重要组成部分,是创建动态交互式内容的利器。它提供了强大的ActionScript 3.0编程环境,使得开发者能够利用源代码进行精细的动画控制、用户交互以及数据处理。本压缩包中的...

    flash cs3 基础与实例教程

    在Flash CS3软件中,按钮元件是实现动画交互的重要组件之一。它具有四种不同的状态,能够根据用户的鼠标操作(如鼠标悬停或点击)改变其外观或触发特定的动作。 #### 二、按钮元件的结构与编辑 **1. 认识按钮元件*...

    FLASH CS3创建的MovieClip通过代码加入到场景

    这篇博文“FLASH CS3创建的MovieClip通过代码加入到场景”探讨了如何利用ActionScript 2.0(Flash CS3所使用的编程语言)将MovieClip对象动态地添加到舞台上。MovieClip是Flash中的一个核心概念,它是一种可以包含多...

    Flash CS3动作面板打开出错

    这个错误通常出现在使用精简版Flash CS3的情况下,因为精简版在去除不必要的组件时可能误删了一些必需的文件,导致程序无法正常运行。 标签“Flash CS3”指明这是关于Adobe Flash Creative Suite 3的讨论,这是一个...

    flash cs3 用户指南.rar

    此外,Flash CS3的组件库是另一个强大的资源,预设的组件可以帮助快速构建常见的用户界面元素。了解每个组件的属性和方法,以及如何自定义组件外观和行为,能显著提高开发效率。 最后,不要忘记测试和发布你的项目...

    flash cs3二维动画制作案例教程教学指南和电子教案

    《Flash CS3二维动画制作案例教程》是一本深入浅出的教学指南,由段欣主编,旨在教授读者如何利用Adobe Flash CS3这一强大的动画制作工具创作出精彩的二维动画。本教程结合理论与实践,通过丰富的案例解析,让学习者...

    给flash cs3的组建工具可给flex做组建用

    标题中的“给flash cs3的组建工具可给flex做组建用”揭示了这个压缩包包含的是一个用于Flash CS3的组件开发工具,该工具能够帮助开发者将创建的组件应用于Flex项目中。Flash CS3是一款经典的Adobe动画和交互设计软件...

    no1.rar_FLASH CS3

    在数字媒体领域,Adobe Flash CS3 是一个不可或缺的工具,尤其在创建互动式动画、网页元素以及简单的游戏方面。本教程将带你逐步了解并掌握这款软件的基础知识和高级技巧,助你从新手进阶为熟练的Flash开发者。 一...

    myweb.rar_CSharp flash_FLASH CS3_Flash cs3 e-ma_电子邮件客户端 CSharp_

    标题 "myweb.rar" 涉及到的项目是一个基于C#语言的电子邮件服务器开发,同时结合了Adobe Flash CS3来创建一个电子邮件客户端。这个综合性的项目旨在利用C#的强大功能构建邮件服务器,并通过Flash CS3提供用户友好的...

    Flash CS3教程ppt课件

    **Flash CS3 教程PPT课件**是针对Adobe Flash Professional CS3这一经典版本的交互式动画设计软件的学习资料。这份教程旨在帮助初学者和有一定基础的设计师掌握Flash CS3的基本功能和高级技巧,从而创作出引人入胜的...

    FlexComponentKit For Flash CS3

    Flash CS3是一款广泛使用的动画和交互设计工具,它允许设计师创建丰富的媒体内容和互动体验。然而,Flex作为一种基于ActionScript 3.0的MXML框架,更侧重于构建功能强大的、数据驱动的Web应用程序。FlexComponentKit...

Global site tag (gtag.js) - Google Analytics