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.

136 lines
4.4 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, //窗口高度
onLoad: function () {
// 获取系统信息
wx.getSystemInfo({
// 获取系统信息成功,保存获取到的系统窗口的宽高
success: res => {
// console.log(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 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){
// 绘制大圆
// 大圆的半径 radius 线条粗细为2px
ctx.setLineWidth(2) //设置线条粗细
ctx.beginPath() //开始一个新路径
ctx.arc(0, 0, radius, 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) // 360 / 12 = 30
ctx.beginPath()
ctx.moveTo(radius, 0)
ctx.moveTo(radius - 15, 0) //大刻度长度15px
ctx.stroke()
}
// 绘制小刻度盘线条粗细为1px
ctx.setLineWidth(1)
for(var i = 0; i < 60; ++i){
// 小刻度盘需要绘制60个线条表示60分钟或60秒每次旋转6度
ctx.rotate(D6)
ctx.beginPath()
ctx.moveTo(radius, 0)
ctx.lineTo(radius - 10, 0) //小刻度盘长度10px
ctx.stroke()
}
//绘制文本
ctx.setFontSize(20) //字号
ctx.textBaseline = 'middle' // 文本垂直居中
// 计算文本距离表盘中心点的半径r
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小时制
//时间从三点开始逆时针旋转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(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()
}
}
})