我目前正在使用用于映射 API 的绘图工具,每次双击鼠标时,地图服务都会执行测量并显示我正在绘制的线的长度。
我想通过调度 MouseEvent.DOUBLE_CLICK 来手动模拟这种双击,但地图服务没有监听这个默认的 Flex 事件。我怀疑 API 已经创建了一个自定义 MapMouseEvent 或类似的东西,当用户双击鼠标时正在调度它。
当我双击鼠标时,有没有办法确定正在调度哪个事件?
我目前正在使用用于映射 API 的绘图工具,每次双击鼠标时,地图服务都会执行测量并显示我正在绘制的线的长度。
我想通过调度 MouseEvent.DOUBLE_CLICK 来手动模拟这种双击,但地图服务没有监听这个默认的 Flex 事件。我怀疑 API 已经创建了一个自定义 MapMouseEvent 或类似的东西,当用户双击鼠标时正在调度它。
当我双击鼠标时,有没有办法确定正在调度哪个事件?
API 不一定会分派自己的事件。即使是,它也必须先侦听 MouseEvents。MouseEvent.DOUBLE_CLICK
可以使用或通过侦听连续MouseEvent.CLICK
或MouseEvent.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,那么您将无法访问某些对象,如果这些对象是地图服务正在侦听的对象,那么您就退出了运气。
public function cbMouseEvents( e:MouseEvent ):void{
trace( e.type )
}