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 相关文章推荐
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
javascript针对DOM的应用分析(二)
Apr 15 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
Sep 16 Javascript
js中实现多态采用和继承类似的方法
Aug 22 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
深入探究AngularJS框架中Scope对象的超级教程
Jan 04 Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 Javascript
JS实现模糊查询带下拉匹配效果
Jun 21 Javascript
axios对请求各种异常情况处理的封装方法
Sep 25 Javascript
详解如何使用koa实现socket.io官网的例子
Nov 04 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
Jun 23 Javascript
详解JS WebSocket断开原因和心跳机制
May 07 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
php从文件夹随机读取文件的方法
2015/06/01 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
Python解析json文件相关知识学习
2016/03/01 Python
浅谈Django REST Framework限速
2017/12/12 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
python对文件的操作方法汇总
2020/02/28 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
军训学生自我鉴定
2014/02/12 职场文书
《乡愁》教学反思
2014/02/18 职场文书
合作投资意向书
2014/04/01 职场文书
高三毕业寄语
2014/04/10 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
教师节寄语2015
2015/03/23 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
浅谈MySQL函数
2021/10/05 MySQL
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS