Отскок пин-кода на картах Google один раз

Я хочу один раз отскочить от пин-кода на карте Google. Следующий код заставит маркер отскочить, но он просто продолжает работать...

myPin.setAnimation(google.maps.Animation.BOUNCE);

Затем звонок

myPin.setAnimation(null);

делает анимацию остановленной. Установка таймаута работает, но длительность отскока не похожа на круглое число, поэтому сделайте это

  setTimeout(function(){ myPin.setAnimation(null); }, 1000);

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

Кто-нибудь знает, как это сделать лучше?

25
задан ekad 26 February 2018 в 16:06
поделиться

4 ответа

Хорошо, ни один из других ответов не работал достаточно хорошо, учитывая ограничения API. Итак, вот что я нашел.

  • Каждый отскок составляет около 700 мс в версии Google Maps js?v=3.13.
  • Вызов 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)

Предполагая, что:

  1. отскок происходит от взаимодействия с пользователем
  2. и вы не хотите обрезать текущую последовательность отказов, когда пользователь запускает другую на том же объекте
  3. , и вы не хотите отбрасывать этот запрос для выполнения другой последовательности отказов,

вы можете использовать setTimout в сочетании с методом jquery .queue , чтобы новый запрос отказов не прерывал текущий, но все еще помещал его в очередь для выполнения отказов последовательность после текущая завершается. (примечание: я использовал два отскока вместо одного, поэтому для 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);
});
7
ответ дан 28 November 2019 в 18:25
поделиться

Немного простой подход: анимация отказов Google, по-видимому, занимает ровно 750 мс за один цикл. Таким образом, просто установите время ожидания на 750 мс, и анимация остановится точно в конце первого отскока. У меня работает на FF 7, Chrome 14 и IE 8:

    marker.setAnimation(google.maps.Animation.BOUNCE);
    setTimeout(function(){ marker.setAnimation(null); }, 750);
32
ответ дан 28 November 2019 в 18:25
поделиться

Это сложный вопрос, на который пока нет идеального ответа, потому что, хотя 750 мсек отлично работает для настольного браузера, на мобильном устройстве он выглядит чахлым. Google на самом деле мало что добавил в API анимации, поэтому нет никаких решений через API.

Лучшее, что мне удалось сделать, - это установить значение тайм-аута на 900 мс, оно выглядит одинаково на рабочем столе, потому что оно использует 150-миллисекундный интервал, когда иконка останавливается между каждым отскоком, и дает медленное мобильное устройство немного дополнительного передышки для анимации.

Правка: мое решение внезапно перестало работать для меня. К сожалению. Если вы делаете это на мобильном телефоне, может быть, лучше вообще не беспокоиться об этом.

2
ответ дан 28 November 2019 в 18:25
поделиться
  marker.setAnimation(google.maps.Animation.BOUNCE);
        setTimeout(function() {
             marker.setAnimation(null)
        }, 6000);
0
ответ дан 28 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: