Я использую Openlayers 2, и я создаю приложение карты. Я использую apache cordova, так что это просто javascript/html/css.
Он работает отлично для большинства случаев, но когда я увеличиваю и удаляю несколько раз (пальцами на сенсорном экране), иногда скальпинг перестает обновляться. Перемещение карты вокруг и увеличение/уменьшение масштаба обычно приводит к повторному запуску.
Мой вопрос: есть ли способ заставить ScaleLine контролировать перерисовку (кроме перемещения по экрану и случайного увеличения/уменьшения масштаба). Например, есть ли функция, которую я могу запустить, скажем, нажатием кнопки, чтобы принудительно выполнить перерисовку?
я пробовал
map.Control.Scaleline.update();
map.Control.Scaleline.draw();
Но это не работает
Спасибо!
PS: Я попытался открыть приложение с хром на рабочем столе, и поскольку у меня нет возможности сенсорного экрана, я не могу воспроизвести ошибку
Посмотрев на OpenLayers.debug.js, я мог видеть, что масштабирование обновляется в событии "moveend", которое запускается только при завершении касания (что не означает, что пользователь не позволяет завершить перетаскивание касания, например, с помощью масштабирования)
"move" всегда срабатывает, поэтому я решил его, вызвав "moveend" на событие "move".
map.events.on ({
"move": function () {
map.events.triggerEvent("moveend");
}
}
});
Он удаляет детали добавления определенных событий только на "moveend", но это решает проблему. Прокомментируйте, если у вас есть лучшее решение!
@atwinther был почти прав. Решение состоит в том, чтобы следить за "touchhend", а затем отправлять событие moveend. Тем не менее, только последние браузеры поддерживают это, поэтому для некоторых людей может быть неподходящим. По крайней мере, согласно Mozilla, это должно работать для последних Firefox и Chrome: https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent
Это то, что я сделал, что сработало, с неэквивалентным кодом:
var SYP = {
init: function() {
this.map = new OpenLayers.Map("map");
// workaround for ol2 bug where touch events do not redraw the
// graticule or scaleline
this.map.events.on ({
"touchend": function () {
SYP.map.events.triggerEvent("moveend");
}
});
},