zoukankan      html  css  js  c++  java
  • 新人补钙系列教程之:AS3事件处理--事件流

    一个flash应用程序可能会非常复杂,比如,有很多可视实例嵌套在一起,这样的话会形成一个树形结构,这个结构的根是stage,然后一级级到不同的实例,一般来说,要把这个树形结构倒过来看,即stage在顶部,在stage中的实例一级级排列在下面,要参考帮助中的图。 

    这样的一个树状结构即display list,每个实例(stage也是实例)都是树中的一个节点(node),如何来处理这种复杂结构的事件呢?as3引入了事件流的概念 

    事件流用于描述事件发生在display list中,遍历其所有node的过程,它可以分为3个阶段: 

    1、捕获阶段(capture phase):从顶部(如stage)到目标 

    2、目标阶段(target phase):目标 

    3、冒泡阶段(bubbling phase):从目标到顶部 

    看一个例子: 

    1、建立一个display list,其包含了4个可视实例,root1,mc1,mc2,mc3 

    import flash.display.* 

    var mc1=new Sprite() 

    var mc2=new Sprite() 

    var mc3=new Sprite() 

    //this代表root1 

    this.addChild(mc1) 

    mc1.addChild(mc2) 

    mc2.addChild(mc3) 

    drawRect(mc1,0xff9900,200) 

    drawRect(mc2,0x0000FF,100) 

    drawRect(mc3,0xffbbff,50) 

    //绘制矩形 

    function drawRect(obj,c,l){ 

      obj.graphics.beginFill(c) 

      obj.graphics.drawRect(0,0,l,l) 

    } 

    2、为display list中的所有实例注册click事件侦听器 

    this.addEventListener("click",clickFunc) 

    mc1.addEventListener("click",clickFunc) 

    mc2.addEventListener("click",clickFunc) 

    mc3.addEventListener("click",clickFunc) 

    function clickFunc(evt:Event){   

      trace(evt.currentTarget.name+" is click") 

      } 

    } 

    3、测试一下,单击最小的矩形,看看事件的执行顺序 

    instance3 is click 

    instance2 is click 

    instance1 is click 

    root1 is click 

    从顺序中可以看出,事件流采用了冒泡机制,即从单击的目标(instance3)开始,向顶部流动,最后到达root1。 

    通过 

    trace(evt.eventPhase) 

    可以知道事件流的阶段,结果如下: 

    instance3 is click 

    2 

    instance2 is click 

    3 

    instance1 is click 

    3 

    root1 is click 

    3 

    2代表目标阶段,相应的实例即你所单击的实例,3代表冒泡阶段。 

    如果要使事件流使用捕获机制,在注册侦听时应多加一个参数,把useCapture参数设置为true 

    this.addEventListener("click",clickFunc,true) 

    如果两种机制都要使用,须注册两次侦听器,useCapture的的值分别为true,false 

    事件对象是Event类的实例,具有多个属性,其中target与currentTarget属性必须把它们分精楚。 

    对于一个简单的事件处理过程,分清target与currentTarget并没有必要,因为它们一般指向同一个对象,如对一个简单的mc容器注册侦听器,在处理事件过程中,这两个属性都指向了这个mc。 

    但在一个相对复杂的display list中,这两属性是不相同的,比如,在主场景中有一个实例名为mc的影片剪辑实例,此mc包含了一个子mc,假设实例名为mc1 

    如果为父级即mc注册一个click事件侦听器,当单击mc时,target与currentTarget都指向mc,当单击mc1时,target指向mc1,而currentTarget指向mc,因此,在很多应用中,可能有人会认为currentTarget会指向父级。 

    如果为子级和父级都注册一个侦听器,那target是指单击的目标,而currentTarget是指在处理事件(即活动)的目标,因为as3的事件处理有3个阶段(捕获、目标、冒泡),并且缺省时采用冒泡机制,当单击子级mc1时,currentTarget应先指向底层,并向上冒泡,即先指向mc1,再指向mc 

    所以,currentTarget属性应具备两条件,一是它注册了侦听器,二是正在处理事件,而target就指事件流中的target。例如,单击了mc1,不管事件如何冒泡(不管currentTarget指向谁),target都指向mc1, 

    小结:target属性在事件流的目标阶段,而currentTarget属性在事件流的冒泡阶段(如currentTarget有时指父级)和目标阶段(两属性的指向相同),当然也可以是捕获阶段。  (转载)

  • 相关阅读:
    MVC小系列(六)【无刷新的验证码】
    MVC小系列(五)【在过滤器里引入重定向】
    EF 打造冲不掉的标签
    EF一次请求公用一个实例
    Android 学习资源[转]
    核心ASP.NET
    C#之任务,线程和同步
    史上最全面的正则表达式
    新年程序员福利(多图)
    C#之网络
  • 原文地址:https://www.cnblogs.com/keng333/p/3170195.html
Copyright © 2011-2022 走看看