微信小程序使用canvas绘制钟表

 更新时间:2021年05月28日 17:15:11   作者:小脆筒style  
这篇文章主要为大家详细介绍了微信小程序使用canvas绘制钟表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了微信小程序使用canvas绘制钟表的具体代码,供大家参考,具体内容如下

模拟时钟

利用canvas绘制时钟,实现模拟时钟的功能,钟表时间与系统时间保持一致,刻度将24小时制转换为12小时制,需要分别绘图出中心圆、外层大圆、分针、时针、秒针。

效果图如下:

代码如下:

index.wxml

<canvas canvas-id="myCanvas" class="mycanvas"></canvas>

index.wxss

/**index.wxss**/
.mycanvas {
  width: 100%;
  height: 100%;
  position: fixed;
}

index.js

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • javascript中闭包(Closure)详解

    javascript中闭包(Closure)详解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。小编之前一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什么,有什么用,本文把自己的理解些出来分享一下,希望不理解JavaScript闭包的朋友们看了之后能够理解闭包!
    2016-01-01
  • js将控件隐藏的方法及display属性介绍

    js将控件隐藏的方法及display属性介绍

    这篇文章主要介绍了,js中将控件隐藏的方法,以及display的属性,有需要的朋友可以参考一下
    2013-07-07
  • webpack的pitching loader详解

    webpack的pitching loader详解

    这篇文章主要介绍了webpack的pitching loader详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • js弹出窗口之弹出层的小例子

    js弹出窗口之弹出层的小例子

    js弹出窗口之弹出层的小例子,需要的朋友可以参考一下
    2013-06-06
  • 利用JS自动打开页面上链接的实现代码

    利用JS自动打开页面上链接的实现代码

    今天经过测试,实现了利用JS来自动打开页面上的链接的功能,其实比较简单,就是在页面上把链接列表列出来,然后通过JQuery的相关控制,在框架页中把链接打开,具体能做什么用,大家自己想,哈哈。
    2011-09-09
  • Javascript 判断是否存在函数的方法

    Javascript 判断是否存在函数的方法

    Javascript 判断是否存在函数,此功能如何实现,接下来为您介绍解决方法,需要了解的朋友可以参考下
    2013-01-01
  • JS操作json对象key、value的常用方法分析

    JS操作json对象key、value的常用方法分析

    这篇文章主要介绍了JS操作json对象key、value的常用方法,结合实例形式分析了js操作json对象键值对遍历及增删的相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • JavaScript中判断数据类型的方法总结

    JavaScript中判断数据类型的方法总结

    比如要判断一个变量是否是数组类型,PHP中有is_array()函数可以直接判断,然而js中我们需要...-- well,下面我们就来详细看一下JavaScript中判断数据类型的方法总结
    2016-05-05
  • js每隔5分钟执行一次ajax请求的实现方法

    js每隔5分钟执行一次ajax请求的实现方法

    每隔5分钟执行一次ajax请求,如何实现?下面有个不错的示例,感兴趣的朋友可以参考下
    2013-11-11
  • 用javascript实现画图效果的代码

    用javascript实现画图效果的代码

    用javascript实现画图效果的代码...
    2007-07-07

最新评论