在群里有人问了个问题:
为什么我把父剪辑的 mouseEnabled 设置为 false 但父剪辑还是可以侦听到 鼠标事件?
很有意思的一个问题,不是么!
AS3 里使用了事件流机制。简单说来一个完整的事件流应该从 Flash Player 到目标然后再回到 Flash Player。我们用一个简单的例子看看如何描述这个问题。
假如有如下结构的SWF文件,场景里有一个MovieClip(以下简称MC) A,A 里面包含一个名为 B 的MC,B 里面又包含 MC D。 有些复杂了,还是画个简单的图吧。
|-stage
..|-A
….|-B
……|-D
然后我们假设 D 触发了CLICK 事件,那么事件流程应该是:
stage? ->? A? ->? B? -> D? ->? B? ->? A? -> stage
这里有几个定义, 先看这一段:[ stage? ->? A? ->? B ], 这段在事件流当中我们定义为? 捕获阶段(是否记得addEventListener的第三个参数?);
我们触发事件的对象 [ D ] 也给它定义一个阶段,命名为:目标阶段;
最后 [ B? ->? A? -> stage ] 这阶段定义为 冒泡阶段。
PS:小建议,如果觉得搞不清为什么事件为什么会从stage跑到目标再回到stage这样的问题的话,还是别去管它了。只要记住不管这个事件在哪里发生, 总是会从stage 出发,然后找到触发事件的对象,再回到stage。
这样,一个完整的事件流由 捕获, 目标和冒泡 这三个阶段构成。
更多事件流的信息请访问黑羽博客:http://www.kingda.org/archives/kingda/2006/07/as305.html
扯了这么远,回到开始的话题。
当 我们设置对象的 mouseEnabled 值的时候,它只影响对象本身不会触发事件,但这并不影响对象在事件件中的地位。也就是说当对象的子对象触发鼠标事件的时候,自身也会伴随发送事件。想想整 个事件流,也就不难理解为什么我把父剪辑的 mouseEnabled 设置为 false 但父剪辑还是可以侦听到 鼠标事件。
所以,要禁止一个对象的触发交互事件,完整的做法是 mouseEnabled=false; mosueChildren=false; 同时设置这两个值。
好了,说了一堆全是文字。动手试一下:
- 在场景里画一个圆,选个红色或是什么的,保存为影片剪辑;
- 继续在场景里画一个方框,颜色和前面的圆区分开就行,位置最好重叠;
- 同时选中的圆(影片剪辑)和刚画好的方框,保存影片剪辑;
- 再在主时间轴上添加代码:getChildAt(0).addEventListener(MouseEevnt.MOUSE_OVER, function (e){trace(“overed”);});
- Ctrl+ENTER 运行测试,看看运行效果。
- 再添加一行代码:getChildAt(0).mouseEnabled = false;
- 再测试运行。是不是注意到区别了呢?