ActionScript3(AS3)类库学习之(四)——Event事件和定制自己的Event
Event对象在AS3的事件机制中具有重要的作用,它能存储特定事件的一些信息,比如鼠标事件存储鼠标的位置,它还包含一些能判断事件处理状态的属性,和一些能影响事件处理系统行为的方法。AS3中用Event类来作为所有Event对象的基类,这个基类位于flash.events package下。
一.事件机制
AS3将事件的处理过程分为Capturing,Targeting,Bubbling三个阶段。如下图所示,讲这个的文章很多,我就不多说了。
1.当目标对象不在display list里面时,Flash Player会直接让目标对象来处理这个消息。
2.某些特殊的事件,比如enterFrame和init事件,会直接让目标对象来处理这个消息。
3.某些事件有Capturing,Targeting阶段,没有Bubbling阶段。Event类中的bubbles属性可以来判断事件是否有Bubbling阶段。
4.某些事件有默认的行为,比如用户在输入框中输入字母,默认的行为会将该字母显示在文本框里。
二.事件的状态
Event基类中有几个属性用来记录事件的信息和处理状态,这些属性在事件触发时就存在,且随着事件的处理,系统会自动将属性改为相应的值,我们可以获取这些属性的值,但是不能进行设置。
1.type属性表明事件的类型。
2.eventPhase属性表明当前事件的处理阶段,用EventPhase.CAPTURING_PHASE,EventPhase.AT_TARGET,EventPhase.BUBBLING_PHASE这三个值来分别代表事件处理的不同阶段。
3.target属性表明目标对象。
4.currentTarget属性表明当前处理事件的对象。
5.对于不同的事件,可能会有各种不同的相关信息,这时就需要定义一些Event的子类来记录这些信息,比如鼠标事件存储鼠标的位置。
三.改变事件的行为
Event类提供了一些方法来改变事件的行为。
1.改变事件的默认行为。
某些事件有默认的行为,默认的行为有些是可以阻止的,有些是不可以阻止的。用cancelable属性可以判定默认行为是否能被阻止。如果可以阻止,用preventDefault()函数阻止,如果不能阻止,该函数将没有作用。
2.阻止事件流。
在某些时候,如果我们觉得在某个函数里,一个事件已经被合理的处理了,不想再被之后的Listener处理,就可以使用stopPropagation或stopImmediatePropagation函数来阻止事件流。
stopPropagation阻止当前目标对象之后的目标对象的Listener。
stopImmediatePropagation阻止当前和之后的目标对象的Listener。
四.定制自己的事件
虽然AS3提供了很多的事件,但是有时候我们可能会想要定义自己的事件。
定义自己的事件其实很简单,需要注意的就是EventDispatcher用clone方法来分发事件,如果你需要再次分发捕获的事件,且触发的函数里要用到你自己定义的事件属性,则你必须要重载clone方法。如果你想要在trace的时候看到你自己定义的事件属性,那么你必须要重载toString函数
下面我们来试着定义一个自己的事件。
public class WalkEvent extends Event
{
public static const WALK:String = "WALK";
public var direction:String;
public function WalkEvent(typ:String, dir:String, bub:Boolean=false, c:Boolean=false)
{
super(typ, bub, c);
direction = dir;
}
public override function clone():Event
{
return new WalkEvent(type,direction, bubbles, cancelable);
}
public override function toString():String
{
return formatToString("WalkEvent", "direction", "type", "bubbles", "cancelable");
}
public class People extends EventDispatcher
{
public var name:String;
public var sex:String;
public var age:int;
public var salary:int;
public function People(n:String,sx:String,a:int,sa:int)
{
name = n;
sex = sx;
age = a;
salary = sa;
}
public function Up():void
{
dispatchEvent(new WalkEvent(WalkEvent.WALK, "up"));
}
public function Down():void
{
dispatchEvent(new WalkEvent(WalkEvent.WALK, "down"));
}
public function Right():void
{
dispatchEvent(new WalkEvent(WalkEvent.WALK, "right"));
}
public function Left():void
{
dispatchEvent(new WalkEvent(WalkEvent.WALK, "left"));
}
}
public function Main()
{
var people:People = new People("Jingle", "female", 30, 2000);
people.addEventListener(WalkEvent.WALK, doWalk);
this.addEventListener(WalkEvent.WALK, traceWalk);
people.Up();
people.Left();
people.Right();
people.Down();
}
public function doWalk(e:WalkEvent):void
{
var people:People = e.target as People;
trace(people.name + " " + e.type + " " + e.direction);
dispatchEvent(e);
}
public function traceWalk(e:Event):void {
trace(e);
}
作者:Jingle Guo
出处:http://www.cnblogs.com/studynote/
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.