Googleマップでピンを1回バウンスしたい。次のコードはマーカーをバウンスさせますが、そのまま続行します...
myPin.setAnimation(google.maps.Animation.BOUNCE);
次に電話する
myPin.setAnimation(null);
アニメーションを停止します。タイムアウトの設定は機能しますが、バウンスの継続時間はそれが丸い数値ではないようなので、これを行う
setTimeout(function(){ myPin.setAnimation(null); }, 1000);
バウンスアニメーションを途中で終了させ、ひどく見えるようにします。
誰かがこれを達成するためのより良い方法を知っていますか?
少し単純なアプローチ:Googleのバウンスアニメーションは、1サイクルで正確に750ミリ秒かかるようです。したがって、単にタイムアウトを750ミリ秒に設定すると、アニメーションは最初のバウンスの終わりに正確に停止します。 FF 7では、Chrome 14およびIE 8:
marker.setAnimation(google.maps.Animation.BOUNCE);
setTimeout(function(){ marker.setAnimation(null); }, 750);
現時点では、一度バウンスするための組み込みのアニメーションはありません。
twiceのバウンスで問題がなければ、これを使用することを強くお勧めします。
marker.setAnimation(4);
APIの制限を考えると、他の回答はどれも十分に機能しませんでした。これが私が見つけたものです。
js?v=3.13
_で約700msです。marker.setAnimation(null)
を呼び出すと、現在のバウンスが完了した後でのみマーカーのバウンスが停止します。したがって、710msがバウンスシーケンスで期限切れになってからmarker.setAnimation(null)
を設定すると、APIは現在のバウンスシーケンスを中断することなく追加のバウンスを実行し続けます。setAnimation(700)
を再び呼び出すと、現在のバウンスシーケンスが中断されます。正確ではありません。単純なケース(他の回答で見られるように):
_marker.setAnimation(google.maps.Animation.BOUNCE);
setTimeout(function () {
marker.setAnimation(null);
}, 700); // current maps duration of one bounce (v3.13)
_
仮定して:
setTimout
をjqueryの _.queue
_ メソッドと組み合わせて使用すると、新しいバウンス要求が現在の要求を中断するのを防ぎながら、キューに入れてバウンスシーケンスを実行できますafter現在のものが完了した後。 (注:1つではなく2つのバウンスを使用したため、msecは1400に設定されています)。
より現実的なケース:
_// bounce markers on hover of img
$('#myImage').hover(function () {
// mouseenter
var marker = goGetMarker();
function bounceMarker()
{
marker.setAnimation(google.maps.Animation.BOUNCE);
setTimeout(function ()
{
marker.setAnimation(null);
$(marker).dequeue();
}, 1400); // timeout value lets marker bounce twice before deactivating
}
// use jquery queue
if ($(marker).queue().length <= 1) // I'm only queuing up 1 extra bounce
$(marker).queue(bounceMarker);
}, function () {
// mouseleave
var marker = goGetMarker();
marker.setAnimation(null);
});
_
このコードを使用してください:
animation:google.maps.Animation.DROP
注:複数のマーカーでこれをトリガーしている場合は、marker.setAnimation( google.maps.Animation.BOUNCE );
を呼び出す前に次のコードを追加して、マーカーが現在アニメーション化していないことを確認する必要があります。
if( marker.animating ) { return; }
750msはデスクトップブラウザでは正常に動作しますが、モバイルデバイスでは発育が妨げられているように見えるため、これはまだ完璧な答えはありません。 GoogleはアニメーションAPIにあまり多くを追加していないため、APIを介したソリューションはありません。
私が達成できた最高の方法は、タイムアウト値を900ミリ秒に設定することです。これは、アイコンが各バウンス間で一時停止する150ミリ秒のミリ秒を利用し、ラグのあるモバイルデバイスにアニメーション用の余分な呼吸スペースを与えるため、デスクトップ上で同じに見えます時間。
編集:私のソリューションが突然機能しなくなりました。おっとっと。モバイルでこれを行っている場合は、バウンスをまったく気にしない方がよいでしょう。
良い答えをありがとう、ミリセンコンドを追加して統合しました
function toggleBounce(currentIcon) {
currentIcon.setAnimation(null);
if (currentIcon.getAnimation() != null) {
currentIcon.setAnimation(null);
} else {
currentIcon.setAnimation(google.maps.Animation.BOUNCE);
setTimeout(function(){ currentIcon.setAnimation(null); }, 900);
}
};
バウンスの完了後にピンがアニメーションを停止するには、ピンをドラッグ可能にする必要があることがわかりました。これを行うために見つけた最良の方法は、2つのタイムアウトを使用することです。
マーカーをドラッグ不可能にすると、アニメーションが停止します。意味を示すためにプランカーを作成しました: http://plnkr.co/edit/Gcns3DMklly6UoEJ63FP?p=preview
HTML
<div id="map-canvas"></div>
<p>
Bounce marker
<select id="bounceNumber">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
times.
<button onclick="bounceMarker()">Go!</button>
</p>
JavaScript
var marker = null,
toBounce = null,
toDrag = null;
function initialize() {
var mapOptions = {
zoom: 4,
center: new google.maps.LatLng(-25.363882, 131.044922)
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
marker = new google.maps.Marker({
position: new google.maps.LatLng(-25.363882, 131.044922),
map: map
});
}
function bounceMarker() {
var select = document.getElementById("bounceNumber"),
bounces = parseInt(select.options[select.selectedIndex].value),
animationTO = (bounces - 1) * 700 + 350,
dragTO = animationTO + 1000;
// Bounce the marker once
if (marker.getAnimation() !== null) {
marker.setAnimation(null);
clearTimeout(toBounce);
clearTimeout(toDrag);
setTimeout(function () {
marker.setDraggable(false);
}, 750);
} else {
// Workaround to make marker bounce once.
// The api will finish the current bounce if a marker is set to draggable.
// So use two timeouts:
// 1. to remove the animation before the first bounce is complete.
// 2. to make the marker not draggable after the first bounce is complete.
// Animations will stop once you make a marker not draggable.
marker.setDraggable(true);
marker.setAnimation(google.maps.Animation.BOUNCE);
toBounce = setTimeout(function () {
marker.setAnimation(null);
}, animationTO);
toDrag = setTimeout(function () {
marker.setDraggable(false);
}, dragTO);
}
}
google.maps.event.addDomListener(window, 'load', initialize);
私が知る限り、これはクロスブラウザで動作します。私はchrome、firefox、safari、operaでテストしました。これはInternet Explorerでまだテストしていません。
marker.setAnimation(google.maps.Animation.BOUNCE);
setTimeout(function() {
marker.setAnimation(null)
}, 6000);