2012-04-20 157 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) 
}); 

也許這將幫助別人!