0

我目前正在使用用于映射 API 的绘图工具,每次双击鼠标时,地图服务都会执行测量并显示我正在绘制的线的长度。

我想通过调度 MouseEvent.DOUBLE_CLICK 来手动模拟这种双击,但地图服务没有监听这个默认的 Flex 事件。我怀疑 API 已经创建了一个自定义 MapMouseEvent 或类似的东西,当用户双击鼠标时正在调度它。

当我双击鼠标时,有没有办法确定正在调度哪个事件?

4

2 回答 2

0

API 不一定会分派自己的事件。即使是,它也必须先侦听 MouseEvents。MouseEvent.DOUBLE_CLICK可以使用或通过侦听连续MouseEvent.CLICKMouseEvent.MOUSE_DOWN事件来检测双击。没有办法(仅在 Flash 中)在不监听某个地方的一个或多个这些事件的情况下检测到双击。

地图服务也可能正在侦听 DOUBLE_CLICK 事件,但您没有从正确的对象分派 MouseEvent。例如,如果地图服务这样做:

mapRoot.mapChild.addEventListener(MouseEvent.DOUBLE_CLICK, performMeasurement);

你这样做:

mapRoot.dispatchEvent(new MouseEvent(MouseEvent.DOUBLE_CLICK));

什么都不会发生。

还有其他可能性:
当您实际执行鼠标双击时,会触发多个事件:MOUSE_DOWN、MOUSE_UP、CLICK、MOUSE_DOWN、MOUSE_UP、CLICK、DOUBLE_CLICK

地图服务可能会监听 MOUSE_DOWN,并在 MOUSE_DOWN 处理程序中添加 DOUBLE_CLICK 监听器,如下所示:

mapRoot.addEventListener(MouseEvent.MOUSE_DOWN, _mouseDownHandler);

private function _mouseDownHandler(event:MouseEvent):void
{
    var targ:InteractiveObject = event.target as InteractiveObject;
    targ.addEventListener(MouseEvent.DOUBLE_CLICK, _doubleClickHandler);
}

private function _doubleClickHandler(event:MouseEvent):void
{
    var targ:InteractiveObject = event.target as InteractiveObject;
    targ.removeEventListener(MouseEVent.DOUBLE_CLICK, doubleClickHandler);
    performMeasurement();
}

因此,您实际上可能需要调度事件组合来触发处理程序。


您可以尝试以下方法:

用于DisplayObjectContainer.getObjectsUnderPoint()获取可能响应点击的所有对象的数组。然后从该数组中的每个对象中,尝试调度各种 MouseEvents 序列,直到您从正确的对象中找到正确的事件。

但请注意,如果 areInaccessibleObjectsUnderPoint()在您测试的点返回 true,那么您将无法访问某些对象,如果这些对象是地图服务正在侦听的对象,那么您就退出了运气。

于 2011-05-14T05:44:15.407 回答
-2
public function cbMouseEvents( e:MouseEvent ):void{
    trace( e.type )
}
于 2011-05-13T20:07:23.200 回答