You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
3.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)
}
})