export default class TimeLine { constructor(sdk, speed) { this.sdk = { ...sdk }; this.progress = document.getElementById('progress'); this.handle = document.getElementById('handle'); // this.timeline = document.getElementById('timeline'); this.timeline = document.getElementsByClassName('timeline-container')[0]; this.currentTime = document.getElementById('currentTime'); this.timelineCon = document.getElementsByClassName('timeline-container')[0]; this.speed = speed; this.animationId; this.startTime = Date.now(); this.manualPosition = null; this.isDragging = false; this.pauseed = false; this.time = ''; this.update = this.update.bind(this); TimeLine.init(this) } static init(that) { for (let i = 0; i <= 24; i++) { if (i % 6 === 0) { const label = document.createElement('div'); label.className = 'time-mark'; label.textContent = `${i}:00`; label.style.left = `${(i / 24) * 100}%`; document.getElementsByClassName('time-marks')[0].appendChild(label) } } that.startTime = Date.now() - ((that.manualPosition || 0) * 86400 * 1000 / that.speed); that.timeline.addEventListener('mousedown', (e) => { if (e.srcElement.className === 'handle') { that.isDragging = true; } e.preventDefault(); }); that.timeline.addEventListener('mousemove', (e) => { if (!that.isDragging) return; const rect = that.timeline.getBoundingClientRect(); let pos = (e.clientX - rect.left) / rect.width; pos = Math.max(0, Math.min(1, pos)); that.manualPosition = pos; that.progress.style.width = `${pos * 100}%`; const seconds = pos * 86400; that.currentTime.textContent = that.formatTime(seconds); }); that.update(); document.getElementById('timePause').addEventListener('click', function () { that.pauseed = !that.pauseed; if (that.pauseed) {//暂停 document.getElementById('timePause').textContent = '播放'; that.animationId && cancelAnimationFrame(that.animationId); that.pausedTime = Date.now(); // 记录暂停时刻 that.sdk.viewer.clock.shouldAnimate = false } else {//播放 document.getElementById('timePause').textContent = '暂停'; that.manualPosition = null const pausedDuration = Date.now() - that.pausedTime; that.startTime += pausedDuration; // 补偿暂停期间的时间差 if (that.changeDate) {//切换日期后让时间从0开始 if (that.changeDateGrag) { that.changeDateGrag = undefined } else { that.startTime = Date.now() } that.changeDate = undefined } that.sdk.viewer.clock.shouldAnimate = true that.update(); // 重启动画循环 } }); } moveComplay(func) { let that = this // that.timeline.addEventListener('mouseup', () => { document.addEventListener('mouseup', () => { if (that.isDragging) { that.isDragging = false; if (that.manualPosition !== null) { // that.sdk.viewer.clock.shouldAnimate = true that.startTime = Date.now() - (that.manualPosition * 86400 * 1000 / that.speed); that.manualPosition = null; that.changeDate && (that.changeDateGrag = true) if (!that.pauseed) { that.update() func(that.time) } else { that.pausedTime = Date.now(); // 记录暂停时刻 func(that.currentTime.textContent) } } } }); } formatTime(seconds) { const hrs = Math.floor(seconds / 3600).toString().padStart(2, '0'); const mins = Math.floor((seconds % 3600) / 60).toString().padStart(2, '0'); const secs = Math.floor(seconds % 60).toString().padStart(2, '0'); return `${hrs}:${mins}:${secs}`; } update() { if (this.manualPosition !== null) return; if (this.changeDate) {//切换日期后让时间从0开始 this.startTime = Date.now() } let elapsed = (Date.now() - this.startTime) * this.speed; // if (this.elapsed) { // elapsed = elapsed + this.elapsed // this.elapsed = undefined // } const totalSeconds = elapsed / 1000;//秒 const daySeconds = totalSeconds % 86400;//天 const percentage = daySeconds / 86400; this.progress.style.width = `${percentage * 100}%`; this.time = this.formatTime(daySeconds) this.currentTime.textContent = this.time; if (!this.pauseed) { this.animationId && cancelAnimationFrame(this.animationId); this.animationId = requestAnimationFrame(this.update); } } setSpeed(v) { if (!this.pauseed) { const currentProgress = this.manualPosition ?? (Date.now() - this.startTime) * this.speed / (86400 * 1000); this.speed = v; this.startTime = Date.now() - (currentProgress * 86400 * 1000 / this.speed); } else { let pausedDuration = Date.now() - this.pausedTime; this.startTime += pausedDuration; // 补偿暂停期间的时间差 const currentProgress = this.manualPosition ?? (Date.now() - this.startTime) * this.speed / (86400 * 1000); this.speed = v; this.startTime = Date.now() - (currentProgress * 86400 * 1000 / this.speed); this.pausedTime = Date.now(); // 记录切换speed暂停时刻 this.speed = v; } this.manualPosition = null; // this.update(); } updateTime() { this.manualPosition = null; this.startTime = Date.now() - ((this.manualPosition || 0) * 86400 * 1000 / this.speed); this.pauseed && (this.changeDate = true) this.changeDateGrag = undefined this.update(); } clear() { this.animationId && cancelAnimationFrame(this.animationId); this.progress.style.width = '0%'; this.currentTime.textContent = '00:00:00'; } }