АКТУАЛИЗАЦИЯ v4.2.0 вече поддържа собствени събития movestart и moveend
map.on('movestart', function(event) {
//To Remove after first use: ol.Observable.unByKey(event);
});
map.on('moveend', function(event) {
//To Remove after first use: ol.Observable.unByKey(event);
});
За версии на OpenLayers 3 преди пускането на v4.2.0
Добре, така че междувременно без събитието movestart
и със задействането на moveend
само ако има действително движение в картата, ето как успях да постигна поведение movestart
и moveend
.
jsFiddle:
var pan = ol.animation.pan({
duration: 700,
source: this.map.getView().getCenter()
});
map.beforeRender(function(map, frameState) {
var stillPanning = pan(map, frameState); // returns false panning is done
if (stillPanning) {
// do movestart stuff here
if (!everDone) {
doSomething();
everDone = true;
}
} else {
// do move end stuff here
undoSomething();
everDone = false;
}
return stillPanning;
});
map.getView().setCenter(geom);
Така че защо това работи?
ol.animation.pan
връща ol.PreRenderFunction
, което връща false if анимация не е пълна
Писането на персонализирана функция и предоставянето й на map.renderBefore
вече може да се използва за писане на обвивка около панорамна анимация, както е показано по-горе
Цялата работа с everDone
е, защото разделът stillPanning
ще бъде извикан многократно. Това е добре, ако това, което искате да правите там, може да приеме многократни обаждания, но ако искате да превключите нещо, тогава искате да го направите само веднъж.
поведение на 'moveend' moveend
обратното извикване се задейства само ако картата действително се премести. Това е добре, но ни пречи да извършваме дейности преди анимация, като просто ги правим преди анимацията да е готова. Ако сте имали сценарий, при който картата всъщност не се движи, тогава това, което сте правили преди анимацията, никога няма да undo
, защото това поведение е в moveend
, което никога не се извиква!
Надявам се това да помогне на някого. Трябваше да отделя добри два часа, за да го накарам да работи за мен, защото обратно извикване movestart
липсва :(
АКТУАЛИЗИРАНЕ
След повече дискусии в тази нишка има друго решение, предложено от @ahocevar. Това означава да използвате събитието propertychange
в изгледа по следния начин:
function onpropertychange() {
map.dispatchEvent('movestart');
var view = map.getView();
view.un('propertychange', onpropertychange);
map.on('moveend', function() {
view.on('propertychange', onpropertychange);
});
};
map.getView().on('propertychange', onpropertychange);
Ето един работещ пример за този подход: jsFiddle
person
Shaunak
schedule
08.08.2015
precompose
. Вижте моя jsFiddle: jsfiddle.net/j2cP4/116 - person GuyT   schedule 18.08.2015precompose
, тъй като не е специално насочен за движение. Ще се задейства за всякакъв вид изобразяване на карта, като напр. промяна на слоя. - person Shaunak   schedule 20.08.2015