Flash mx 2004 V2组件架构II[高级]

作者: egoldy

性质: 翻译

阅读次数: 7521

发表时间: 2005-04-12 16:02:52


声明:本教程来源于http://www.ultrashock.com.英文原版版权归ultrashock所有。谢觉转载。



接上篇——
http://www.webstudio.com.cn/tutorial/detail.php?id=23

II.Public API(公共API)

使用组件架构的一个好处就是我们在教程开始的时候提到的可以让我做更少量的工作。但到目前为止,好像并没有看出它的好处,那么我们将花一点时间来验证一下组件架构能为我们做些什么。

a. Methods(方法)

move(x,y)
move方法接收两个参数x和y,它会将组件移动到指定的新位置,在flashmx2004中这一个很好的技术,不需要用户直接去编辑_x和_y的属性值。

setSize(width,height)

从前面讨论中你可以重新调用size()方法,setSize()方法实际上在暗中调用size()方法并且通过组件架构来处理其它需要的操作。 对于调用size()前准备__width和__height,oldwidth和oldheight它是可靠的。最重要需要你注意的是size()方法 执行要确保在运行时是正确的否则setSize()方法可能会不正常的工作并且通常情况你不需要覆盖setSize()方法。

b.Read-only Properties (只读属性)

在UIObject类中有许多属性是以只读形式运行的。这些只读属性在V2组件架构中对你的用户是很有用的并且可用于一些容器类.了解这些只读属是很有好处的,在许多案例中你可能没有意识到它们已经为你执行了许多。
Properties(属性):
    Right:
    Left:
    Top:
    Buttom:
    X:
    Y:

c.Properties visible(可视属性)

可视属性允许用户显示/隐藏组件,在这里不是十分的必需但值得注意的是它在暗中设置了_visible属性并将其委派给适当的事件,要么显示或是隐藏。如果你想执行你自已定义的可视属性,你可以覆盖setVisible()方法。

III.Utility Methods(有效的方法)

通过组件架构有效的方法是可利用的,可以使你的日常工作变得更轻松。如果之前你已经在使用这些方法,你可以快速跳过。

cancelAllDoLaters ()

cancelAllDoLaters() 删除函数调用序列,因此会使所有的doLater()调用被擦除,查看doLater()方法以了解更多的细节。

doLater(obj:Object,function:String)

doLater()方法是一个顺手可得的用于在下一贞之前延迟调用的方法。当调用这个方法并且传递参数给它时,这个函数将存储一个方法的引用在一 个数组中并且在后面的帧中调用它。如果有多个调用,它们都将在下一个帧上执行。需要注意的是当一个组件无效时,在数组中的方法将会被自动调用。然而,当你 立即调用redraw()时,这个方法将立即执行。反之,它们将在一帧之后被调用,如果你在延迟一个方法调用前已经使用了onEnterFrame那它是 很容易的。例如:doLater(this,”setSomething”)将会使“this
”对象的setSomething()方法在下一帧上被调用。

createLabel(name:String, depth:Number, text:String)

这将创建一个textField,它侦听默认创建它的类的样式变量值。这是推荐创建Labels的方法。

getTextExtent2(text:String)

getTextExtent()最好的执行方法是在运行时加入textformat 类的属性,它的用法类似于原始的getTextExtent().

drawRect(x1:Number, y1:Number, x2:Number, y2:Number)

允许你传递四个点的值来绘制矩形。

setSkin()

它用于你在组件上执行皮肤定义,我们在些教程中不讨论皮肤的结构。

getStyle(styleProp:String)

getStyle方法将会返回一个特定的样式,例如:getStyle(“color”),将会返回用户设定的色彩值,如果你之前已在使用组件的 样式特性,你可能已经看到了设置样式的能力,在每一个基础实例,每一个类中,getStyle()方法在不同的设置情况下返回适当的值。如果你还没有执行 皮肤定义而只是使用默认的组件样式,在用户没有设置之前你将会收一个undefined值。你应当根据些条件来正确调用getStyle方法。

setStyle(styleProp:String, value)

如果你已经在使用组件并且试着要自定义它的外观感觉,你可能就会涉及到setStyle()函数。这个函数会加入到我们组件允许用户设置每一个实例的样式值。

IV.Events(事件)

在组件架构中一个新的特性就是事件系统(mx.events.* package)。不光是Macromedia 创建一个好的事件系统来使用,而是你的组件需要支持自动创建一些事件,当你的组件是UIComponent的子类时,它会自动拥有这些事件。

Event Implemented by Sub-classing UIObject:(通过UIObject sub-Classing执行事件)
    resize:当一个用户调用setSize()时会使事件发生。它会在UIObject 内的setSize()函数中执行。
    move:当一个用户调用move()方法时会使事件发生。它会在UIObject内的move()方法中执行。
    draw:这个事件会在组件的draw()方法每次调用中执行。它通常发生组件初始化和组件在后来无效时。在UIObject的redraw()方法中执行。
    reveal:当一个用户设置组件的可视为true时事件会发生。它会在UIObject的setVisible()方法中发生。
    hide:当一个用户设置组件的可视为false时事件发生。它会在UIObject的setVisible()方法中执行。
    load:当一个组件被载入时事件发生。当一个影片剪辑被载入时Flash player时会暗中调用。
    unload:I当一个组件没有被载入时事件发生,当影片剪辑没有载入时通过flash player暗中调用。

Custom Events(自定义事件)

当开发组件时。一个好的习惯是你的组件需要包含一些自定义的事件。这些事件将会帮助开发者更好的使用组件。当你第一次创建组件,我建议你最好花一 点时间来想一下你需要执行哪些事件。此后真正的执行过程是相对简单的。这也是使用MM组件架构的一个好处。这个教程中我们不去讨论事件系统的公共API, 但是之前如果你在使用基于V2架构的其它组件,你可能已经很熟悉它的。简单的说,你的组件将象其它组件一样支持addEventListener(),和 removListener().

Mix-in of UIEvent Dispatcher(混合的UIEvent广播)

如果你在查看UIObject,你可能没有看见在那里执行任何的事件系统。原因是它是以混合的形式执行的。MIX-ins是一种向类中加入功能的 一种方式。如果你查看一下UIObject类,你会看到唯一的对事件系统的trace显示只有少量的不执行的功能声明有 dispatchEvent,handleEvent,removeEventListener,和addEventListener.加入事件系统到对 象的方法是通过mx.events.UIEventDispatcher.initalize(theObject)给UI元素,这个方法并不在 UIObject中,而是位于UIObject的扩展(mx.core.ext.UIObjectExtensions)中,并且被皮肤初始化调用。一个 很重要的问题需要注意的是你是否发现你的组件不能接收到eventDispatcher的执行。

The dispatchEvent(eventObj:Object) method(委派方法)

你将会在你的自定义事件中使用委派,当你调用这个方法时,所有事件中的侦听器都将执接受到通告。事件系统需要事件对象来通知正确的侦听器并且发送 所有的侦听事件。通常情况下你将创建一个与事属性类型相同的一个匿名对象,例如:dispatchEvent({type:”change”})将通知所 有“改变”事件的侦听器。事件对象也包括一个目标属性。如果在你的事件对象中没有提供一个目标属性,它将默认引用当前的组件做为目标。你也可以通过 dispatchEvent({type:”change”,oldValue:someValue})这种方法来发送其它属性给事件对象。当调用 dispatchEvent()时这将会提供你加入的属性”oldValue”给所有的侦听器。

The UIComponent Base Class(UIComponent基础类)

到目前为止你已经涉及到了UIObject类,尽管UIObject类提供给了我们许多功能,还有另一个类可以用在你的组件中做为基础类。 UIComponent类是UIObject的子类,因为此几乎所有关于UIObject的信息也同样都指它给了 UIComponent.UIComponent从本质上讲实际是增加了焦点管理,可用属性(enabled property),用户交互,快速重置大小方法的UIObject.此教程剩下的部分,你将涉及到这些增加部分的功能。
这里的许多增加的功能由组件架构自动为你执行,焦点管理功能通常情况下不是必须的,特殊情况下,除非你的组件需要增加一些逻辑来处理架构自身无法处理的复杂状态。增加的用户交互功能与焦点管理类似一般是由架构来处理。

Some Changes to Note(需要注意的改变)

有一点很重的需要注意的是tabEnabled属性无论它是否在UIObject类中都会被设为true,这是我们的组件用来接受焦点所必须的,这也是为什么UIComponent为什么支持焦点管理的原因。

Smarter Resizing(快速重置大小)

在UIObject中,我们涉及到size()方法,通过设计,UIObject默认通过判断scalex和scaleY属性来确保组件总是保持 足够的大小,在UIComponent中这不是什么问题,然而你需要执行size()并且使用你比判断scaleX/scaleY更聪明的方法来重置组件 的大小。

Additions to the Public API(加入公共API)

Properties (属性)

支持加入所有的UIObject属性到你的组件,在UIComponent类中许多其它的属性提供额外的功能。

enabled

enabled属性允许你的组件支持可用和不可用状态,enabled属性是一个布尔变量。一旦组件状态为无效则新的变量对draw()功能是可用的。在draw()功能中你应确保你的组件真实的反应enabled属性值。
例如:


private function draw():Void
{
  if(enabled)
  {
    //make sure the component looks enabled
  }
  else
  {
    //make sure the component looks disabled
  }
} 

tabIndex

tabIndex属性用于通过焦点管理获取组件tab 顺序

Methods

getFocus()
通过焦点管理它将获取当前的焦点对象

setFocus()
它将设定焦点到你的类.你可以在你的组件中覆盖这个方法,默认情况下调用setection setFocus(this)执行方法。

Utility Methods

getFocusManager()

在v2之前,我们依靠播放器来管理焦点,因为内置在播放器中的焦点管理不是很强健不能足够的处理所需的。Focus manager的存在,使你在大多数的情况下你不需要做特点的事情而是由focus manager去做。关于focus manager的文档你可以在MM的帮助文档中发现它。GetFocusManager()是一个方便的方法用来获取焦点管理的引用。

Events

1.FocusIn:发生在当组件获取到焦点。
2.FocusOut:发生在当组件丢失焦点。
3.KeyDown:发生在当组件处在焦点状态时一个键按下时。
4.KeyUp:发生在当组件处于焦点状态一个键放开时。

总结:在此教程中涉及到了v2组件架构的大部分内容,但不可能面面俱到,希望能通过些教程让你更好的理解v2组件架构。

服务项目_SERVICE

关于我们

万博思图(北京)信息技术有限公司,专业的flash,flex开发团队,5年经验。公司致力于互联网上的业务的开展,对于互动网站行销,互联网应用程序开发有成熟的解决方案。我们关注互联网市场动态,关注新技术,更注重在新的领域不断探索发现。
万博思图业务内容主要包括企业品牌Flash网站开发,企业形象宣传Flash设计,动画,多媒体演示,Flex企业级应用程序开发,拥有众多成功案例,欢迎来电咨询。
 
COPYRIGHT BY WEBSTUDIO INTERACTIVE DESIGN Co.,Ltd. ALL RIGHTS RESERVED.
公司地址: 北京市朝阳区朝外SOHO D 座727室 邮编: 100026 EMAIL: WEBSTUDIO@WEBSTUDIO.COM.CN
电话: 010-59070059 / 010-86390986-802  手机: 13693660520 传真: 010-59070059-801
京公网安备:110108006741      京ICP备08002333号-4
王先生