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实现无刷新更新数据的详细步骤 asp
Dec 26 Javascript
javascript 面向对象,实现namespace,class,继承,重载
Oct 29 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
Apr 06 Javascript
js验证输入是否为手机号码或电话号码示例
Dec 30 Javascript
js实现下拉列表选中某个值的方法(3种方法)
Dec 17 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
Aug 03 Javascript
jQuery多个版本和其他js库冲突的解决方法
Aug 11 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
Sep 01 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 Javascript
使用electron制作满屏心特效的示例代码
Nov 27 Javascript
Vuex实现购物车小功能
Aug 17 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
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
PHP静态类
2006/11/25 PHP
浅析PHP绘图技术
2013/07/03 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
Python元组知识点总结
2019/02/18 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
django中ImageField的使用详解
2020/12/21 Python
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
迎新晚会邀请函
2014/02/01 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
小学作文评语大全
2014/04/21 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
投标人廉洁自律承诺书
2014/05/26 职场文书
超市店庆活动方案
2014/08/31 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
爱情保证书
2015/01/17 职场文书
宪法宣传标语100条
2019/10/15 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL