[转]全局鼠标侦听

所谓的全局鼠标侦听,就是在整个应用中只在一处添加鼠标侦听,从而达来代替应用中漫天飞舞的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来使得她变得更通用和强大。

你可能感兴趣的:(UP,actionscript)