`

[转]AS3事件流的研究结果

UP 
阅读更多
http://www.flashas.net/asbc/20090215/3921.html


AS3的 事件流就三个阶段,捕获 > 目标 > 冒泡
而在鼠标事件中,共有10种鼠标事件,分别如下:
点击事件: MouseEvent.CLICK ,MouseEvent.DOUBLE_CLICK
按键事件: MouseEvent.MOUSE_DOWN ,MouseEvent.MOUSE_UP
悬停事件: MouseEvent.MOUSE_OVER ,MouseEvent.MOUSE_OUT ,MouseEvent.ROLL_OVER ,MouseEvent.ROLL_OUT
移动事件: MouseEvent.MOUSE_MOVE
滚轮事件: MouseEvent.MOUSE_WHEEL

最令我不解的就是
悬停事件: MOUSE_OVER  ,MOUSE_OUT  ,ROLL_OVER  ,ROLL_OUT

它们的具体工用是相似的
MOUSE_OVER = ROLL_OVER 
MOUSE_OUT = ROLL_OUT

唯一不同的是前者参与事件流的冒泡阶段,而后者则不参加,
黑羽书上的例子类似,一个内部有文本框的按钮,
MOUSE_OVER  ,MOUSE_OUT 事件中,鼠标移到按钮上,会触发over事件,当鼠标继续移,移到按钮里的文本上时,
就会触发文本的MOUSE_OVER事件,同一时间,按钮的MOUSE_OUT事件也会触发

而如果使用ROLL_OVER ,ROLL_OUT呢,这种情况下,鼠标移入按钮后,只要不移出按钮范围,按钮的OUT事件是不会触发的.

(________________________________
//括号内的内容为后期补充,实然是最终结果,建议先跳过看后面的,回头再看本段文字

此处我掉入了一个误区,不明白为什么移上子mc会触发移出事件,然后又触发移入事件,
其实不然,是事件流的原因,因为事件流机制默认是在冒泡阶段侦听的
所以整个流程解析就是,
1.先是鼠标移入按钮范围,触发按钮mc的①MOUSE_OVER事件,向上冒泡,没有其它对象侦听了,

2.鼠标继续移,移入内部影片剪辑a的范围时,触发mc的②MOUSE_OUT事件,同时又触发a的③MOUSE_OVER事件,
3.进入子影片剪辑a的冒泡阶段,因为a的父对象mc有侦听④MOUSE_OVER事件的,所以会触发mc的移入事件

4.鼠标移出a影片剪辑范围(仍未移出mc范围)时,触发a侦听的⑤MOUSE_OUT事件,
5.进入子影片剪辑a的冒泡阶段,触发mc的移出事件⑥MOUSE_OUT
6.鼠标重新移入到mc影片剪辑的范围,触发mc的⑦MOUSE_OVER事件

7.鼠标移出mc范围,触发mc的⑧MOUSE_OUT事件

//鼠标移入mc范围,未移入子影片剪辑a范围
//外部_移入_当前 mc _目标 mc <<mc的MOUSE_OVER生效 ①

//鼠标移入子影片剪辑a范围
//外部_移出_当前 mc _目标 mc <<mc的MOUSE_OUT生效 ②
//内部_移入_当前 a _目标 a   <<mc.a的MOUSE_OVER生效 ③
//外部_移入_当前 mc _目标 a  <<冒泡阶段,mc的MOUSE_OVER生效 ④

//鼠标移出子影片剪辑a范围
//内部_移出_当前 a _目标 a   <<mc.a的MOUSE_OUT生效 ⑤
//外部_移出_当前 mc _目标 a  <<冒泡阶段,mc的MOUSE_OUT生效 ⑥
//外部_移入_当前 mc _目标 mc <<mc的MOUSE_OVER生效 ⑦

//鼠标移出影片剪辑mc范围,回到舞台
//外部_移出_当前 mc _目标 mc  <<mc的MOUE_OUT生效⑧

上面是trace出来的结果,下面是源代码,场景中一个大影片剪辑mc,套一个小影片剪辑a

mc.a.addEventListener(MouseEvent.MOUSE_OVER,onFunA)
mc.a.addEventListener(MouseEvent.MOUSE_OUT,onFunB)
mc.addEventListener(MouseEvent.MOUSE_OVER,onFunC)
mc.addEventListener(MouseEvent.MOUSE_OUT,onFunD)
function onFunA(_evt:MouseEvent){
trace("内部_移入_当前",_evt.currentTarget.name,"_目标",_evt.target.name)
}
function onFunB(_evt:MouseEvent){
trace("内部_移出_当前",_evt.currentTarget.name,"_目标",_evt.target.name)
}
function onFunC(_evt:MouseEvent){
trace("外部_移入_当前",_evt.currentTarget.name,"_目标",_evt.target.name)
}
function onFunD(_evt:MouseEvent){
trace("外部_移出_当前",_evt.currentTarget.name,"_目标",_evt.target.name)
}


________________________________)





因为displayObject中 DisplayObjectContainer(容器)对象有一个属性mouseChildren,控制子显示对象是否接受事件,一般看到上面的话,而又知道mouseChildren属性的朋友,就会有疑问了(包括刚才的我),那这样我设显示对象的mouseChildren属性为false不就可以避免MOUSE_OUT事件在按钮内部触发了吗?
对了,这点黑羽在最后说明白了,在某些情况下,我们需要在子显示对象上写事件的,如果设了mouseChildren为false,则很不方便了.

最后,我对事件的冒泡过程不太明确,自己写了个小测试来验证了.
在场景中再一个矩形影片剪辑,实例名mc
双击进入后,再画一个矩形(稍小的),做成影片剪辑,实例名a
这样做成了一个父子套的关系,
然后写代码

mc.a.addEventListener(MouseEvent.CLICK,onFunA)
mc.addEventListener(MouseEvent.CLICK,onFunB)

function onFunA(_evt:MouseEvent){
trace(_evt.currentTarget.name,"_",_evt.target.name)
}
function onFunB(_evt:MouseEvent){
trace(_evt.currentTarget.name,"_",_evt.target.name)
}



运行,在单纯mc的范围上单击,返回的target是mc,currentTarget也是mc
输出结果:
mc _ mc


而如果鼠标再移入一点,在a影片剪辑上单击的时候,
事件流先到达目标阶段,触发a的侦听,然后冒泡阶段,再到mc
所以target一直是a,但currentTarget目标会在两次触发中分别为a(内层)和mc(外层)

输出结果:
a _ a
mc _ a


上面这个实验就是想证明自己的一个想法,冒泡事件是否触发的顺序是从底到顶的,上面的输出证实了这点理解.




这里可以返回上面看括号里的内容了,看完再接下面这段总结





总结:
1.事件流是面向DisplayObject的一个过程机制,但凡显示对象触发的事件,必有这个流过程,自上而下,再自下而上
2.事件流机制是在同一条路径上的父子关系的显示对象都会参与的(默认)
3.参与事件流的对象,对内部子对象,同样会触发MOUSE_OUT事件的
4.最重要的一点就是,子对象触发的事件,只要父对象有侦听,那么无论如何,父对象都会触发一次所侦听的事件
而且顺序是子对象先触发事件,然后父对象再触发(这是由冒泡阶段的顺序触发的)
5.将addEventListener函数中的第三个参数设为true,则只在捕获阶段侦听,对于没有子对象的元素,事件是不会触发的,只有当子对象同样侦听相同事件时,才会触发事件(因为没有目标阶段)

反正要理解事件机制,三个阶段的执行顺序及执行因素理解好后,下面的原理就很好理解了

如果设置addEventListener函数的第三个参数为true,会中断目标阶段的检测,但它始终会参加事件流,
所以ROLL_OVER和ROLL_OUT是实现不参加事件流(捕获和冒泡均不参加)操作的方法


呵呵,又加深了一点理解,开心ing.......

(本文花时颇长,其中有多次修改,可能文路上会有点乱,如有错误,敬请大家指正)
分享到:
评论

相关推荐

    开源码 as3 扩展瀑布流功能的DataGrid组件

    研究源码可以帮助你了解如何实现瀑布流布局、缓动效果和图片加载等功能,从而提升自己的 AS3 编程技巧。同时,这个开源项目也可能包含详细的文档或示例代码,帮助快速上手使用。 总之,这个开源的 AS3 DataGrid ...

    as3 chm as3.chm 帮助文档

    这些CHM文件是学习和研究AS3的宝贵资料,涵盖了从基础到高级的各个层面,无论是初学者还是经验丰富的开发者,都能从中受益。通过深入阅读和实践,可以掌握AS3的精髓,创造出富有表现力和互动性的Flash内容。

    AS3几个资料

    5. **事件处理**:AS3的事件驱动模型是其核心特性之一,通过监听和响应事件,可以实现用户交互和组件间的通信。 6. **面向对象编程**:AS3支持类、接口、包等面向对象概念,通过继承、封装和多态,可以构建可维护和...

    AS3NUI-airkinect-2-examples

    通过深入研究AS3NUI-airkinect-2-examples-f77401a这个压缩包内的代码,开发者不仅可以学习到AS3编程技巧,还能掌握如何利用Kinect 2.0的特性和功能,创造出创新的体感应用。这是一份宝贵的资源,对于想要在AS3环境...

    AS3+JAVA网游开发数据交互源码.rar

    AS3具有面向对象的特性,提供了强大的类型系统和事件驱动模型,使得在网络通信中处理异步操作变得简单。 2. **Java** Java是一种跨平台的编程语言,特别适合于构建大型分布式系统,如网游服务器。其强类型、面向...

    as3写的粒子与贝塞尔曲线碰撞

    在本文中,我们将深入探讨如何使用ActionScript 3(AS3)实现粒子系统与贝塞尔曲线的碰撞检测,这是创建类似“线条骑士”(Line Rider)游戏的关键技术。"线条骑士"是一款允许玩家通过绘制线条来引导一个小滑板者...

    AS3游戏-Games.rar

    AS3游戏-Games.rar是一个基于ActionScript 3(AS3)开发的微型游戏,主要针对初学者设计,目的是为了帮助他们理解和学习AS3语言在创建游戏中的应用,以及如何构建游戏的整体框架。AS3是Flash Professional中的编程...

    as3xls源代码

    AS3XLS是一款用于Adobe Flash Platform(包括ActionScript 3.0和Flex)的库,它允许开发者在AS3环境中创建、读取和...对于希望在Flash或Flex应用中集成Excel功能的开发者而言,AS3XLS源代码的获取和研究是极具价值的。

    as3+flashdevelop互动小游戏 源码

    FlashDevelop是一款免费、开源的AS3和Flex开发工具,它为开发者提供了代码编辑、调试、构建和自动化工作流。FlashDevelop具有语法高亮、代码补全、项目管理等功能,对于快速开发AS3项目非常方便。在提供的001_...

    flex+as3一款扑克游戏源码,服务端用smartfox

    2. **ActionScript 3**:深入理解AS3的面向对象编程,包括类、接口、包、事件处理、错误处理等核心概念。 3. **图形与动画**:研究Flex如何实现动态图形和动画效果,如Tween类、Timeline动画和Shape绘制。 4. **...

    flash as3 调用摄像头 保存为jpg 含源码

    在本文中,我们将深入探讨如何使用ActionScript 3(AS3)在Flash环境中调用摄像头并保存捕获的图像为JPEG格式。ActionScript是Adobe Flash Professional和Flash Builder中用于创建交互式内容的主要编程语言,而AS3是...

    基于flash(as3)做的捕鱼达人类的游戏源码

    1. **ActionScript 3基础**:AS3的基本语法、类结构、事件模型和数据类型,这些都是编写Flash应用的基础。 2. **游戏架构**:游戏可能采用了经典的MVC(Model-View-Controller)架构,将数据、视图和控制逻辑分离,...

    可做鼠标跟随切水果,连连看亮光效果AS3源码.rar

    在IT行业中,ActionScript 3(AS3)是一种强大的编程语言,主要应用于Adobe Flash平台,用于创建交互式网页内容、游戏以及丰富的互联网应用程序(RIA)。本压缩包中的资源是基于AS3开发的一个互动效果,包括鼠标跟随...

    as3 + fms3聊天室

    【描述】中的“基于FMS的AS3聊天室源代码”表明,该应用的核心在于利用了Adobe的Flash Media Server作为后台服务器,它支持实时流媒体和双向通信。ActionScript 3是Flash Player和Air应用程序的编程语言,它用于构建...

    as3 flv播放器

    初学者可以通过研究这两个文件来学习AS3 FLV播放器的实现细节。 总之,AS3 FLV播放器为初学者提供了一个学习如何在Flash环境中处理视频的起点。通过这个项目,你可以掌握AS3的基本语法、事件处理和组件使用,同时对...

    3D flash as3 源码 幕墙

    【3D Flash AS3 源码 幕墙】是一个针对3D图形编程的资源,主要使用Adobe ActionScript 3(AS3)语言编写。ActionScript是Flash平台的核心编程语言,而AS3版本引入了许多改进,包括面向对象编程的支持,使得开发更...

    一款AS3写的高级2级菜 menufivel

    本文将详细解析一款名为“menufivel”的高级二级菜单,该菜单由ActionScript 3(AS3)编写,适用于SWFADDRESS框架,具有高度可定制性和强大的功能,对于开发者来说,它是一个值得深入研究的优秀资源。 首先,让我们...

    photoFlow+AS3图片缩略图展示效果(含flash9源文件

    标题中的"photoFlow+AS3图片缩略图展示效果"是指一种使用ActionScript 3(AS3)开发的Flash应用程序,用于展示图片的缩略图。这种应用通常用于创建动态的、交互式的图像库,允许用户浏览和选择大量的图片。在Flash...

Global site tag (gtag.js) - Google Analytics