摘要:制作鐘表分成兩部分,一部分是表盤,一部分是時針分針秒針的走動,首先,先繪制表盤繪制表盤圓半徑設置坐標軸原點圓心表盤外圓表盤刻度大格表盤刻度小格表盤時刻數字設置字體樣式字體上下居中,繪制時間利用三角函數計算字體坐標表達式開始繪
制作鐘表分成兩部分,一部分是表盤,一部分是時針、分針、秒針的走動,首先,先繪制表盤:
// 繪制表盤 getDialClock = () => { const width = this.state.width; const height = this.state.height; const ctx = Taro.createCanvasContext("myCanvas", this.$scope); const R = width/2 - 30;//圓半徑 const r = R - 15; //設置坐標軸原點 ctx.translate(width/2, height/2); ctx.save(); // 圓心 ctx.beginPath(); ctx.arc(0, 0, 5, 0, 2 * Math.PI, true); ctx.fill(); ctx.closePath(); // 表盤外圓 ctx.setLineWidth(2); ctx.beginPath(); ctx.arc(0, 0, R, 0, 2 * Math.PI, true); ctx.closePath(); ctx.stroke(); // 表盤刻度(大格) ctx.beginPath(); ctx.setLineWidth(5); for(var i = 0; i < 12; i++) { ctx.beginPath(); ctx.rotate(Math.PI / 6); ctx.moveTo(R, 0); ctx.lineTo(r, 0); ctx.stroke(); } ctx.closePath(); // 表盤刻度(小格) ctx.beginPath(); ctx.setLineWidth(1); for(var i = 0; i < 60; i++) { ctx.beginPath(); ctx.rotate(Math.PI / 30); ctx.moveTo(R, 0); ctx.lineTo(R-10, 0); ctx.stroke(); } ctx.closePath(); // 表盤時刻(數字) ctx.beginPath(); ctx.setFontSize(16)//設置字體樣式 // ctx.setTextBaseline("middle");//字體上下居中,繪制時間 for(let i = 1; i < 13; i++) { //利用三角函數計算字體坐標表達式 var x = (r-10) * Math.cos(i * Math.PI / 6 - Math.PI/2); var y = (r-10) * Math.sin(i * Math.PI / 6 - Math.PI/2); let sz = i + ""; ctx.fillText(sz, x - 5, y + 5, 15); } ctx.closePath(); // 開始繪制 ctx.draw(); }
表盤繪制完畢,再繪制時針,分針,秒針的運動,這里需要新建一個組件來專門管理這個時間運動,在組件中,如下:
// 繪制 針表 drawTime = () => { const width = this.props.dataRes.width; const height = this.props.dataRes.height; const ctx = Taro.createCanvasContext("timeId", this.$scope); const R = width/2 - 30;//圓半徑 //設置坐標軸原點 ctx.translate(width/2, height/2); ctx.save(); const t = new Date();//獲取當前時間 let h = t.getHours();//獲取小時 h = h>12?(h-12):h;//將24小時制轉化為12小時制 const m = t.getMinutes();//獲取分針 const s = t.getSeconds();//獲取秒 //繪制時針 ctx.beginPath(); ctx.setStrokeStyle("green") ctx.setLineWidth(10); ctx.rotate((Math.PI/6)*(h+m/60+s/3600)-Math.PI/2); ctx.moveTo(0,0); ctx.lineTo(R-90,0); ctx.stroke(); ctx.restore(); ctx.save(); // 繪制分針 ctx.beginPath(); ctx.setStrokeStyle("gold") ctx.setLineWidth(5); ctx.rotate((Math.PI/30)*(m+s/3600)-Math.PI/2); ctx.moveTo(0,0); ctx.lineTo(R-60,0); ctx.stroke(); ctx.restore(); ctx.save(); // 繪制秒針 ctx.beginPath(); ctx.setStrokeStyle("red") ctx.setLineWidth(1); ctx.rotate((Math.PI/30)*s-Math.PI/2); ctx.moveTo(0,0); ctx.lineTo(R-20,0); ctx.stroke(); ctx.restore(); ctx.save(); ctx.draw(); }
結果顯示:
源碼地址:
https://gitee.com/hope93/canv...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100162.html
摘要:多端統一開發框架優秀學習資源匯總官方資源項目倉庫官方文檔項目倉庫官方文檔微信小程序官方文檔百度智能小程序官方文檔支付寶小程序官方文檔字節跳動小程序官方文檔文章教程不敢閱讀包源碼帶你揭秘背后的哲學從到構建適配不同端微信小程序等的應用小程序最 Awesome Taro 多端統一開發框架 Taro 優秀學習資源匯總 showImg(https://segmentfault.com/img/r...
摘要:入口文件繼承自組件基類,它同樣擁有組件生命周期,但因為入口文件的特殊性,他的生命周期并不完整,如。支持組件化開發,組件代碼可以放在任意位置,不過建議放在下的目錄中。 生命周期 componentWillMount 在微信小程序中這一生命周期方法對應頁面的onLoad或入口文件app中的onLaunch componentDidMount 在微信小程序中這一生命周期方法對應頁面的onRe...
摘要:調用通過注冊表調用到實例,透過的,調用到中的,最后通過,調用,根據參數相應模塊執行。京東的,多端解決方案是一套遵循語法規范的多端開發解決方案。 showImg(https://segmentfault.com/img/bVbuMkw?w=1304&h=808); 對于一項技術,我們不能停留在五分鐘狀態,特別喜歡一句話,用什么方式繪制UI界面一點不重要,重要的是底層的思維,解決問題和優化...
摘要:調用通過注冊表調用到實例,透過的,調用到中的,最后通過,調用,根據參數相應模塊執行。京東的,多端解決方案是一套遵循語法規范的多端開發解決方案。 showImg(https://segmentfault.com/img/bVbuMkw?w=1304&h=808); 對于一項技術,我們不能停留在五分鐘狀態,特別喜歡一句話,用什么方式繪制UI界面一點不重要,重要的是底層的思維,解決問題和優化...
摘要:調用通過注冊表調用到實例,透過的,調用到中的,最后通過,調用,根據參數相應模塊執行。京東的,多端解決方案是一套遵循語法規范的多端開發解決方案。 showImg(https://segmentfault.com/img/bVbuMkw?w=1304&h=808); 對于一項技術,我們不能停留在五分鐘狀態,特別喜歡一句話,用什么方式繪制UI界面一點不重要,重要的是底層的思維,解決問題和優化...
閱讀 2809·2021-10-08 10:04
閱讀 3198·2021-09-10 11:20
閱讀 524·2019-08-30 10:54
閱讀 3306·2019-08-29 17:25
閱讀 2302·2019-08-29 16:24
閱讀 885·2019-08-29 12:26
閱讀 1447·2019-08-23 18:35
閱讀 1931·2019-08-23 17:53