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 相关文章推荐
js onkeypress与onkeydown 事件区别详细说明
Dec 13 Javascript
JS 跳转页面延迟2种方法
Mar 29 Javascript
js函数返回多个返回值的示例代码
Nov 05 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
使用时间戳解决ie缓存的问题
Aug 20 Javascript
JS中捕获console.log()输出的方法
Apr 16 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
微信小程序 wxapp内容组件 text详细介绍
Oct 31 Javascript
JS中正则表达式要注意lastIndex属性
Aug 08 Javascript
使用vue2.0创建的项目的步骤方法
Sep 25 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 Javascript
jQuery弹框插件使用方法详解
May 26 jQuery
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
PHP连接MongoDB示例代码
2012/09/06 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
用户注册常用javascript代码
2009/08/29 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
Vue组件开发初探
2017/02/14 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
express 项目分层实践详解
2018/12/10 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
Django权限机制实现代码详解
2018/02/05 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
C#软件工程师英语面试题
2015/06/07 面试题
Java语言程序设计测试题判断题部分
2013/01/06 面试题
家长会主持词开场白
2014/03/18 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
班组拓展活动方案
2014/08/14 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
解除劳动合同协议书
2014/09/17 职场文书
力克胡哲观后感
2015/06/10 职场文书
公务员处分决定书
2015/06/25 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书