2012-04-20 91 views
2

我使用谷歌地图v3与标记clusterer v3显示1000年的标记。我也有一个侧面板,列出了每个标记的标题。当用户将鼠标悬停在面板上的标题上时,我会为相应的标记设置动画,并停止在鼠标悬停时进行动画制作。标记消失后动画

当标记不在集群中时,这可以正常工作。标记位于群集中时出现问题。

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

在mouseout上我将标记动画设置为null,然后将标记的地图对象设置为null。这是你所期望的(隐藏标记),但是我不能让标记在任何后续的悬停事件中再次显示。标记仍然存在于适当的簇对象内,我可以调用setMap()来设置标记的地图属性,但标记仍然不会显示在地图上。下面是相关代码:

 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),那么我就会碰到我的bug。

因此,只有在调用setMap(null)之前动画没有停止时,问题才存在。我试着设置一个定时器,让动画在调用setMap之前停止几百毫秒,这有时会起作用,但有时会触发其他更糟的行为。

任何帮助解决此问题将不胜感激(并热切接受)!

回答

3

我已经经历THR同样的问题。这是API中的一个新bug。一旦我有一个简单的可重现示例,我打算使用我的企业帐户创建案例。

+0

谢谢丹, 这个错误已经被报告给谷歌地图api团队(问题#167)。你可以在这里找到http://code.google.com/p/google-maps-utility-library-v3/issues/detail?id=167&colspec=ID%20Type%20Status%20Priority%20Fixed%20Owner%20Summary%20Stars – 2012-04-22 15:47:56

+0

这仍然发生在api v3,(3.16)!!怎么了? – Nick 2014-07-22 16:35:52

1

这是一个丑陋的黑客攻击,但它可能在你的情况下工作:

marker.setAnimation(null); 

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

当我第一次看到@ heitor的回答时,我认为它会起作用。不幸的是,事实并非如此。通过试验setTimeout方法,我确定我必须在动画停止后等待约300毫秒,然后才能调用setMap(null),如果我想在下一次setMap(map)调用中保留标记。你们想怎么去除标记,然后在mouseout上重新绘制它?任何其他方式来解决这个问题? – 2012-04-20 23:27:00

0

当我在有很多标记的地图上做一个fitBounds(),然后尝试对其中一个标记进行动画处理时,我遇到了同样的问题 - 标记刚刚消失。我尝试了一切 - 设置一个超时,将其放入一个“空闲”侦听器 - 但没有任何工作。即使超时,只要我调用setAnimation(),标记就会消失。

这是一个非常讨厌的,冒险的解决方法,但经过多年的演奏后,我发现如果您手动移动地图,标记会再次出现。所以,如果你模拟与:

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) 
}); 

也许这将帮助别人!