Google maps api 3 谷歌地图api v3无平滑拖动
我开始使用MapsAPI v3实现我的软件。不幸的是,我发现V3API有一些严重的问题,这让我不再使用商业许可证 我的客户使用高清分辨率为1920x1080的显示器,地图占据了90%的屏幕空间。不幸的是,我所说的问题来了。当我在地图上用鼠标点击并开始拖动它时,它是非常不,真的很烦人。所有的乐趣都消失了 我使用windows XP、windows 7和windows 8尝试了一些不同的场景。我使用的浏览器是最新版本的Firefox、Chrome和IE。 以下是我尝试拖动地图时的结果:Google maps api 3 谷歌地图api v3无平滑拖动,google-maps-api-3,lag,Google Maps Api 3,Lag,我开始使用MapsAPI v3实现我的软件。不幸的是,我发现V3API有一些严重的问题,这让我不再使用商业许可证 我的客户使用高清分辨率为1920x1080的显示器,地图占据了90%的屏幕空间。不幸的是,我所说的问题来了。当我在地图上用鼠标点击并开始拖动它时,它是非常不,真的很烦人。所有的乐趣都消失了 我使用windows XP、windows 7和windows 8尝试了一些不同的场景。我使用的浏览器是最新版本的Firefox、Chrome和IE。 以下是我尝试拖动地图时的结果: 小屏幕分辨率
- 地图v2:
- 地图v3:
- 这里也一样。我注意到v3在平移地图时会触发很多事件,浏览器往往会阻塞(尤其是FF)。我这么说是因为我也使用了Bing Maps API,而
viewchange
(相当于谷歌center\u change
)每秒的事件数要小得多。它们还提供了方法addThrottledHandler()
,您可以使用该方法减少生成的事件数
据我所知,谷歌地图似乎在地图视图更新之前为每个mousemove
事件触发一个center\u changed
事件。因此,生成了很多事件,但没有一个事件在屏幕上复制;浏览器因地图视图更新而阻塞,或者地图可能会等待,直到不再有更改,然后才更新视图
编辑:如果我们阻止一些mousemove
事件到达谷歌地图,那么浏览器将不会被mousemove
事件以及谷歌地图由此事件生成的所有其他事件阻塞,如center\u changed
,地图将平稳平移。
为此,我们将事件侦听器添加到#map
div(我们也可以将其添加到body
标记)。我们为捕获阶段添加事件。当鼠标在屏幕上移动时,首先是主体
标记接收事件,然后是我们的#map
div,然后是谷歌地图元素(div、tiles)。这是捕获阶段。之后是冒泡阶段,在冒泡阶段中,事件从Google Maps元素返回到我们的#map
div,然后返回到body
标记。通常,事件处理程序是为冒泡阶段注册的,因此如果我们为捕获阶段注册一个处理程序,我们可以取消该事件,因此该事件将没有冒泡阶段。这也意味着谷歌地图将不会收到该活动
您可以增加period
和space
参数以终止更多事件。杀死太多事件意味着地图将开始从一个位置跳到下一个位置。杀得太少意味着所有事件都将到达谷歌地图,浏览器将被谷歌地图新生成的事件阻塞,因此地图将从一个位置跳到下一个位置。一些中间立场最有效
现在,在所有这些之后,谷歌地图将不会像Bing地图那样流畅。这是因为Bing地图使用惯性:当你剧烈移动地图时,地图会慢慢开始跟随鼠标,然后越来越快。这确实创造了一个非常平滑的平底锅
我发现一个有趣的事实是,即使鼠标不动,谷歌Chrome和Opera/Chromium每秒也会生成一个mousemove
事件!此代码也将终止这些事件(因为这些事件的距离为零)
(检查Firefox中的js控制台;您应该会看到一些事件。)
<html>
<head>
<style type='text/css'>
#map {
position: absolute;
width: 100%;
height: 100%;
margin: 20px;
}
</style>
<script type='text/javascript'>
var last = {time : new Date(), // last time we let an event pass.
x : -100, // last x position af the event that passed.
y : -100}; // last y position af the event that passed.
var period = 100; // ms - don't let pass more than one event every 100ms.
var space = 2; // px - let event pass if distance between the last and
// current position is greater than 2 px.
function init_map() {
map_div = document.getElementById("map")
// map
var map_options = {
center: new google.maps.LatLng(45.836454, 23.372497),
zoom: 8
};
map = new google.maps.Map(document.getElementById("map"), map_options);
// register event handler that will throttle the events.
// "true" means we capture the event and so we get the event
// before Google Maps gets it. So if we cancel the event,
// Google Maps will never receive it.
map_div.addEventListener("mousemove", throttle_events, true);
};
function throttle_events(event) {
var now = new Date();
var distance = Math.sqrt(Math.pow(event.clientX - last.x, 2) + Math.pow(event.clientY - last.y, 2));
var time = now.getTime() - last.time.getTime();
if (distance * time < space * period) { //event arrived too soon or mouse moved too little or both
console.log("event stopped");
if (event.stopPropagation) { // W3C/addEventListener()
event.stopPropagation();
} else { // Older IE.
event.cancelBubble = true;
};
} else {
console.log("event allowed: " + now.getTime());
last.time = now;
last.x = event.clientX;
last.y = event.clientY;
};
};
</script>
</head>
<body onload = "init_map()">
<div id="map"></div>
</body>
</html>