深入剖析Flex事件机制

开发 后端
本文向大家介绍一下Flex事件机制的概念,每个事件对象中都包括事件类型(type)和事件源(target),便于event listener知道该事件的类型以及是谁抛出这样的事件。

本文和大家重点讨论一下Flex事件机制,首先我们来看一下Flex的概念,Flex是响应RIA(富客户网络应用)而出现的,Flex试图通过提供一个程序员们已经熟知的工作流和编程模型,让程序员比从前更快更简单地开发动画及RIA应用。

Flex简介

Flex是响应RIA(富客户网络应用)而出现的,Flex试图通过提供一个程序员们已经熟知的工作流和编程模型,让程序员比从前更快更简单地开发动画及RIA应用。在多层式开发模型中,Flex应用属于表现层。Flex的语言和文件结构也试图把应用程序的逻辑从设计中分离出来。

Flex最重要的两项技术是ActionScript和MXML,其中ActionScript到现在已经发展成了一门功能强大的面向对象语言,目前常用的是ActionScript 3;而MXML是一个可以让你在Adobe Flex中布局用户界面组件的一种XML语言, 描述了反映内容与功能的用户界面,通过MXML,编程人员无需对Flash有太多的了解就可以开发出用户体验很好的flash应用。

安装Flex builder

用户首先需要到Adobe公司的Flex网站下载http://www.adobe.com/products/Flex/,Flex Builder是收费的,但我们可以下载其中的试用版本,Flex Builder的现行版本为Flex Builder3。

安装Flex Builder可有好几种方式。

***种:直接安装Flex Builder到目标目录下即可使用;

第二种:将Flex Builder作为eclipse插件安装到用户的eclipse安装目录下,然后将Flex Builder目录下features和plugins中的文件全数拷贝eclipse的相应目录下,若我们需要借助MyEclipse来开发Flex应用(确实有这样的需要,以后会讲到),则需要往MyEclipse下的features和plugins目录进行同样的拷贝操作。

Flex事件机制

Flex事件中的基本概念

event objects(事件对象):所有的事件对象都是flash.events.Event或者其子类。比如说鼠标事件MouseEvent,计时器事件TimerEvent。每个事件对象中都包括事件类型(type)和事件源(target),便于event listener知道该事件的类型以及是谁抛出这样的事件。简单的理解,事件对象就是ActionScript中的各种事件类型的对象。
    event dispatchers(事件源):是事件发起的主体。所有的dispatcher都是EventDispatcher或其子类。事件触发源必须提供API让listener进行对该事件的注册(register)。简单的理解,事件源就是一个控件。
    event listeners(事件监听器):在AS 3.0中它往往表现为一个函数。我们必须为每个特殊的事件和事件源注册一个监听器,当事件发生的时候,事件源(dispatcher)会通知该监听器去处理制定的事件。简单的理解,监听器就是一个函数。

◆注册监听器

在AS 3.0中可以通过下面的语法格式进行注册。

  1. dispatcher.addEventListener(eventName, listener);  

当然在Flex中还有另外一种格式,在mxml文件中对一个控件的事件直接制定一个处理函数,如

  1. <mx:Button label="TestClick" click="clickHandler()"/> 

事件阶段

Flex事件机制中我们把事件触发源分为两类:一类是那些显示在界面中的元素抛出的事件,一类是那些不在界面中显示的元素抛出的事件。很简单,举个例子:***类如URLLoader对象去load图片或其他资源所抛出的如complete事件,就属于***类。界面上的一个按钮所抛出的click事件就是第二类,它会触发一个事件流,引发一系列的事件,它又分三个阶段:捕获(capture),执行(target) 和冒泡(bubble),姑且这样表达这三个阶段。

◆捕获阶段(capture)

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

如果你想在捕获阶段让listener收到消息并有所动作,那么你可以在注册的时候改变第三个参数为true,如下面的方法:object.addEventListener(MouseEvent.CLICK, onClick, true);

该阶段听起来很陌生,事实上它很少使用。但它却在事件流中扮演很重要的角色。它可以在事件到达子元素(child elements)之前被application捕获,当然也就可以阻 止事件到达子元素。

◆目标执行阶段(target)

在这个阶段是事件的执行阶段,也就是我们常用的用来处理事件流的代码。

◆冒泡阶段(bubble)

***的这个阶段其实就是***个阶段的逆向过程。它就是在事件代码执行完毕后通过子元素逐级向父元素发出该事件,一直到根元素。在这个阶段你不需要特别的为监听器指定什么,你只要正常的注册事件就可以了。监听器会在该阶段收到通知。但前提是该事件是能够bubble的。

◆垃圾回收

Flash Player是通过引用计数器(reference counting)以及标记与清除(mark and sweep)来实现垃圾回收的。

引用计数器简单的讲就是给每个对象分配的技术器,一旦该对象的计数器为0时,就表示该对象可能不再被使用,可以安全的清除了。它的弊端就是不能解决循环引用问题,一旦出现循环引用,就不能通过该方法进行垃圾回收。

而标记与清除(mark and sweep)就是为了解决循环引用问题的。它是通过在程序中遍历每个活动的、可到达的节点,一旦发现一些节点是处在活动节点之外的,就被认为不再有用,就可以被回收了。

这两种Flex事件机制是联合运行在垃圾回收过程中来保证正确回收资源。但他们并不能回收程序错误导致的垃圾。而监听器的注册就最容易导致这个问题的发生。

【编辑推荐】

  1. 技术分享 用FlexBuilder创建Flex项目
  2. Flex基础 创建***个Flex项目
  3. 解析Flex事件执行流程
  4. FlexBuilder3.0与Eclipse3.4的***结合
  5. 学习笔记 FlexBuilder2.0中如何使用基于Lists的控件 

 

责任编辑:佚名 来源: csdn.net
相关推荐

2010-08-09 16:01:37

Flex字体

2010-08-06 10:03:42

Flex事件

2010-08-12 16:10:44

Flex应用程序

2010-08-06 09:45:50

Flex事件机制

2010-08-12 15:35:44

Flex事件机制

2023-11-01 08:22:07

Spring发布器源对象

2010-08-10 13:58:00

Flex性能测试

2010-08-03 16:21:54

FlexFlash

2010-08-04 08:42:28

Flex和Flash

2010-08-06 15:20:25

Flex Builde

2010-08-13 09:54:23

Flex字体

2010-08-04 14:07:59

Flex事件机制

2010-07-29 10:33:59

Flex键盘事件

2010-08-12 11:29:01

Flex组件

2010-08-13 13:56:02

Flex事件机制

2010-08-06 09:56:06

Flex事件机制

2020-11-20 07:55:55

Linux内核映射

2010-09-17 12:39:51

JAVA反射机制

2021-08-16 07:26:42

服务订阅机制

2010-08-04 14:02:08

Flex事件机制
点赞
收藏

51CTO技术栈公众号