zoukankan      html  css  js  c++  java
  • 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/
    若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    手写编译器之词法分析器一
    手写编译器之前
    PAT(A) 1005. Spell It Right (20)
    PAT(A) 1001. A+B Format (20)
    PAT(A) 1073. Scientific Notation (20)
    PAT(A) 1061. Dating (20)
    PAT(A) 1058. A+B in Hogwarts (20)
    PAT(A) 1027. Colors in Mars (20)
    PAT(A) 1019. General Palindromic Number (20)
    PAT(A) 1031. Hello World for U (20)
  • 原文地址:https://www.cnblogs.com/studynote/p/2992401.html
Copyright © 2011-2022 走看看