2012-04-20 8 views
2

Я использую карты google v3 с кластерным кластером v3 для отображения 1000-х маркеров. У меня также есть боковая панель, в которой перечислены заголовки каждого маркера. Когда пользователь наводится над заголовком в панели, я анимация соответствующего маркера, и я прекращаю анимацию на мыши.Маркеры исчезают после анимации

Это прекрасно работает, когда маркер не находится в кластере. У меня проблема, когда маркер находится в кластере.

Если маркер находится в кластере, я сначала меняю объект карты маркера с нуля (ранее заданный маркером Clusterer, чтобы скрыть маркер, когда он помещает его в кластер), к моему объекту карты, а затем я анимирую маркер. Опять же, это работает. Я нахожусь в том, что испытываю свою проблему.

В режиме мыши я установил анимацию маркера в нуль, а затем установил нужный объект карты маркера. Это делает то, что вы ожидаете (скрывает маркер), но я не могу заставить маркер показывать снова на любом последующем событии зависания. Маркер все еще существует внутри соответствующего объекта кластера, и я могу вызвать 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) перед деанимацией маркера, я ударил свою ошибку.

Таким образом, проблема возникает только в том случае, если анимация не остановлена ​​до вызова setMap (null). Я попытался установить таймер, чтобы дать анимации несколько сотен миллисекунд, чтобы остановиться, прежде чем вызывать setMap, и это иногда срабатывает, но в других случаях это вызывает другое, даже худшее поведение.

Любая помощь в решении этого вопроса будет принята с благодарностью (и с готовностью принята)!

ответ

3

Я испытывал Чет такой же вопрос. Это новая ошибка в API. Я планирую использовать учетную запись своего предприятия, чтобы создать случай, когда у меня будет простой воспроизводимый пример.

+0

Thanks dan, Эта ошибка уже сообщалась команде google maps 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 –

+0

Это все еще происходит на api v3, (3.16)! Как жизнь? – Nick

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). Что вы, ребята, думаете о том, чтобы просто удалить маркер, а затем перерисовать его на мыши? Любые другие способы решения проблемы ??? –

0

У меня такая же проблема, когда я делаю fitBounds() на карте с большим количеством маркеров, а затем пытаюсь оживить один из маркеров - маркер просто исчезает. Я попробовал все - установил тайм-аут, поставив его в «незанятый» слушатель, но ничего не получилось. Даже с таймаутом маркер просто исчезнет, ​​как только я вызову setAnimation().

Это действительно неприятное, взломанное исправление, но после долгой игры я обнаружил, что если вы вручную переместите карту, маркер снова появится. Так что, если вы имитировать, что с:

map.panBy(1, 1) 

... после того, как вы делаете сильный удар, то маркер появляется снова (по крайней мере, для меня). Движение в 1 пиксель на самом деле не заметно, если оно сразу следует за fitBounds().

Так что мой код что-то вроде этого:

map.fitBounds(new_bounds); 

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

Может быть, это поможет кому-то!

Смежные вопросы