Клуб API Карт

Как повесить событие на перемещении карты? (map.action.Continuous?)

Пост в архиве.

Добрый день!

Подскажите, плиз, как повесить событие на перемещении карты? То есть когда юзер перетаскивает карту вниз-вверх, влево-вправо - чтобы срабатовало событие...

Как я понял, можно задействовать map.action.Continuous (http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/map.action.Continuous.xml), только как его юзать? Если можно - с примером..

Заранее, благодарю!

9 комментариев

map.events.add('actiontick') - минимальное уловимое событие движения карты.

Константин Петренко
28 января 2016, 04:45

Благодарю!

 

Только вот незадача... в параметре tick нет свойства pixelOffset (как в описании по ссылке выше).. а пиксельное смещение как раз оч нужно.. как его получить?

А вам что нужно?

Вы можете смотреть на разницу между map.getGlobalPixelCenter и map.action.getCurrentState().globalPixelCenter

Константин Петренко
28 января 2016, 04:45

Задача лежит в следующем - отобразить сообщение при щелчке на маркере, а при перемещении по карте - перемещать сообщение вместе с ним (маркером).

С отображением мне помогли разобрался - работает на ура (за что вам отдельное спасибо!):

 

var markerOffset = map.converter.globalToPage(   map.options.get('projection').toGlobalPixels(

        marker.geometry.getCoordinates(),

        map.getZoom()

    )

)

 

Теперь задача лежит в перемещении сообщения во время перемещения карты

 

Для этого получаю markerOffset и перемещаю туда сообщение средствами CSS:

 

 

$("#message")

.css({

top: Math.round(markerOffset[1])+'px',

left: Math.round(markerOffset[0])+'px'

});

 

 

 

 

 

map.events.add('actiontick', function (mapEventObject){

 

var oldGlobalPixelCenter = maps._globalPixelCenter;

    var newGlobalPixelCenter = maps.action.getCurrentState().globalPixelCenter;

 

    var leftnew = $("#message").css('left');

    var topnew  = $("#message").css('top');

 

leftnew = leftnew - Math.round(newGlobalPixelCenter[0] - oldGlobalPixelCenter[0]);

topnew  = topnew - Math.round(newGlobalPixelCenter[1] - oldGlobalPixelCenter[1]);

 

$("#message")

        .css('left', leftnew)

        .css('top', topnew);

 

 

})

 

Но перемещает оно по прежнему не так.. 

Вобщем.. как-то запутанно очень выходит..

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

 

Сообщение должно формироваться динамически, то есть во время создания маркера не присваивается

Вы фигню какую-то делаете.

У вас есть правильная функция - первая.

Во второй надо взять ее последнее значение(или высчитать еще раз), найти разницу между map.getGlobalPixelCenter() - и используйте функция. Поля начинаюшиеся с _ использовать НЕЛЬЗЯ!. И getCurrentTick()

Эту дельту прибавте к результату первой функции. Каждый раз новую дельту прибавляем к старому результату. А не как у вас..

У меня так движение открытых балунов при операциях с картой устроены. Вроде работает все

Константин Петренко
28 января 2016, 04:45

Спасибо

 

Еще один момент..

Событие actiontick отвечает за "минимальное уловимое событие движения карты", но если мы щелкнем по карте и "сделаем бросок мышью" - actiontick сработает только во время "броска", а во время автоматического перемещения - срабатывать не будет...  (проверял через console.log на событии "map.events.add('actiontick', function (mapEventObject) {})")

Как можно уловить полное движение карты?


P.S.: попытался выразиться как можно понятливей:-)

Тоже самое происходит и на вашем сайте (если открыть баллун и "броском" передвинуть карту)

Плавное движение карты, например при броске мышкой(кинетика) реализуется браузером и не может быть отловленно никак кроме как дергать getCurrentState карты по таймеру.

Константин Петренко
28 января 2016, 04:45

Насколько я понимаю, если бы кинетика реализовывалась самим браузером, то в предыдущей версии АПИ карт кинетика тоже работала.. Или я не прав?

По ссылке http://api.yandex.ru/maps/new_api.xml кинетика работает только в новой версии..

Да, в старой версии кинетики, как и плавных движений нет.