我在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成员,这使我对此处发生的事情感到更加茫然。
答案 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,那么你有两个选择:
创建一个MouseEvent的自定义子类,它覆盖stageX和stageY getter。您可以存储原始目标并自行执行localToGlobal计算,也可以使用克隆原始事件时存在的值存储stageX和stageY的静态值。
扩展Sprite并将您的调度程序添加到舞台上,以便MouseEvent库存正常工作。