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


Posted in Javascript onDecember 24, 2016

微信小程序官方组件也提供了画布功能,下面分享一下如何创建微信小程序画布时钟。

总体思路是对pages中的一个小程序页面构建画布时钟逻辑程序,通过app.json公共设置来配置入口。

首先来看一下构建这样一个小程序所需要的目录结构

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

从目录结构就可以看出来这个程序是简单的单层页面,画布渲染在pages下面的index页面上。

其中对程序有实际驱动作用的代码分别在index.js,index.wxml,index.wxss和app.json这几个文件中

Index.js文件里面存放着程序的逻辑层数据,是程序的核心。

1)考虑到适应不同的手机大小,定义了两个变量width和height,当页面加载时(onLoad)获取系统窗口的值作为index页面的大小;

2)页面初次渲染后给index添加时钟函数canvasClock(),并设置定时器,每一秒刷新一次画布,呈现出时钟运动的效果

3)在时钟函数canvasClock()中进行绘制时钟页面所需的元素以其其运动函数,并对其进行调用drawClock(),通过调用小程序wx.drawCanvas方法来指定index为绘制页面和绘制行为

4)当程序退出时,清除计时器

代码如下:

// 获取应用实例 
Page({ 
 data:{ 
  width:0, 
  height:0 
 }, 
 //onLoad生命周期函数,监听页面加载 
 onLoad: function(){ 
  //将全局变量Index保存在that中,里面函数调用 
  var that = this 
  //获取系统信息 
  wx.getSystemInfo({ 
   //获取系统信息成功,将系统窗口的宽高赋给页面的宽高 
   success: function(res) { 
    that.width = res.windowWidth 
    that.height = res.windowHeight 
   } 
  }) 
 }, 
 //onReady生命周期函数,监听页面初次渲染完成 
 onReady: function(){ 
  //调用canvasClock函数 
  this.canvasClock() 
  //对canvasClock函数循环调用 
  this.interval = setInterval(this.canvasClock,1000) 
 }, 
 canvasClock: function(){ 
  var context = wx.createContext()//创建并返回绘图上下文(获取画笔) 
  //设置宽高 
  var width = this.width 
  var height = this.height 
  var R = width/2-55;//设置文字距离时钟中心点距离 
  //重置画布函数 
  function reSet(){ 
   context.height = context.height;//每次清除画布,然后变化后的时间补上 
   context.translate(width/2, height/2);//设置坐标轴原点 
   context.save();//保存中点坐标1 
  } 
  //绘制中心圆和外面大圆 
  function circle(){ 
   //外面大圆 
   context.setLineWidth(2); 
   context.beginPath(); 
   context.arc(0, 0, width/2-30, 0, 2 * Math.PI,true); 
   context.closePath(); 
   context.stroke(); 
   //中心圆 
   context.beginPath(); 
   context.arc(0, 0, 8, 0, 2 * Math.PI, true); 
   context.closePath(); 
   context.stroke(); 
  } 
  //绘制字体 
  function num(){ 
   // var R = width/2-60;//设置文字距离时钟中心点距离 
   context.setFontSize(20)//设置字体样式 
   context.textBaseline = "middle";//字体上下居中,绘制时间 
   for(var i = 1; i < 13; i++) { 
    //利用三角函数计算字体坐标表达式 
    var x = R * Math.cos(i * Math.PI / 6 - Math.PI / 2); 
    var y = R * Math.sin(i * Math.PI / 6 - Math.PI / 2); 
    if(i==11||i==12){//调整数字11和12的位置 
     context.fillText(i, x-12, y+9); 
    }else { 
     context.fillText(i, x-6, y+9); 
    } 
   } 
  } 
  //绘制小格 
  function smallGrid(){ 
    context.setLineWidth(1); 
    context.rotate(-Math.PI/2);//时间从3点开始,倒转90度 
    for(var i = 0; i < 60; i++) { 
     context.beginPath(); 
     context.rotate(Math.PI / 30); 
     context.moveTo(width/2-30, 0); 
     context.lineTo(width/2-40, 0); 
     context.stroke(); 
    } 
   } 
   //绘制大格 
   function bigGrid(){ 
   context.setLineWidth(5); 
   for(var i = 0; i < 12; i++) { 
    context.beginPath(); 
    context.rotate(Math.PI / 6); 
    context.moveTo(width/2-30, 0); 
    context.lineTo(width/2-45, 0); 
    context.stroke(); 
   } 
   } 
   //指针运动函数 
  function move(){ 
   var t = new Date();//获取当前时间 
   var h = t.getHours();//获取小时 
   h = h>12?(h-12):h;//将24小时制转化为12小时制 
   var m = t.getMinutes();//获取分针 
   var s = t.getSeconds();//获取秒针 
   context.save();//再次保存2 
   context.setLineWidth(7); 
   //旋转角度=30度*(h+m/60+s/3600) 
   //分针旋转角度=6度*(m+s/60) 
   //秒针旋转角度=6度*s 
   context.beginPath(); 
   //绘制时针 
   context.rotate((Math.PI/6)*(h+m/60+s/3600)); 
   context.moveTo(-20,0); 
   context.lineTo(width/4.5-20,0); 
   context.stroke(); 
   context.restore();//恢复到2,(最初未旋转状态)避免旋转叠加 
   context.save();//3 
   //画分针 
   context.setLineWidth(5); 
   context.beginPath(); 
   context.rotate((Math.PI/30)*(m+s/60)); 
   context.moveTo(-20,0); 
   context.lineTo(width/3.5-20,0); 
   context.stroke(); 
   context.restore();//恢复到3,(最初未旋转状态)避免旋转叠加 
   context.save(); 
   //绘制秒针 
   context.setLineWidth(2); 
   context.beginPath(); 
   context.rotate((Math.PI/30)*s); 
   context.moveTo(-20,0); 
   context.lineTo(width/3-20,0); 
   context.stroke(); 
  } 
  //调用 
  function drawClock(){ 
   reSet(); 
   circle(); 
   num(); 
   smallGrid(); 
   bigGrid(); 
   move(); 
  } 
  drawClock()//调用运动函数 
  // 调用 wx.drawCanvas,通过 canvasId 指定在哪张画布上绘制,通过 actions 指定绘制行为 
  wx.drawCanvas({ 
   canvasId:'myCanvas', 
   actions: context.getActions() 
  }) 
 }, 
 //页面卸载,清除画布绘制计时器 
 onUnload:function(){ 
  clearInterval(this.interval) 
 } 
})

index.wxml中存放着canvas标签,并通过canvas-id和class指定了组件标识符和样式选择器

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

index.wxss设置画布样式

.canvas{ 
 width: 100%; 
 height: 100%; 
 position: fixed; 
}

app.json文件设置了页面路径和窗口表现

{ 
 "pages": [ 
  "pages/index" 
 ], 
 "window": { 
 "navigationBarTextStyle": "light", 
 "navigationBarTitleText": "画布时钟", 
 "navigationBarBackgroundColor": "#000", 
 "backgroundColor": "#fbf9fe" 
 } 
}

这样,整个微信小程序画布时钟就简单的创建完成,看一下效果

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

guthub下载地址:https://github.com/RidingACodeToStray/weCanvasClock.Git

以上所述是小编给大家介绍的JS绘制微信小程序画布时钟,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
一些常用的JavaScript函数(json)附详细说明
May 25 Javascript
Jvascript学习实践案例(开发常用)
Jun 25 Javascript
红米手机抢购的js代码
Mar 10 Javascript
jquery获取复选框被选中的值
Mar 22 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
Oct 11 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
Nov 15 Javascript
详解angular2封装material2对话框组件
Mar 03 Javascript
vue-resourse将json数据输出实例
Mar 08 Javascript
关于axios不能使用Vue.use()浅析
Jan 12 Javascript
微信开发之微信jssdk录音功能开发示例
Oct 22 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
Sep 16 Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 #Javascript
DropDownList控件绑定数据源的三种方法
Dec 24 #Javascript
Bootstrap源码学习笔记之bootstrap进度条
Dec 24 #Javascript
js addDqmForPP给标签内属性值加上双引号的函数
Dec 24 #Javascript
Bootstrap php制作动态分页标签
Dec 23 #Javascript
前端JS面试中常见的算法问题总结
Dec 23 #Javascript
Bootstrap源码解读导航条(7)
Dec 23 #Javascript
You might like
第八节--访问方式
2006/11/16 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
php制作动态随机验证码
2015/02/12 PHP
php常用的工具开发整理
2019/09/26 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
jquery实现数字输入框
2017/02/22 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
python实现删除文件与目录的方法
2014/11/10 Python
python实现简单socket通信的方法
2016/04/19 Python
python 除法保留两位小数点的方法
2018/07/16 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
python ubplot使用方法解析
2020/01/10 Python
Django如何重置migration的几种情景
2021/02/24 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
普通院校学生的自荐信
2013/11/27 职场文书
党课学习思想汇报
2014/01/02 职场文书
公司员工离职证明书
2014/10/04 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书