`
isiqi
  • 浏览: 16474617 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

flex 事件之理解

阅读更多

<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> <!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --> <!-- [endif]-->

首先,申明本文是转载 http://blog.csdn.net/ivanmarkliu/archive/2009/07/08/4327570.aspx ,大家可以访问该链接,也可以直接阅读本文后续部分以了解 flex 事件。接下来简单谈下为何要转载此文及本人对此文的一些补充。

可以这样说 flex 是事件驱动的,熟练掌握事件对于提高 flex 开发水平是至关重要的, flex 的经典绑定机制就是基于 event 。网上对于 flex event 的介绍很多,其中不乏官方的 e 文,但是本人觉得本转载之文对于事件的核心“事件传播”讲解的是比较通俗易懂的,且有 demo ,只要运行 demo 即能理解大概。因此本人认为结合此转载篇,再了解下事件派发的一个借口 IEventDispatcher 和基类 EventDispatcher ,再熟悉下自定义 event 便可熟练掌握 flex event 了。

在转载正文之前,先补充事件传播的 3 个阶段值,使大家更易理解。

EventPhase.CAPTURING_PHASE: 1 捕获阶段

EventPhase.AT_TARGET: 2 ,目标阶段

EventPhase.BUBBLING_PHASE: 3 ,冒泡阶段

/////////////////////////////////////////////// 转载正文 /////////////////////////////////////////////////

1. 最简单的事件

以下代码:

 

1:


xml

version
="1.0"
encoding
="utf-8"?>

 

2:


<
mx:Application

xmlns:mx
="http://www.adobe.com/2006/mxml"

 

3:



layout
="absolute">

 

4:



<
mx:Script
>

 

5:



[CDATA[

 

6:


import flash.events.MouseEvent;

 

7:


import mx.controls.Alert;

 

8:




9:


private function btnClick(event:MouseEvent):void {

 

10:


Alert.show("Hello Event");

 

11:


}

 

12:


]]

>

 

13:



mx:Script
>

 

14:



<
mx:Button

x
="311.5"

 

15:



y
="215"

 

16:



label
="Button"

 

17:



click
="btnClick(event)"/>

 

18:


mx:Application
>

效果很简单,当单击鼠标时弹出一个提示窗口,内容“Hello Event” 。代码中,buttonclick 设定了事件触发的时候执行btnClick 方法中的代码。

其中,event 对象就是这个组件分发的事件对象,即type “click”MouseEvent 的一个实例。这个event 对象包含了触发该事件时的各种信息,比如触发事件对象是哪个,监听对象是哪个,触发时鼠 标点在哪里等等,不同的event 类会包含不同的属性,比如KeyboardEvent 包含了键盘点击了哪个键。

下面将会解释到,这个事件会在事件流的target 阶段被触发。

2. 事件的传播

在官方的帮助手册里有提到,当事件触发之后,FLEX3 个检测事件监听 器的阶段, 3 个阶段的发生的顺序如下:

1. 捕获
2.
目标
3.
上浮

在任意一个阶段, 节点们都有机会操作事件。

关于这三个阶段的描述,发现很多网上的版本说不清楚。帮助手册里原文是这 样的:

l The first part of the event flow is called the capturing phase. This phase comprises all of the nodes from the root node to the parent of the target node. During this phase, Flash Player examines each node, starting with the root, to see if it has a listener registered to handle the event. If it does, Flash Player sets the appropriate values of the Event object and then calls that listener. Flash Player stops after it reaches the target node's parent and calls any listeners registered on the parent.

l The second part of the event flow, the targeting phase, consists solely of the target node. Flash Player sets the appropriate values on the Event object, checks the target node for registered event listeners, and then calls those listeners. For more information.

l The third part of the event flow, the bubbling phase, comprises all of the nodes from the target node's parent to the root node. Starting with the target node's parent, Flash Player sets the appropriate values on the Event object and then calls event listeners on each of these nodes. Flash Player stops after calling any listeners on the root node.

总结了一下,如下解释:

l 捕获阶段(capture)
在这个阶段,Flash Player 会去查找事件的触发源,它是通过根显示元素(root display object) 逐层向下寻踪,直到找到事件的发起源头的父节点,如你在buttonclick 后,Flash Player 找到的事该button 对象。在这个阶段监视器(listener) 默认是不会收到任何消息的( 默认只在targetbubble 阶段收到 消息)

l 目标执行阶段(target)
这个阶段会调用事件发起者中的事件监听器。

l 冒泡阶段(bubble)
最后的这个阶段其实就是第一个阶段的逆向过程。它就是在事件代码执行完毕后,从事件发起源头的父节点,通过子元素逐级向父元素发出该事件,一直 到根元素。过程中,在节点处添加的listener 会收到消息并且触发。前提是事件支持bubble 阶段。

设置listener 的方法为使用下面的function

 

1:

addEventListener(type:String, listener:Function,useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false)

l type :Event 的类型,例 如click 事件type 就是click 等。

l Listener : 响应事件的方 法,即当捕获到事件时你要程序做什么。

l useCapture : 默认为 false 。当设置为true 时,事件会在捕获阶段就触发;设置为false 时,事件则在冒泡阶段触发。因为默认是false ,所以之前提到在捕获阶 段,listener 默认是不会收到任何消息的。如果想让事件既在捕获阶段触发又在上浮阶段触发,可以用两次addEventListener ,一次把这 个参数设成false ,一次设成true ,分别在这两个阶段触发。

l priority : 优先级。

l useWeakReference : 是否设置为弱引用。如果被设置为true ,则表示告诉Flash Player ,当直接引用这个监听器的对象数量为0 时,就可以马上回收它。默认是false 的话,还需要遍历这个引用可以到达的其它引用,确保不会发生循 环引用时才回收资源。

拿本文第一章中的例子改造一下说明这三个阶段以及 addEventListener 的使用:

 

1:


xml

version
="1.0"
encoding
="utf-8"?>

 

2:


<
mx:Application

xmlns:mx
="http://www.adobe.com/2006/mxml"

 

3:



layout
="absolute"

 

4:



creationComplete
="creationComplete()">

 

5:



<
mx:Script
>

 

6:



[CDATA[

 

7:


import flash.events.MouseEvent;

 

8:


import mx.controls.Alert;

 

9:




10:


private function btnClick(event:MouseEvent):void {

 

11:


trace(event.eventPhase + ":Button:" + event.currentTarget.id + ":" + event.target.id);

 

12:


}

 

13:




14:


private function btnClick2(event:MouseEvent):void {

 

15:


trace(event.eventPhase + ":Application:" + event.currentTarget.id + ":" + event.target.id);

 

16:


}

 

17:




18:


private function btnClick3(event:MouseEvent):void {

 

19:


trace(event.eventPhase + ":VBox:" + event.currentTarget.id + ":" + event.target.id);

 

20:



}

 

21:




22:


private function btnClick4(event:MouseEvent):void {

 

23:


trace(event.eventPhase + ":AddButton:" + event.currentTarget.id + ":" + event.target.id);

 

24:


}

 

25:




26:


private function creationComplete():void {

 

27:


addEventListener(MouseEvent.CLICK, btnClick2, false);

 

28:


addEventListener(MouseEvent.CLICK, btnClick2, true);

 

29:


vb.addEventListener(MouseEvent.CLICK, btnClick3);

 

30:


tb.addEventListener(MouseEvent.CLICK, btnClick4);

 

31:


}

 

32:


]]

>

 

33:



mx:Script
>

 

34:



<
mx:VBox

x
="200"

 

35:



y
="147"

 

36:



id
="vb"

 

37:



height
="100%">

 

38:




<
mx:Button

id
="tb"

 

39:



label
="Button"

 

40:



click
="btnClick(event)"/>

 

41:



mx:VBox
>

 

42:


mx:Application
>

为了解释事件的三个阶段,我把button 再放到一个vbox 里面。在 Application 加入两个listeneruserCapture 分别设置为falsetrue ,这样就可以在Application 捕获到捕 获阶段和上浮阶段的事件。然后在VBox 设置一个listeneruserCapture 属性使用默认的false ,用于证明上浮阶段的顺序。再在 Button 上设置一个listener ,证明Button 上的listener 没有参与捕获阶段和上浮阶段。

代码中用于检测事件阶段的EventeventPhase 属性。这个属 性分别用123 表示Capture PhaseTarget PhaseBubble Phase

还有就是eventcurrentTargettarget 属性。因 为在事件流的过程中,event 对象会被动态的在各个层次节点传递。currentTarget 就是当前的节点对象,target 则是事件分配源对象,这 个例子里面target 就是button

Debug 跑一下以上代码,然后点击Button ,控制台输出如下:

 

1:

1:Application:HelloEvent:tb
 

2:

2:Button:tb:tb
 

3:

2:AddButton:tb:tb
 

4:

3:VBox:vb:tb
 

5:

3:Application:HelloEvent:tb

结果中可以看到上浮的过程是由内而外的,以及可以看到事件发出对象的监听 只在target 阶段被执行。

在事件的传播过程中,任何阶段中都可以使用以下两个函数停止事件传播:

 

1:

stopPropagation()


2:

stopImmediatePropagation()

这两个函数的共同特征就是,可以阻止事件继续传播到别的节点,而且都不影 响对象和事件的关联关系。不同的地方是,stopPropagation() 要等到当前节点所有事件都完成了以后才生效,而stopImmediatePropagation() 会马上生效。

3. 事件的分派

最终继承自EventDispatcher 的对象都会含有 dispatchEvent 这个方法,他有一个参数,事件对象。事实上所有的事件都是通过这个函数分派出去的. dispathEvent(Event) ,我们当然也可以自己定义这个Event ,然后用第二章中的各种方式去捕获自定义的Event ,这个呆会会说到。

先看下面的代码:

 

1:


xml

version
="1.0"
encoding
="utf-8"?>

 

2:


<
mx:Application

xmlns:mx
="http://www.adobe.com/2006/mxml"

 

3:



layout
="absolute"

 

4:



creationComplete
="creationComplete()">

 

5:



<
mx:Script
>

 

6:



[CDATA[

 

7:


import flash.events.MouseEvent;

 

8:


import mx.controls.Alert;

 

9:


private function btnClick(event:MouseEvent):void {

 

10:


trace("Click:Button:" + event.currentTarget.id + ":" + event.target.id + ":" + event.eventPhase);

 

11:


tb.dispatchEvent(new MouseEvent(flash.events.MouseEvent.DOUBLE_CLICK, true));

 

12:


}

 

13:


private function btnDoubleClick(event:MouseEvent):void {

 

14:


trace("DoubleClick:Button:" + event.currentTarget.id + ":" + event.target.id + ":" + event.eventPhase);

 

15:


}

 

16:


private function doubleClickHandler(event:MouseEvent):void {

 

17:


trace("Application:doubleClick");

 

18:


}

 

19:


private function creationComplete():void {

 

20:


addEventListener(flash.events.MouseEvent.DOUBLE_CLICK, doubleClickHandler);

 

21:


}

 

22:


]]

>

 

23:



mx:Script
>

 

24:



<
mx:Button

x
="311"

 

25:



y
="180"

 

26:



id
="tb"

 

27:



label
="Button"

 

28:



click
="btnClick(event)"

 

29:



doubleClick
="btnDoubleClick(event)"/>

 

30:


mx:Application
>

上面的程序,现在Application 添加一个鼠标双击事件的监听,在 Button 注册一个click 事件。在click 响应的函数里面使用dispatchEvent ,将一个鼠标双击事件由Button 发出。控制台结果如 下:

 

1:

Click:Button:tb:tb:2
 

2:

DoubleClick:Button:tb:tb:2
 

3:

Application:doubleClick

可以看到,单击这个Button 的时候Application 捕获到了双 击事件。使用这个函数,我们就可以在自定义的控件中分派自定义的事件了。

分享到:
评论

相关推荐

    flex事件运行流程

    在Flex开发中,事件流程是理解应用程序生命周期的关键。本文将深入探讨Flex事件运行流程,特别是与`mx:Application.applicationComplete`、`creationComplete`以及Flex应用程序初始化顺序相关的知识点。 首先,Flex...

    flex事件flex事件flex事件flex事件

    下面,我将详细介绍Flex布局的基础知识以及可能与之相关的JavaScript事件处理。 1. **Flex布局基础**: - **Flex容器**:设置`display: flex`或`display: inline-flex`的元素成为Flex容器,其内部的子元素称为Flex...

    Flex事件机制详细说明

    在Flex框架中,事件是应用程序与用户交互的核心机制之一。它可以由多种触发源启动,包括但不限于用户的输入(如键盘按键、鼠标点击)、外部数据加载完成(例如WebService请求返回)或组件状态的变化(如组件创建或...

    Flex事件机制(通俗易懂)

    对于初学者而言,理解和掌握Flex中的事件机制是非常重要的一步。本文将深入探讨Flex事件机制的基础概念、事件注册通道、事件触发方式、事件分发机制等关键知识点,并尝试以简单明了的方式进行解释。 #### 二、事件...

    flex 事件 代码生成器

    7. **文档支持**:提供有关每个事件的简短说明,帮助开发者理解其用途和行为。 FCG.air文件很可能就是Flex事件代码生成器的安装文件,采用Adobe AIR技术进行跨平台部署。Adobe AIR允许开发者创建桌面应用,使用Web...

    flex事件机制的demo

    Flex ActionScript3.0事件机制的Demo, 举例说明了事件的三个阶段,事件的派发,事件的侦听,事件的拦截,自定义事件等相关知识点. 以上知识点在Demo中都有体现,初学者请仔细分析代码,加强理解,多调试、修改、验证以加深...

    flex4自定义事件用法

    在Flex应用中,事件处理是核心功能之一,它使得组件之间能够有效地通信。自定义事件是Flex开发中的一个重要概念,允许开发者扩展内置事件系统,以满足特定项目的需要。下面将详细介绍Flex4自定义事件的用法,以及...

    flex事件机制分析

    Flex事件机制是Adobe Flex应用...总结,Flex事件机制是构建交互性应用的基础,理解并熟练掌握它能够帮助开发者编写出更加高效、响应迅速的Flex应用程序。通过合理地组织和管理事件,可以提高代码的可维护性和用户体验。

    Flex事件解析以及Flex基础功能介绍

    Flex的核心之一在于其强大的事件处理机制。事件是Flex中实现用户交互的关键,涵盖了从用户操作(如点击、键盘输入)到数据变化(如数据绑定更新)的各个方面。理解并掌握Flex事件,是实现复杂界面逻辑的前提。 1. *...

    Flex 事件机制,flex入门学习

    在深入理解 Flex 事件机制之前,我们需要先了解一下基本概念。 1. **事件的概念** 事件可以视为一种通知机制,当特定条件满足时,事件被触发并通知感兴趣的接收者。例如,`MouseEvent` 类表示与鼠标操作相关的事件...

    flex 事件流原理

    Flex 事件流是Flex应用程序中事件处理的核心机制,它使得组件之间能够有效地通信和响应用户交互。在深入探讨之前,我们需要理解几个基本概念。 1. **事件机制**:事件是Flex中的一种通信方式,当特定条件满足时,...

    FLEX事件监听样例(JAVA代码)

    虽然压缩包中的`Test`文件没有给出具体代码,但我们可以通过以下简化的示例来理解Java处理Flex事件的基本过程: ```java public class FlexEventProcessor implements MessageBroker.MessageListener { @Override ...

    flex事件机制的分发

    Flex事件机制是Adobe Flex框架中一个关键的概念,它允许组件之间通过事件进行通信。...理解并熟练运用这一机制,能帮助开发者更好地设计和实现复杂的Flex应用程序。对于Flex开发者来说,掌握这些知识点至关重要。

    关于flex事件的讲解

    首先,我们要理解Flex事件模型的基础。在Flex中,事件是由Event类或其子类表示的,它们是传递信息的对象。当一个事件发生时,它会从源对象(通常是组件)出发,沿着事件流传播。这个流分为两个阶段:冒泡阶段和捕获...

    关于flex事件的讲解.rar

    本资料“关于flex事件的讲解.pdf”将深入探讨Flex事件系统,帮助学习者更好地理解和应用这一关键概念。 1. **事件模型**:Flex采用发布/订阅模型处理事件,事件源(如UI组件)发布事件,而感兴趣的接收者(监听器)...

    flex的事件详解

    **事件**是ActionScript 3.0和Flex开发的基础之一,它描述了系统或用户的行为引发的一系列动作。例如,用户点击按钮、键盘输入、鼠标移动等都可视为事件。这些事件触发了应用程序的响应,从而实现用户界面的动态更新...

    Flex的事件机制笔记

    Flex事件机制是Adobe Flex应用程序开发中的核心组成部分,它允许组件之间进行有效的通信和交互。对于初级Flex程序员或爱好者来说,理解这一机制至关重要。在本文中,我们将深入探讨Flex事件的各个方面,包括事件流、...

    Flex4.5事件机制

    Flex4.5事件机制是Flex应用程序开发中的...理解Flex4.5的事件机制对于开发高效、响应式的用户界面至关重要。通过熟练掌握事件的创建、监听、处理以及事件流的概念,开发者能够构建出更加动态和用户友好的Flex应用程序。

    flex控件事件

    理解并熟练运用Flex控件事件,可以极大地提升应用程序的用户体验和功能完整性。 1. 事件模型: Flex采用基于事件的模型来处理用户交互。事件是从事件源(通常是UI控件)发出的信号,然后由事件监听器处理。事件...

    flex弹性布局的理解。

    帮助理解flex属性。 1. 什么是 flex 布局 2. 基本概念 3. 容器的属性 4. 项目的属性1. 什么是 flex 布局 2. 基本概念 3. 容器的属性 4. 项目的属性 帮助理解项目属性 1. order 2. flex-grow 3. flex-shrink 4. flex-...

Global site tag (gtag.js) - Google Analytics