如何检测Google Maps地图是否处于移动状态?
如何持续检测Google Maps地图是否处于移动状态?
我需要实时检测Google Maps的移动状态,覆盖按住鼠标拖动和松开后的惯性滑动全阶段。但目前的方案存在检测空白期:用drag事件搭配一次性idle事件时,加速拖动松开后,从dragend触发到idle触发的这段惯性滑动时间里,无法检测到地图移动,导致标记点位置更新中断。
试过的不理想方案
- 事件组合方案:尝试
bounds_changed、center_changed事件,但根据Google Maps官方事件说明,这些事件在地图惯性滑动阶段不会持续触发,无法覆盖全阶段。 - 定时器补全方案:用
drag触发时启动逻辑,dragend后用定时器轮询,idle时清除定时器,但效果不够流畅,代码如下:
this.changeListener = google.maps.event.addListener(this.map, 'drag', () => { let timer; this.bubbleHeading(); google.maps.event.addListenerOnce(this.map, 'dragend', () => { timer = setInterval(() => this.bubbleHeading(), 10); }); google.maps.event.addListenerOnce(this.map, 'idle', () => { clearInterval(timer); }); });
可行的解决方案:利用OverlayProjection获取实时可视区域
最终通过弃用getBounds()和getCenter()这类依赖事件触发更新的方法,改用Overlay的投影对象获取实时可视区域,实现了全程流畅的标记点更新:
- 借助自定义Overlay或现有Overlay实例,调用
overlay.getProjection().getVisibleRegion() - 该方法返回的可视区域数值会在地图惯性滑动阶段持续实时更新,无需依赖事件触发
- 基于这个实时更新的可视区域计算标记点位置,即可覆盖拖动、惯性滑动的所有移动阶段
效果差异
- 原方案:惯性滑动阶段标记点停止更新,直到地图完全静止
- 新方案:无论拖动还是惯性滑动,标记点全程实时更新,无中断
内容的提问来源于stack exchange,提问作者Michał B
相关产品推荐
相关产品推荐

