【问题标题】:Markers disappear after animating动画后标记消失
【发布时间】:2012-05-02 10:30:16
【问题描述】:

我使用带有标记聚类器 v3 的谷歌地图 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),那么我遇到了我的错误。

所以,只有在调用 setMap(null) 之前动画没有停止时,才会出现问题。我尝试设置一个计时器,让动画在调用 setMap 之前停止几百毫秒,这有时有效,但有时它会触发其他更糟糕的行为。

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

【问题讨论】:

    标签: google-maps-api-3 markerclusterer


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 当我第一次看到@heitor 的回答时,我认为它会起作用。不幸的是,事实并非如此。通过尝试 setTimeout 方法,我确定如果我想在下一次调用 setMap(map) 时保留标记,我必须在动画停止后等待大约 300 毫秒才能调用 setMap(null)。你们如何看待仅删除标记然后在鼠标悬停时重新绘制它?还有其他解决问题的方法吗???
    【解决方案3】:

    当我在有很多标记的地图上执行 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)
    });
    

    也许它会对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2018-04-20
      • 2022-12-03
      • 2018-01-31
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多