动画后标记消失

时间:2012-04-20 20:17:22

标签: google-maps-api-3 markerclusterer

我使用带有marker clusterer v3的谷歌地图v3来显示1000个标记。我还有一个侧面板,列出了每个标记的标题。当用户将鼠标悬停在面板中的标题上时,我会为相应的标记设置动画,并停止在mouseout上设置动画。

当标记不在群集中时,此方法可以正常工作。标记在群集中时出现问题。

如果标记位于聚类中,我首先将标记的地图对象从null(之前由markerClusterer设置,以便将标记放入聚类后隐藏标记)更改为我的地图对象,然后为该标记设置动画。再次,这是有效的。正是在鼠标移动时,我遇到了我的问题。

在mouseout上我将标记动画设置为null,然后将标记的地图对象设置为null。这可以达到您所期望的效果(隐藏标记),但我无法在任何后续悬停事件中再次显示标记。标记仍然存在于相应的集群对象中,我可以调用setMap()来设置标记的map属性,但标记仍然不会显示在地图上。以下是相关代码:

        if (event.type === 'mouseover' || event.type === 'mouseenter' ) {       
            if (!marker.getMap()) { //marker is in a cluster
                inCluster = true;
                marker.setMap(map)
            } else {
                inCluster = false
            };
            marker.setAnimation(google.maps.Animation.BOUNCE);
        } else {
            marker.setAnimation(null);
            if (inCluster == true) { //hide the clusterized marker
                marker.setMap(null)
            }
        };

如果我注释掉两个setAnimation()调用,那么代码将起作用,标记可以显示,然后按预期隐藏(只是没有动画)。此外,当我玩控制台时,我可以在群集中显示标记,然后我可以为其设置动画,然后我可以对其进行去动画,然后我可以再次隐藏它,一遍又一遍。但是,如果我在取消标记动画之前调用setMap(null),那么我就会遇到我的错误。

因此,只有当动画在调用setMap(null)之前没有停止时才会出现问题。我已经尝试设置一个计时器让动画在调用setMap之前停止几百毫秒,这有时会起作用,但有时它会触发其他甚至更糟的行为。

任何帮助解决这个问题的人都会非常感激(并且热切地接受)!

3 个答案:

答案 0 :(得分:3)

我一直遇到同样的问题。这是API中的一个新bug。一旦我有一个简单的可重复示例,我计划使用我的企业帐户创建一个案例。

答案 1 :(得分:1)

这是一个丑陋的黑客,但它可能适用于你的情况:

marker.setAnimation(null);

if (inCluster == true) { //hide the clusterized marker
  while(marker.getAnimation()) ; // loop blindly until setAnimation sets to null
  marker.setMap(null)
}

答案 2 :(得分:0)

当我在带有大量标记的地图上执行fitBounds()然后尝试为其中一个标记设置动画时,我遇到了同样的问题 - 标记只是消失了。我尝试了一切 - 设置超时,将其置于“闲置”的监听器中 - 但没有任何效果。即使有超时,只要我调用setAnimation(),标记就会消失。

这是一个非常讨厌的hacky修复,但玩了很多年后我发现如果你手动移动地图,标记会重新出现。所以如果你用以下方法模拟:

map.panBy(1, 1)

...弹跳后,标记重新出现(至少对我而言)。如果它紧跟在fitBounds()之后,那么1像素的移动并不是很明显。

所以我的代码是这样的:

map.fitBounds(new_bounds);

google.maps.event.addListenerOnce(map, 'idle', function(){
    the_marker.setAnimation(google.maps.Animation.BOUNCE);
    map.panBy(1, 1)
});

也许它会帮助别人!