// pages/index/index.js Page({ /** * 页面的初始数据 */ width: 0, height: 0, data: { }, /** * 生命周期函数--监听页面加载 */ onLoad: function() { //获取系统信息 wx.getSystemInfo({ //获取系统信息成功,保存获取到的系统窗口的宽高 success: res => { this.width = res.windowWidth this.height = res.windowHeight } }) }, /** * 生命周期函数--监听页面初次渲染完成 */ timer: null, onReady: function() { //创建ctx实例 var ctx = wx.createCanvasContext('myCanvas') //将角度转换为弧度,方便后续使用 //计算公式:弧度 = 角度 * Math.PI / 180 const D6 = 6 * Math.PI /180 const D30 = 30 * Math.PI /180 const D90 = 90 * Math.PI /180 //获取宽和高值 var width = this.width, height = this.height //计算表盘半径,留出30px外边框 var radious = width / 2 - 30 //每秒绘制一次 draw() this.timer = setInterval(draw, 1000) //绘制函数 function draw() { //设置坐标轴原点为窗口的中心点 ctx.translate(width / 2, height / 2) //绘制表盘 drawClock(ctx, radious) // 绘制指针 drawHand(ctx, radious) // 绘制执行 ctx.draw() } //绘制表盘部分 function drawClock(ctx, radious) { } // 绘制指针部分 function drawhand(ctx, radious) { } function drawClock(ctx, radious) { // 绘制大圆 // 大圆的半径为radious,线条粗细为2px ctx.setLineWidth(2) ctx.beginPath() ctx.arc(0, 0, radious, 0, 2 * Math.PI, true) ctx.stroke() // 绘制中心圆 // 中心圆的半径为8px, 线条粗细为1px ctx.setLineWidth(1) ctx.beginPath() ctx.arc(0, 0, 8, 0, 2 * Math.PI, true) ctx.stroke() // 绘制大刻度盘,线条粗细为5px ctx.setLineWidth(5) for (var i = 0; i < 12; i++) { // 以原点为中心顺时针旋转(多次调用旋转的角度会叠加) // 大刻度盘需要绘制12个线条,表示12个小时,每次旋转30度 ctx.rotate(D30) ctx.beginPath() ctx.moveTo(radious, 0) ctx.lineTo(radious - 15, 0) ctx.stroke() } // 绘制小刻度盘,线条粗细为1px ctx.setLineWidth(1) for (var i = 0; i < 60; i++) { // 小刻度盘需要绘制60个线条,表示60分钟或60秒,每次旋转6度 ctx.rotate(D6) ctx.beginPath() ctx.moveTo(radious, 0) ctx.lineTo(radious - 10, 0) ctx.stroke() } // 绘制文本 ctx.setFontSize(20) ctx.textBaseline = 'middle' // 计算文本距离表盘中心的半径r var r = radious - 30 for(var i = 1; i <= 12; ++i) { // 利用三角函数计算文本坐标 var x = r * Math.cos(D30 * i - D90) var y = r * Math.sin(D30 * i - D90) if (i > 10) { // 调整11和12的位置 // 在画布上绘制文本fillText(文本,左上角x坐标,左上角y坐标 ctx.fillText(i, x - 12, y) }else { ctx.fillText(i, x - 6, y) } } } function drawHand(ctx, tadious) { var t = new Date() var h = t.getHours() var m = t.getMinutes() var s = t.getSeconds() h = h > 12 ? h - 12 : h // 时间从3点开始,逆时针旋转90度,指向12点 ctx.rotate(-D90) // 绘制时针 ctx.save() // 计算时针指向的刻度 // 通过30度*h可以计算每个整点的旋转角度 // 如果时间不是整点,需要使用h + m/60+s/3600计算准确的偏移度 ctx.rotate(D30 * (h + m / 60 + s /3600)) ctx.setLineWidth(6) ctx.beginPath() ctx.moveTo(-20, 0) ctx.lineTo(radious / 2.6, 0) ctx.stroke() ctx.restore() // 绘制分针 ctx.save() ctx.rotate(D6 * (m + s / 60)) ctx.setLineWidth(4) ctx.beginPath() ctx.moveTo(-20, 0) ctx.lineTo(radious / 1.8, 0) ctx.stroke() ctx.restore() // 绘制秒针 ctx.save() ctx.rotate(D6 * s) ctx.setLineWidth(2) ctx.beginPath() ctx.moveTo(-20, 0) ctx.lineTo(radious / 1.6, 0) ctx.stroke() ctx.restore() } }, /** * 生命周期函数--监听页面显示 */ onShow() { }, /** * 生命周期函数--监听页面隐藏 */ onHide() { }, /** * 生命周期函数--监听页面卸载 */ onUnload() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { }, /** * 用户点击右上角分享 */ onShareAppMessage() { } })