使用Cesium扫描过境时,需要动态改变时间轴的速度,当结束后,速度置为1。
一开始,是想在polyline的positions中,Cesium.CallbackProperty函数来处理扫描结束速度,这是用时间来判断是否扫描结束,所以结束后会一直触发自定义事件,导致时间轴手动调整不了。
查阅API得知clock中有onTick事件,遂使用
viewer.clock.onTick.addEventListener(function(clock) {
if (Cesium.JulianDate.compare(clock.currentTime, julianEnd) > 0) {
// 与自定义速率比较,相等重置为1
if (clock.multiplier === 50) {
viewer.clock.multiplier = 1;
}
}
})
哎,成功了,可是重置为1后要移除监听事件,那问题又来了,匿名函数怎么移除监听事件
一番百度,有如下两种方式
第一种是用变量定义函数,满足条件移除事件,适合单事件监听
const adjustRate = (clock) => {
if (Cesium.JulianDate.compare(clock.currentTime, julianEnd) > 0) {
if (clock.multiplier === 50) {
viewer.clock.multiplier = 1;
}
viewer.clock.onTick.removeEventListener(adjustRate);
}
};
viewer.clock.currentTime = julianStart;
viewer.clock.multiplier = 50;
viewer.clock.onTick.addEventListener(adjustRate);
第二种是重写Cesium监听事件,使用scopes[i].name标记匿名函数,再根据scopes[i].name删除匿名函数,适合循环监听事件。
import Event from '@cesium/engine/Source/Core/Event';
export class CustomEvent extends Event {
constructor() {
super();
// this._fnName = undefined;
}
}
CustomEvent.prototype.addEventListener = function (listener, scope) {
//>>includeStart('debug', pragmas.debug);
// debugger
Cesium.Check.typeOf.func('listener', listener);
//>>includeEnd('debug');
this._listeners.push(listener);
this._scopes.push(scope);
const event = this;
return function () {
event.removeEventListener(listener, scope);
};
};
CustomEvent.prototype.removeEventListener = function (listener, scope) {
//>>includeStart('debug', pragmas.debug);
Cesium.Check.typeOf.func('listener', listener);
//>>includeEnd('debug');
const listeners = this._listeners;
const scopes = this._scopes;
let index = -1;
for (let i = 0; i < listeners.length; i++) {
if (listeners[i] === listener && scopes[i].name === scope.name) {
index = i;
break;
}
}
if (index !== -1) {
if (this._insideRaiseEvent) {
//In order to allow removing an event subscription from within
//a callback, we don't actually remove the items here. Instead
//remember the index they are at and undefined their value.
this._toRemove.push(index);
listeners[index] = undefined;
scopes[index] = undefined;
} else {
listeners.splice(index, 1);
scopes.splice(index, 1);
}
return true;
}
return false;
};
使用方法:
// 重写监听事件
viewer.scene.preRender = new CustomEvent();
// 匿名函数绑定
viewer.scene.preRender.addEventListener((scene, time) => {
...
}, { name: 'test' });
// 移除匿名函数
viewer.scene.preRender.removeEventListener(viewer.scene.preRender._listeners[0], { name: 'test' });