Cesium动态改变时间轴速率

使用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' });

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值