·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]鼠标事件MouseEvent用法及区别

时间:2015-06-12 14:00酷播
唯一的区别就是:MOUSE_OVER、MOUSE_OUT采用的是冒泡机制;而ROLL_OVER、ROLL_OUT采用的是非冒泡机制(关于冒泡机制的讲解请详细看我上一篇文章)。所以如果你非常习惯AS2编程,可以使用ROLL_OVER、ROLL_OUT,和原来的没什么区别。但我建议你还是习惯冒泡机制


很实用的通用方法:toString()。基本上所有的事件都带有这个方法,不肯定的时候就trace(event.toString())看一下,会发现内容比帮助文档还要全。囧一个。

下面进入正题,今天讲的是MouseEvent(鼠标事件)。

一、MOUSE_OVER、MOUSE_OUT和ROLL_OVER、ROLL_OUT的区别是什么?

唯一的区别就是:MOUSE_OVER、MOUSE_OUT采用的是冒泡机制;而ROLL_OVER、ROLL_OUT采用的是非冒泡机制(关于冒泡机制的讲解请详细看我上一篇文章)。所以如果你非常习惯AS2编程,可以使用ROLL_OVER、ROLL_OUT,和原来的没什么区别。但我建议你还是习惯冒泡机制,毕竟这个是AS3的指导方向。

同时,MouseEvent的事件中,也只有ROLL_OVER、ROLL_OUT这两个采取的还是非冒泡机制。

下面我给出一个比较区别的例子,但不做很具体的说明了:


如图所示,整个图形是一个MC,实例名为t1。里面的粉红色框为t1内的一个MC,实例名为t2。

(1) 在第一帧写入代码,给两个MC都增加侦听如下:
function p1(event:MouseEvent):void
{
trace("t1");
}
t1.addEventListener(MouseEvent.ROLL_OUT, p1);

function p2(event:MouseEvent):void
{
trace("t2");
}
t1.t2.addEventListener(MouseEvent.ROLL_OUT, p2);

编译该段代码,当鼠标从最左边沿中间移动,最终从右边移出。屏幕输出:
t2
t1

(2)代码还是上面,仅仅是把MouseEvent.ROLL_OUT修改为MouseEvent.MOUSE_OUT,编译后同样操作,屏幕输出:
t1
t2
t1
t1

说明ROLL_OUT采取的是非冒泡机制,而MOUSE_OUT采取的是冒泡机制。


二、令人困惑的DOUBLE_CLICK:鼠标双击动作

这个动作在AS2.0是没有的,属于AS3.0新加的事件。但是在使用的过程中,却有不少的麻烦问题,让我们一步步分析:

(1) 默认是关闭的,必须手动打开。
我们在舞台上创建一个MC,实例名为t1,在第一帧写入代码如下:
function p1(event:MouseEvent):void
{
trace("t1");
}
t1.addEventListener(MouseEvent.DOUBLE_CLICK, p1);

运行后,发现无效。为什么呢?因为t1没有打开支持鼠标双击,需要在第一行添加代码如下: t1.doubleClickEnabled = true;现在再运行,可以了吧?

但这个用法和大多的事件是很不相同的。

(2) 我们在t1内再创建一个MC,实例名为t2,然后再运行上述代码。
问题出现了,在新创建的MC区域,DOUBLE_CLICK事件不响应了。

为什么会发生这样的事情呢?难道因为新创建的t2,doubleClickEnabled为false,所以t1的双击冒泡事件受到t2的影响,冒不出来了吗?...囧

为证明并解决这个问题,我在第二行写入代码如下:
t1.t2.doubleClickEnabled = true;
运行后,果然,问题排除。

可有人要问了,那如果我的MC里面包含了许多子MC怎么办?难道要一个个打开?
那倒也不用那么麻烦,加入下面的代码即可:
t1.mouseChildren = false; //t1的子项不支持鼠标动作

但这个给人的感觉就像是打一个补丁...

(3) 诡异的冒泡事件
我们把代码稍稍修改下,如下所示:

t1.t2.doubleClickEnabled = true;
trace(t1.doubleClickEnabled)
function p1(event:MouseEvent):void
{
trace("t1");
}
t1.addEventListener(MouseEvent.DOUBLE_CLICK, p1);

function p2(event:MouseEvent):void
{
trace("t2");
}
t1.t2.addEventListener(MouseEvent.DOUBLE_CLICK, p2);

运行后,第二行的trace返回的结果是false,说明t1的双击属性没有打开。
然后我们在t2区域上方双击鼠标,灵异事件发生了!下面的2个函数均被触发了!
依次返回t2,t1。

这个究竟是怎么回事呢?我只好从说明上找根源,然后看到这么一段官方说明:“要使 doubleClick 事件发生,它必在以下一系列事件后面:mouseDown、mouseUp、click、mouseDown、mouseUp。 所有这些事件必须共享与 doubleClick 事件相同的目标。”

难道说,是因为DOUBLE_CLICK是由那5个事件组成,而打开t1.t2.doubleClickEnabled,相当于把t2所在区域的限制打开,导致处于该区域范围的t1也无效了吗?

总之,感觉AS3的鼠标双击事件,只是为了解决AS2没有该事件而做的一个半成品,并不能真正意义上称其为一个独立的事件。
 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器