微信小程序使用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()
    }
  }
})

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

(0)

相关推荐

  • 微信小程序入门之绘制时钟

    微信小程序入门案例--绘制时钟,供大家参考,具体内容如下 涉及内容:canvas.每秒刷新页面.绘制 目录结构: pages\index\index.js Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { this.ctx = wx.createCanvasContext('clockCanvas') this.drawClock() var that = this th

  • JS绘制微信小程序画布时钟

    微信小程序官方组件也提供了画布功能,下面分享一下如何创建微信小程序画布时钟. 总体思路是对pages中的一个小程序页面构建画布时钟逻辑程序,通过app.json公共设置来配置入口. 首先来看一下构建这样一个小程序所需要的目录结构 从目录结构就可以看出来这个程序是简单的单层页面,画布渲染在pages下面的index页面上. 其中对程序有实际驱动作用的代码分别在index.js,index.wxml,index.wxss和app.json这几个文件中 Index.js文件里面存放着程序的逻辑层数据,

  • 微信小程序canvas动态时钟

    本文实例为大家分享了微信小程序canvas动态时钟的具体代码,供大家参考,具体内容如下 canvas时钟效果图: 代码: wxml: <view style='width:100%;height:{{canvasHeight}}px' catchtap='goCountdown'catchlongtap='touchstart' catchtouchend='touchend'> <canvas canvas-id='clock' style='width:100%;height:{{c

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

    本文实例为大家分享了微信小程序使用canvas绘制钟表的具体代码,供大家参考,具体内容如下 模拟时钟 利用canvas绘制时钟,实现模拟时钟的功能,钟表时间与系统时间保持一致,刻度将24小时制转换为12小时制,需要分别绘图出中心圆.外层大圆.分针.时针.秒针. 效果图如下: 代码如下: index.wxml <canvas canvas-id="myCanvas" class="mycanvas"></canvas> index.wxss /

  • 微信小程序利用canvas 绘制幸运大转盘功能

    小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码 Page({ /** * 页面的初始数据 */ data: { awardsConfig: {}, restaraunts: [], //大转盘奖品信息 }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { var self = this; wx.getSystemInfo({ //获取系统信息成功,将系统窗口的宽高赋给页面的宽高 success:

  • 微信小程序利用Canvas绘制图片和竖排文字详解

    前言 闲暇时间抽个空写了个三国杀武将手册的小程序,中间有个需求设计的是合成武将皮肤图.竖排的武将姓名.以及小程序码,然后提供保存图片到相册,最终让用户可以分享到朋友圈或其他平台.合成图片应该按照 Canvas 的文档来做都没什么问题,主要是有个竖排文字的需求,这里和大家分享一下. 正文 首先放一张最终保存到相册的图片吧~ 自我感觉良好,至少达到了我自己的预期吧~~~ 下面让我们一步一步来看看如何实现的吧. 整个图片分为三个部分: 武将图片 小程序码 武将文字信息 先来看一下 wxml 里面的代码

  • 微信小程序 使用canvas制作K线实例详解

    微信小程序 使用canvas制作K线 实现效果图: 前言: 我们目的是想要一条平滑的曲线来表示均线等,而不是一条转折点明显的折线.因此还得继续探索api.我们发现,在canvas API中,能够画出曲线的有2个 beZierCurveTo(num1, num2, num3, num4, x, y) quadraticCurveTo(num1, num2, x, y) 这两个api都是通过贝塞尔曲线来绘制路径.好在学习PS的时候,对贝塞尔曲线的具体表现也是有一定的熟练程度的,因此知道要确定一条由多

  • 微信小程序使用canvas自适应屏幕画海报并保存图片功能

    小程序canvas的API并没有像其他的一样支持小程序独有的 rpx 自适应尺寸单位,在绘制内容时所应用的单位仍然是 px,那么如何实现不同尺寸屏幕的自适应呢? 我们的在开发中常用的参考屏幕尺寸(iPhone6)为:375*667: 那么想要适应其他尺寸的屏幕时只需按照iPhone6的绘制大小按比例进行换算即可: 获取系统屏幕尺寸 先利用wx.getSystemInfo (获取系统信息)的API获取屏幕宽度,然后除iPhone6的屏幕宽度,即可得到相对单位 // 在onLoad中调用 const

  • 微信小程序用canvas实现圆形进度条

    本文实例为大家分享了微信小程序用canvas实现圆形进度条的具体代码,供大家参考,具体内容如下 先放效果图,如下: 1. wxml文件代码如下 对于圆形进度条中间的文字,如果是简单的,可以用它自带的属性去填充. 比较复杂的,就可以像下面,通过样式将文字定位到圆形进度条中间合适位置. <view class='circlePage'>   <view class='wrap'>     <!-- 圆形中间的文字 -->     <view class="c

  • 微信小程序实现的绘制table表格功能示例

    本文实例讲述了微信小程序实现的绘制table表格功能.分享给大家供大家参考,具体如下: 表格的绘制 js Page({ data:{ infeed:['"", "1周", "2周", "3周", "总计"], endwise1: "游泳", tb1:"0", tb2:"0", tb3:"0", tb4:"0"

  • 微信小程序基于canvas渐变实现的彩虹效果示例

    本文实例讲述了微信小程序基于canvas渐变实现的彩虹效果.分享给大家供大家参考,具体如下: 微信小程序提供了两种渐变的方式: createLinearGradient(x,y,x1,y1)创建一个线性的渐变. x,y           起点坐标 x1,y1        终点坐标 createCircularGradient(x,y,r)创建一个从圆心开始的渐变. x,y            圆心坐标 r                 半径 创建了渐变对象之后,必须添加两个或者两个以上的

  • 微信小程序使用canvas的画图操作示例

    本文实例讲述了微信小程序使用canvas的画图操作.分享给大家供大家参考,具体如下: 基础写起来太没动力了,也写得乱七八糟的,还是直接解决一些小问题比较方便,代码的方方面面的细节都会详尽的解释一下. 1.下面介绍一下canvas的画图,我这个简单一点,画一个带图文的背景图,图片可以从后台获取也可以选择本地的.canvas画图首先要在wxml里面新建一个<canvas>标签,一定要写上canvas-id='canvas的id',这是必须条件,如下面代码: <canvas canvas-id

随机推荐