Canvas实现时间刻度标尺功能
生活随笔
收集整理的這篇文章主要介紹了
Canvas实现时间刻度标尺功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Canvas實現時間刻度標尺功能
前言:項目中需要實現一個時間標尺的功能,展示某個人在某段時間內已經被訂單占用的時間,并且展示當前訂單在標尺中的占用位置,大概為下圖的樣子
大概的實現邏輯如下:
實現代碼如下
initDraw:function(){// 首先執行此方法,計算起終點的時間let start = this.modifyStartTime ? this.modifyStartTime : this.orderStartTime;let end = this.modifyEndTime ? this.modifyEndTime : this.orderEndTime;// 先計算刻度的數值this.calculateSpan(start,end);// 初始化時間刻度尺this.initTimeArr(start);// 每個司機的行程都不相同,所以遍歷去繪畫每個司機的行程this.driverJourneyArr.forEach((item,index)=>{this.drawDriverRect("d" + item.id,index);})},calculateSpan:function(start,end){// 計算時間跨度orderEndTimelet hours = (new Date(end).valueOf() - new Date(start).valueOf()) / 60000 / 6 ;if(hours < 4){this.timeSpan = 1;}else if(hours > 4 && hours < 12){this.timeSpan = 2;}else{this.timeSpan = 6;}},initTimeArr:function(start){// 獲取第一個時間刻度上的時間this.timeArr = [];// * -3 是因為刻度尺展示的時間是開始時間的前XX個小時,跟后XX個小時,所以start這個行程的開始時間是在刻度尺中間的位置展示的this.begin = moment(start).add(this.timeSpan * -3 , "hour").format("YYYY-MM-DD HH:mm:ss");// 初始化顯示在時間刻度表上的時間for (let i = 1; i < 9; i++) {this.timeArr.push(moment(start).add(this.timeSpan * (i - 3), "hour").format("HH:mm"));}},initTimeScale:function(ctx){// 先移動至線的起點處ctx.moveTo(0,25);// 設定線的起點跟終點ctx.lineTo(320,25);// 設置線的顏色ctx.strokeStyle = "#070707";// 設置字體的顏色ctx.fillStyle = "#070707";for (let i = 1; i < 8; i++) {ctx.moveTo(i * 40,17);ctx.lineTo(i * 40,25);ctx.textAlign = "center";ctx.fillText(this.timeArr[i-1],i * 40,35)}// 繪畫ctx.stroke();},drawDriverRect:function(domId,i){let ctx = document.getElementById(domId).getContext("2d");// 清除畫布ctx.clearRect(0,0,320,40);this.driverJourneyArr[i].times.forEach((time,index)=>{// 獲取每個司機let obj = this.getDrawLocation(time);// 繪制矩形ctx.fillStyle = "rgb(161,161,161)";ctx.fillRect (obj.start, 10, obj.end - obj.start, 15);})this.drawOrderRect(ctx);this.initTimeScale(ctx);},getDrawLocation:function(item){// 通過計算得出需要繪制起終點let timeDifference,startLocation,endLocation;// 計算出司機行程和訂單的開始時間的時間差,用于計算繪制的位置timeDifference = new Date(item.start).valueOf() - new Date(this.begin).valueOf() ;startLocation = 0;if(timeDifference > 0 ){// 使用前面計算出的時間差的分數除于每個跨度代表的分鐘數,得出需要展示的比例,乘于每個跨度中的寬度,也就是40.得出需要X軸起點位置startLocation = timeDifference / 60000 /(60 * this.timeSpan) * 40}// X軸終點的位置,是計算司機行程的結束時間和訂單開始的時間差,由于計算出來是時間戳,除于60000得到分鐘數,除于一個刻度區域里代表的分鐘數,得出需要展示的比例,乘以固定的刻度區域寬度40,得出需要繪制的X軸終點endLocation = (new Date(item.end).valueOf() - new Date(this.begin).valueOf()) / 60000 / (60 * this.timeSpan) * 40;return {start:startLocation,end:endLocation}},drawOrderRect(c){let start = this.modifyStartTime ? this.modifyStartTime : this.orderStartTime;let end = this.modifyEndTime ? this.modifyEndTime : this.orderEndTime;let obj = this.getDrawLocation({start:start,end:end});// 繪制矩形c.fillStyle = "rgba(0,204,255,0.5)";c.fillRect (obj.start, 0, obj.end - obj.start, 25);},總結
以上是生活随笔為你收集整理的Canvas实现时间刻度标尺功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python编程——Python基础知识
- 下一篇: 转载:王垠·程序员的心理疾病