模拟鼠标事件AS3

时间:2009-10-13 08:56:20

标签: actionscript-3 events

我有一个项目涉及每次更新轮询硬件开关并将其状态转换为自定义事件:

ToggleSwitchEvent.BackWardButtonDown
ToggleSwitchEvent.BackWardButtonUp
ToggleSwitchEvent.Click
etc ....

硬件开关的作用类似于双键鼠标。因此,我希望能够将自定义ToggleSwitchEvent事件“注入”到显示列表中,并使其像MouseEvent一样,从点击与之交叉的InteractionObject中冒泡。这将允许我像使用MouseEvents一样将addEventListener添加到显示列表。

据我所知,问题是我需要引用DisplayList的叶节点来手动插入我的ToggleSwitchEvent。我想说在屏幕上的某个位置点击了开关,让DisplayList找出点击相交的InteractionObject,并调度我的ToggleSwitchEvent而不是MouseEvent。

是否有方法在AS3中模拟MouseEvent但使用自定义事件?

1 个答案:

答案 0 :(得分:2)

我不太明白......你想让自定义事件冒泡,或者自己解雇MouseEvent吗?

  1. 如果bubbles属性设置为true,则任何事件都会按预期冒泡...
  2. 如果您手动发送鼠标事件,它们也会冒泡,甚至可以正确计算stageXstageY ......
  3. 那么好运然后......;)


    修改

    好的,显示列表不会真正为你处理这个......实际上,你有两种选择......从舞台开始,然后通过它,始终保持在鼠标下...或者,从鼠标下的对象开始,在树中获取其路径,并在其父链中找到正确的InteractiveObject ...后者可以使用DisplayObjectContainer::getObjectsUnderPoint来完成...这里是代码...

    public static function dispatchEventUnderMouse(event:Event, stage:Stage, point:Point):Boolean {
        //return if stage is disabled
        if (!stage.mouseEnabled) return false;
        //find the topmost object
        var cur:DisplayObject = stage.getObjectsUnderPoint(point).pop();
        if (cur == null) cur = stage;
        //build the path
        var path:Array = [];
        while (cur != null) {
            path.push(cur);
            cur = cur.parent;
        }
        //traverse the path from the root to find the right InteractiveObject
        while (path.length > 0) {
            cur = path.pop();
            if (cur is InteractiveObject) {
                if (!(cur as InteractiveObject).mouseEnabled) {
                    cur = cur.parent;
                    break;
                }
                if (cur is DisplayObjectContainer) {
                    if (!(cur as DisplayObjectContainer).mouseChildren) break;
                }
            }
            else {
                cur = cur.parent;
                break;                  
            }
        }
        return cur.dispatchEvent(event);
    }
    

    你可能真的想在事件中注入正确的坐标,但我想你会想出来......;)