Page({ width: 0, // 窗口宽度 height: 0, // 窗口高度 timer: null, // 定时器 onLoad: function () { // 获取系统信息 wx.getSystemInfo({ success: res => { console.log(res) // 获取窗口宽高 this.width = res.windowWidth this.height = res.windowHeight } }) }, onReady: function () { // 将角度转换为弧度 const D6 = 6 * Math.PI / 180 const D30 = 30 * Math.PI / 180 const D90 = 90 * Math.PI / 180 // 创建CanvasContext var ctx = wx.createCanvasContext('myCanvas') var width = this.width var height = this.height // 计算表盘半径,留出 30px 外边距 var radius = width / 2 - 30 draw() this.timer = setInterval(draw, 1000) function draw() { // 设置坐标轴原点为窗口的中心点 ctx.translate(width / 2, height / 2) // 绘制表盘 drawClock(ctx, radius) // 绘制指针 drawHand(ctx, radius) // 执行绘制 ctx.draw() } function drawClock(ctx, radius) { // 绘制大圆 ctx.setLineWidth(2) // 设置线条的粗细,单位px ctx.beginPath() // 开始一个新路径 ctx.arc(0, 0, radius, 0, 2 * Math.PI, true) ctx.stroke() // 绘制中心圆 ctx.setLineWidth(1) ctx.beginPath() ctx.arc(0, 0, 8, 0, 2 * Math.PI, true) // 半径8px ctx.stroke() // 绘制大刻度盘 ctx.setLineWidth(5) for (var i = 0; i < 12; ++i) { // 以原点为中心顺时针旋转(多次调用旋转的角度会叠加) ctx.rotate(D30) // 360 / 12 = 30 ctx.beginPath() ctx.moveTo(radius, 0) ctx.lineTo(radius - 15, 0) // 大刻度长度15px ctx.stroke() } // 绘制小刻度盘 ctx.setLineWidth(1) for (var i = 0; i < 60; ++i) { ctx.rotate(D6) // 360 / 60 = 6 ctx.beginPath() ctx.moveTo(radius, 0) ctx.lineTo(radius - 10, 0) // 小刻度盘长度10px ctx.stroke() } // 绘制文本 ctx.setFontSize(20) // 字号 ctx.textBaseline = 'middle' // 文本上下居中 // 文本距离时钟中心点半径 var r = radius - 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, radius) { var t = new Date() // 获取当前时间 var h = t.getHours() // 小时 var m = t.getMinutes() // 分 var s = t.getSeconds() // 秒 h = h > 12 ? h - 12 : h // 将24小时制转化为12小时制 // 时间从3点开始,逆时针旋转90度,指向12点 ctx.rotate(-D90) // 绘制时针 ctx.save() // 记录旋转状态 ctx.rotate(D30 * (h + m / 60 + s / 3600)) ctx.setLineWidth(6) ctx.beginPath() ctx.moveTo(-20, 0) // 线条起点(针尾留出20px) ctx.lineTo(radius / 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(radius / 1.8, 0) ctx.stroke() ctx.restore() // 绘制秒针 ctx.save() ctx.rotate(D6 * s) ctx.setLineWidth(2) ctx.beginPath() ctx.moveTo(-20, 0) ctx.lineTo(radius / 1.6, 0) ctx.stroke() ctx.restore() } }, // 页面卸载,清除画布绘制定时器 onUnload: function () { clearInterval(this.timer) } })