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);
        }

 

posted @ 2013-03-31 22:14  Jingle Guo  阅读(1978)  评论(0编辑  收藏  举报