2

マーカークラスターv3でグーグルマップv3を使用して、数千のマーカーを表示します。各マーカーのタイトルを一覧表示するサイドパネルもあります。ユーザーがパネルのタイトルにカーソルを合わせると、対応するマーカーをアニメーション化し、マウスアウトでのアニメーション化を停止します。

これは、マーカーがクラスター内にない場合に正常に機能します。マーカーがクラスター内にあるときに問題が発生します。

マーカーがクラスター内にある場合は、最初にマーカーのマップオブジェクトをnull(以前はmarkerClustererによって設定されていたため、クラスターに配置するとマーカーが非表示になるように設定)からマップオブジェクトに変更してから、マーカーをアニメーション化します。繰り返しますが、これは機能します。私が問題を経験するのはマウスアウトです。

マウスアウト時に、マーカーアニメーションを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)
            }
        };

2つのsetAnimation()呼び出しをコメントアウトすると、コードが機能し、マーカーを表示したり、期待どおりに非表示にしたりできます(アニメーション化されていないだけです)。また、コンソールをいじってみると、クラスターの外にマーカーを表示してから、アニメーション化してから、アニメーション化を解除してから、何度も何度も非表示にすることができます。しかし、マーカーのアニメーションを解除する前にsetMap(null)を呼び出すと、バグが発生します。

したがって、この問題は、setMap(null)を呼び出す前にアニメーションが停止していない場合にのみ発生します。setMapを呼び出す前にアニメーションを数百ミリ秒停止するようにタイマーを設定しようとしましたが、これは機能する場合もありますが、他の、さらに悪い動作をトリガーする場合もあります。

これを解決するための助けをいただければ幸いです(そして熱心に受け入れられます)!

4

3 に答える 3

3

私は同じ問題を経験しています。これはAPIの新しいバグです。簡単な再現可能な例ができたら、エンタープライズアカウントを使用してケースを作成する予定です。

于 2012-04-22T05:11:15.490 に答える
1

これは醜いハックですが、あなたの場合はうまくいくかもしれません:

marker.setAnimation(null);

if (inCluster == true) { //hide the clusterized marker
  while(marker.getAnimation()) ; // loop blindly until setAnimation sets to null
  marker.setMap(null)
}
于 2012-04-20T20:34:10.023 に答える
0

たくさんのマーカーがあるマップでfitBounds()を実行してから、マーカーの1つをアニメーション化しようとすると、同じ問題が発生します。マーカーが消えてしまいます。タイムアウトを設定し、それを「アイドル」リスナーに入れるなど、すべてを試しましたが、何も機能しませんでした。タイムアウトがあっても、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)
});

多分それは誰かを助けるでしょう!

于 2014-07-08T22:01:54.100 に答える