事件基础知识

来源:互联网 发布:扫描仪ocr软件下载 编辑:程序博客网 时间:2024/06/04 23:21

什么是事件:是对象内部状态发生了变化,或者对象做某些动作时(或做之前,做之后)向外界发出的通知。

注册时间的基本形式:

1注册事件侦听器

处理事件的对象.addEventListener(事件类型,侦听器函数)

2定义事件侦听器

function 侦听器函数(e:事件类):void(默认为void){

此处为响应事件执行的动作

}

移除事件的基本形式:

处理事件的对象.removeEventListener(事件类型,侦听器函数)

分析:

处理事件的对象:

AS3处理事件最关键的是addEventListener()函数(或称为方法),这个函数是在EventDispatcher类定义的,这个类中共有六个实例方法:

EventDispatcher()     构造函数,可用于创建实例

addEventListener()   用于注册事件侦听器

dispatcherEvent()   用于自定义事件

hasEventListener()   检测是不是注册某个事件侦听器

removeEventListener()  用于移除事件侦听器

willTrigger()            检测是不是注册某个事件侦听器

由此可以看出,EventDispatcher类主要用于事件侦听器的注册,移除等。由于DisplayObject类是EventDispatcher类的子类,而DisplayObject类是所有显示类的父类,因此,所有显示对象都可以看成是EventDispatcher类的实例,所以所有显示实例都能成为处理事件的对象。(注意一点,timer类同样继承了EventDispatcher类,因此timer对象同样可以成为处理事件的对象)

事件类型:

在事件处理中,事件主要由事件类型,事件对象等组成。事件类型一般用常量字符串表示,但在实际编程中,一般不直接使用常量字符串表示,而是用事件类的的静态属性来表示字符串。

侦听器函数:

定义事件侦听器函数时必须定义唯一一个参数,这个参数实际上是事件类的实例即事件对象,其数据类型是相关事件类型所属的类。

事件对象:

在事件处理过程中,系统会自动创建一个时间类的实例作为参数传递给事件侦听器函数。这个参数往往称为事件对象。事件对象是不可见的,用于后台操作,信息交流。

事件类的构架:(略)

Event类定义了事件处理所需的共同的属性和方法(Event类是一种特殊的抽象类,因为它可以实例化)。

事件流适用于显示列表中,说明事件对象在显示列表中穿行,遍历其所有节点的过程:

捕获阶段:事件对象从根节点到目标节点。侦听器侦听事件对象是不是流过,若侦听到事件对象流过,则执行侦听程序。

目标阶段:目标节点,侦听器侦听事件对象是不是流过,如果侦听到事件对象流过,则执行侦听程序。

冒泡阶段:事件从目标节点流到根节点。侦听器侦听事件对象是不是流过,若侦听到事件对象流过,则执行侦听程序。

在使用addEventListener()函数时,有名为useCapture的第三个参数,默认值为false,即在默认情况下,侦听器不在捕获阶段处理事件,而在目标阶段和冒泡阶段处理事件,如果修改为true,则侦听器只在捕获阶段处理事件。如果想同时让侦听器在捕获阶段和冒泡阶段处理事件,则应把侦听器注册两次,第一次把useCapture设置为true,第二次把useCapture设置为false。

Event类的部分实例属性:

bubbles:是一个只读属性,用来表示此事件是不是可以使用冒泡机制,如果为true,说明此事件具有冒泡阶段,如果为false,说明此事件不具有冒泡阶段。

eventPhase:是一个只读属性,表示事件流的阶段。这个属性是通过数字来表示的,其中1表示冒泡阶段,2表示目标阶段,3表示冒泡阶段。

target:该属性指向事件目标。

currentTarget:该属性指向事件对象当前所在的处理事件的对象。

type:表示事件类型(常量字符串)

事件的默认行为:

默认行为是指当事件对象被调度时,flash播放器会自动显示与此事件相关的行为,因为这个行为是由flash播放器自动显示的,所以这样的行为称为默认行为。

例如,在一个输入文本的实例中,当用户输入文本时,会触发TextEvent.TEXT_INPUT事件,这时,flash会把文本显示出来,“显示输入文本”这个行为即默认行为。

可以通过Event类的实例方法PreventDefault()方法来阻止默认行为的发生,这是Event类的实例方法。

要想知道该方法是不是被调用,可以用isDefaultPrevented()方法来测试,如果为true,则代表调用,如果为false,则代表没有调用。

要想知道某个默认行为能不能被阻止,可以通过Event类的cancelable属性查看,true表示可以阻止,false表示不可以阻止。

要注意一点:有些事件没有相关的默认行为。

事件的优先级和事件阻止:

当为同一个处理事件的对象注册多个相同的事件类型时,事件侦听器的执行会有一定的优先级。

addEventlistener()函数有第四个参数,一般用priority表示,用来指定侦听程序的优先级,优先级使用数字表示的,默认值为0,此时,侦听程序的优先级相同,按照注册事件侦听器的先后顺序来执行。在指定addEventListener()函数的第四个参数时,可以使用正数,负数,整数,按照数字的大小来决定侦听程序执行的先后顺序,大的先执行。

如果想改变一个已经存在的侦听程序的优先级,先调用removeEventListener()删除事件,再重新注册事件侦听器。

 

Event类提供了两个重要的实例方法来阻止事件对象的传递,其中stopPropagation()方法是用来阻止事件流中当前处理事件的对象以后的事件对象的传递。

stopImmediatePropagation()方法则会阻止当前侦听程序以后的所有。

因此事件流中如果每个显示对象只注册一个事件侦听器,使用这两个方法是一样的,但是,当一个显示对象注册多个相同的事件类型时,这些侦听程序会有优先级,stopImmediatePropagation()方法将阻止优先级低的或者优先级相同但是靠后注册的,而stopPropagation()方法对这些并没有影响。

关于弱引用 (略)

处理DisplayObject类的事件

 DisplayObject类具有六个基本事件类型,这六个基本事件类型都是由Event类来管理的。

EVENT.ACTIVATE  active  当播放器获得系统的焦点时触发

EVENT.DEACTATIVE     deactivate  当播放器失去系统的焦点时触发

EVENT.ADDED    added     当显示实例被添加到显示列表时触发(触发事件在注册该事件的事件侦听器之后,该事件具有不活捕获阶段和冒泡阶段,事件目标是添加到显示列表的显示对象)

EVENT.REMOVED    removed   当显示实例从显示列表中移除时触发

ENTER_FRAME  enterFrame   播放头进入新的帧时触发,如果播放方头不动或者只有一帧,则继续以帧速率触发

EVENT.RENDER  render     更新显示列表时触发。

由于DisplyObject类的这六个基本事件类型都是由Event类来管理的,所以在处理事件时,必须要在DisplayObject类和Event类之间发生关系。DisplayObject类的实例是处理事件的对象,,而Event类的静态属性是事件类型,Event类的实例是事件对象,侦听器函数必须接受Event类的实例作为参数,这就是事件的最基本原理。

 

 

原创粉丝点击