微信小程序canvas动态时钟


Posted in Javascript onOctober 22, 2020

本文实例为大家分享了微信小程序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:{{canvasHeight}}px'></canvas>
</view>

js:

Page({
 data: {
  width: 0,
  height: 0,
  showMask: false
 },
 onLoad: function (options) {
  var that = this
  //获取系统信息 
  wx.getSystemInfo({
   //获取系统信息成功,将系统窗口的宽高赋给页面的宽高 
   success: function (res) {
    that.width = res.windowWidth
    that.height = res.windowHeight
    that.setData({
     canvasWidth: res.windowWidth * 0.9 * 0.52,
     canvasHeight: res.windowWidth * 0.9 * 0.52 * 0.9819,
     rightWidth: res.windowWidth * 0.9 * 0.47
    })
   }
  })
 },
 
 onReady: function () {
  this.drawClock();
  // 每40ms执行一次drawClock(),
  this.interval = setInterval(this.drawClock, 40);
 },
 
 
 // 所有的canvas属性以及Math.sin,Math.cos()等涉及角度的参数都是用弧度表示
 // 时钟
 drawClock: function () {
  let _this = this;
  const ctx = wx.createCanvasContext('clock');
  var height = this.height;
  var width = this.width;
  // 设置文字对应的半径
  var R = this.data.canvasWidth / 5;
  ctx.save();
  // 把原点的位置移动到屏幕中间,及宽的一半,高的一半
  ctx.translate(this.data.canvasWidth / 1.83, this.data.canvasHeight / 1.83);
 
  // 画外框
  function drawBackground() {
   ctx.setStrokeStyle('#4BB5C3');
   // 设置线条的粗细,单位px
   ctx.setLineWidth(8);
   // 开始路径
   ctx.beginPath();
   // 运动一个圆的路径
   // arc(x,y,半径,起始位置,结束位置,false为顺时针运动)
   ctx.arc(0, 0, R * 1.7, 0, 2 * Math.PI, false);
   ctx.closePath();
   // 描出点的路径
   ctx.stroke();
  };
  // 画时钟数
  function drawHoursNum() {
   ctx.setFontSize(20);
   // 圆的起始位置是从3开始的,所以我们从3开始填充数字
   var hours = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
   hours.forEach(function (hour, i) {
    var rad = (2 * Math.PI / 12) * i;
    var x = R * Math.cos(rad);
    var y = R * Math.sin(rad);
    if (hour == 12) {
     ctx.fillText(hour, x - 11, y + 6);
    } else if (hour == 6) {
     ctx.fillText(hour, x - 5, y + 10);
    } else if (hour == 3) {
     ctx.fillText(hour, x, y + 8);
    } else if (hour == 9) {
     ctx.fillText(hour, x - 10, y + 8);
    }
    else {
     //ctx.fillText(hour, x - 6, y + 6);
    }
   })
  };
 
  // 画数字对应的点
  function drawdots() {
   for (let i = 0; i < 60; i++) {
    var rad = 2 * Math.PI / 60 * i;
    var x = (R + 15) * Math.cos(rad);
    var y = (R + 15) * Math.sin(rad);
    ctx.beginPath();
    // 每5个点一个比较大
    if (i % 5 == 0) {
     ctx.arc(x, y, 2, 0, 2 * Math.PI, false);
    } else {
     // ctx.arc(x, y, 1, 0, 2 * Math.PI, false);
    }
    ctx.setFillStyle('black');
    ctx.fill();
   }
   ctx.closePath();
  }
 
  // 画时针
  function drawHour(hour, minute) {
   ctx.setStrokeStyle('#000000');
   // 保存画之前的状态
   ctx.save();
   ctx.beginPath();
   // 根据小时数确定大的偏移
   var rad = 2 * Math.PI / 12 * hour;
   // 根据分钟数确定小的偏移
   var mrad = 2 * Math.PI / 12 / 60 * minute;
   // 做旋转
   ctx.rotate(rad + mrad);
   ctx.setLineWidth(4);
   // 设置线条结束样式为圆
   ctx.setLineCap('round');
   // 时针向后延伸8个px;
   ctx.moveTo(0, 8);
   // 一开始的位置指向12点的方向,长度为R/2
   ctx.lineTo(0, -R / 2);
   ctx.stroke();
   ctx.closePath();
   // 返回画之前的状态
   ctx.restore();
  }
 
  // 画分针
  function drawMinute(minute, second) {
   ctx.save();
   ctx.beginPath();
   // 根据分钟数确定大的偏移
   var rad = 2 * Math.PI / 60 * minute;
   // 根据秒数确定小的偏移
   var mrad = 2 * Math.PI / 60 / 60 * second;
   ctx.rotate(rad + mrad);
   // 分针比时针细
   ctx.setLineWidth(3);
   ctx.setLineCap('round');
   ctx.moveTo(0, 10);
   // 一开始的位置指向12点的方向,长度为3 * R / 4
   ctx.lineTo(0, -3 * R / 4);
   ctx.stroke();
   ctx.closePath();
   ctx.restore();
  }
 
  // 画秒针
  function drawSecond(second, msecond) {
 
   ctx.save();
   ctx.beginPath();
   // 根据秒数确定大的偏移
   var rad = 2 * Math.PI / 60 * second;
   // 1000ms=1s所以这里多除个1000
   var mrad = 2 * Math.PI / 60 / 1000 * msecond;
   ctx.rotate(rad + mrad);
   ctx.setLineWidth(2);
   ctx.setStrokeStyle('#4BB5C3');
   ctx.setLineCap('round');
   ctx.moveTo(0, 12);
   ctx.lineTo(0, -R);
   ctx.stroke();
   ctx.closePath();
   ctx.restore();
  }
 
  //画出中间那个灰色的圆
  function drawDot() {
   ctx.beginPath();
   ctx.arc(0, 0, 4, 0, 2 * Math.PI, false);
   ctx.setFillStyle('#FFF9E6');
   ctx.setLineWidth(6);
   ctx.setStrokeStyle('#000000');
   ctx.stroke();
   ctx.fill();
   ctx.closePath();
  }
  //画蒙层
  function drawMask() {
   ctx.restore();
   ctx.rect(0, 0, width * 0.5, _this.data.canvasHeight);
   ctx.setFillStyle('rgba(0,0,0,.2)')
   ctx.fill()
  }
  function Clock() {
   // 实时获取各个参数
   var now = new Date();
   var hour = now.getHours();
   var minute = now.getMinutes()
   var second = now.getSeconds();
   var msecond = now.getMilliseconds();
   if (_this.data.showMask) {
    ctx.scale(0.98,0.98)
   }
   // 依次执行各个方法
   drawBackground();
   drawHoursNum();
   drawdots();
   drawSecond(second, msecond);
   drawHour(hour, minute);
   drawMinute(minute, second);
   drawDot();
   if (_this.data.showMask) {
    drawMask();
   }
   ctx.draw();
  }
  Clock();
 },
 goCountdown() {
  let _this = this;
  _this.setData({
   showMask: true
  })
  setTimeout(function () {
   _this.setData({
    showMask: false
   })
   wx.navigateTo({
    url: '/pages/countdown/countdown',
   })
  }, 200)
 
 },
 touchstart: function (e) {
  console.log(e)
  this.setData({
   showMask: true
  })
 },
 touchend: function (e) {
  this.setData({
   showMask: false
  })
 }
})

为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。

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

Javascript 相关文章推荐
基于jquery的自定义鼠标提示效果 jquery.toolTip
Nov 14 Javascript
基于jquery的滚动鼠标放大缩小图片效果
Oct 27 Javascript
Angularjs整合微信UI(weui)
Mar 15 Javascript
关于session和cookie的简单理解
Jun 08 Javascript
javascript 中的事件委托详解
Oct 25 Javascript
jQuery实现的浮动层div浏览器居中显示效果
Feb 03 Javascript
js实现带三角符的手风琴效果
Mar 01 Javascript
Vue-Cli中自定义过滤器的实现代码
Aug 12 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
Sep 03 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 Javascript
Node+OCR实现图像文字识别功能
Nov 26 Javascript
antd日期选择器禁止选择当天之前的时间操作
Oct 29 Javascript
vue-cli —— 如何局部修改Element样式
Oct 22 #Javascript
微信小程序入门之绘制时钟
Oct 22 #Javascript
微信小程序入门之指南针
Oct 22 #Javascript
微信小程序实现拼图小游戏
Oct 22 #Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 #Javascript
在Vue中使用Select选择器拼接label的操作
Oct 22 #Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 #Javascript
You might like
php5新改动之短标记启用方法
2008/09/11 PHP
Wordpress php 分页代码
2009/10/21 PHP
php 购物车完整实现代码
2014/06/05 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
javascript 跳转代码集合
2009/12/03 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
python时间日期操作方法实例小结
2020/02/06 Python
python 决策树算法的实现
2020/10/09 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
初一家长会邀请函
2014/01/31 职场文书
班级读书活动总结
2014/06/30 职场文书
文秘应届生求职信
2014/07/05 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
教师理论学习心得体会
2016/01/21 职场文书
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL