ActionScript MouseEvent.clone()出现故障?

时间:2009-04-08 00:12:37

标签: actionscript-3 events mouseevent dispatcher

我在ActionScript 3中尝试redispatch鼠标事件时遇到了一个问题,我确实有点不相信。我把它缩小到MouseEvent.clone()方法出现,好吧,完全坏了。以下事件处理程序:

    private function handleMouseMove( evt : MouseEvent ) : void
    {
        trace("mousemove", evt.stageX, evt.stageY);
        var newEvt : MouseEvent = evt.clone() as MouseEvent;
        trace("mousemoveclone", newEvt.stageX, newEvt.stageY);
    } 

以下输出结果,无限制:

mousemove 167 206 
mousemoveclone 0 0

这匹配我正在重新接收MouseEvent的代码接收的内容,因此我假设克隆函数已损坏。

这与链接文档指示应该发生的内容直接相矛盾,除非我遗漏了某些内容。我完全不知道我做了什么(或没做什么)可能导致这种行为。 AS3的人真的忘了在Event.clone()上阅读他们自己的文件吗?

我可以通过在我的特定用例中使用函数对象来解决这个问题,但我不想这样做。有什么想法吗?

编辑:看似正确克隆了localX和localY成员,这使我对此处发生的事情感到更加茫然。

3 个答案:

答案 0 :(得分:3)

这是一个已知的错误。您可以在此处查看错误报告:http://bugs.adobe.com/jira/browse/FP-343

其他所有东西都应该被克隆。您可以随时手动分配stageX和stageY,直到修复错误。

答案 1 :(得分:2)

我意识到这个线程已经休眠了7个月,但只是稍微更新一下 - 这在FP10和Flex4中仍然有效。如果您重新调度该事件,也会发生这种情况。即:

private function mouseListener( e:MouseEvent ):void
{
    dispatchEvent( e );
}

dispatchEvent()调用似乎等同于clone(),因此stageX和stageY设置为0

答案 2 :(得分:0)

这是一个非常古老的问题,但是当我用谷歌搜索解决方案时,它就出现了,而这里的内容还不够全面。

这个没有“修复”的原因是因为它按预期工作。调用getter时会计算stageX和stageY值,使用事件的目标进行localToGlobal转换。这是必要的,以便即使目标对象在调度事件后更改了位置,比例或旋转,数字仍保持正确。

如果你真的需要重新发送具有正确stageX和stageY值的MouseEvent,那么你有两个选择:

  1. 创建一个MouseEvent的自定义子类,它覆盖stageX和stageY getter。您可以存储原始目标并自行执行localToGlobal计算,也可以使用克隆原始事件时存在的值存储stageX和stageY的静态值。

  2. 扩展Sprite并将您的调度程序添加到舞台上,以便MouseEvent库存正常工作。