ActionScript3(AS3)类库学习之(四)——Event事件和定制自己的Event

Event对象在AS3的事件机制中具有重要的作用,它能存储特定事件的一些信息,比如鼠标事件存储鼠标的位置,它还包含一些能判断事件处理状态的属性,和一些能影响事件处理系统行为的方法。AS3中用Event类来作为所有Event对象的基类,这个基类位于flash.events package下。

一.事件机制
AS3将事件的处理过程分为Capturing,Targeting,Bubbling三个阶段。如下图所示,讲这个的文章很多,我就不多说了。
ActionScript3(AS3)类库学习之(四)——Event事件和定制自己的Event
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);

        }

 

你可能感兴趣的:(actionscript)