所谓的全局鼠标侦听,就是在整个应用中只在一处添加鼠标侦听,从而达来代替应用中漫天飞舞的addEventListener(MouseEvent.。
那么这样做的好处有哪些呢,首先是对鼠标侦听的管理,因为我们不需要在具体需要鼠标事件的地方添加侦听,
所以就不存在忘记移除侦听的情况。
一个应用中有上百个按钮或者更多,少了那么多的addListener和removeListener,会是多么轻松的一件事啊。
当然效率上也会有所提高,我不知道侦听到底会占用多少的系统资源,但是没有侦听总比有侦听占用的系统资源要少吧
那么具体怎么实现呢,你可以在com.codeTooth.actionscript.interaction.mouse.core包中找到,可以看到具体的实现,
当然你可以继续再优化。
用法像是这样,首先有一个文档类,当然也可以是其他地方。
var _mouse:MouseManager;
_mouse = new MouseManager();
// 指定容器,鼠标事件将添加在这个容器上
_mouse.container = this;
然后添加事件
_mouse.addEventType(new EventType(MouseEvent.MOUSE_DOWN));
_mouse.addEventType(new EventType(MouseEvent.MOUSE_UP));
_mouse.addEventType(new EventType(MouseEvent.MOUSE_MOVE));
_mouse.addEventType(new EventType(MouseEvent.MOUSE_OVER));
_mouse.addEventType(new EventType(MouseEvent.MOUSE_OUT));
注册指定的一类对象关注哪些鼠标事件
// 我这里的元素关注了很多鼠标事件
_mouse.addMouseTarget(new MouseTarget(MapElement,[MouseEvent.MOUSE_DOWN,
MouseEvent.MOUSE_UP,
MouseEvent.MOUSE_MOVE,
MouseEvent.MOUSE_OVER,
MouseEvent.MOUSE_OUT]));
// 而悬浮框关注了鼠标划出、划入、和移动事件
_mouse.addMouseTarget(new MouseTarget(IFloatBoxTarget,[MouseEvent.MOUSE_OVER,
MouseEvent.MOUSE_OUT,
MouseEvent.MOUSE_MOVE]));
最后以IFloatBoxTarget为例子看一下,注意这里实现了IMouseTarget接口这是必须要实现的。
public class ClassA extends Sprite
implements IFloatBoxTarget, IMouseTarget
{
// IFloatBoxTarget 的实现省略了 // 实现 IMouseTarget 接口
public function mouseTargetExecute(event:MouseEvent):void
{
if (event.type == MouseEvent.MOUSE_OVER)
{
// do something
}
else if (event.type == MouseEvent.MOUSE_OUT)
{
// do something
}
else if (event.type == MouseEvent.MOUSE_MOVE)
{
// do something
}
}
}
像这样,即使应用中有成百上千个侦听我们也只需要一个addListener就可以了,管理起来也非常方便。比如说我想让整个应用不接受鼠标事件,只需要在MouseManager中设一个开关就行了。你可以修改MouseManager来使得她变得更通用和强大。