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

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

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

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

从目录结构就可以看出来这个程序是简单的单层页面,画布渲染在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"
 }
}

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

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

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

(0)

相关推荐

  • 详解微信小程序——自定义圆形进度条

    微信小程序 自定义圆形进度条,具体如下: 无图无真相,先上图: 实现思路,先绘制底层的灰色圆圈背景,再绘制上层的蓝色进度条. 代码实现: JS代码: Page({ data: {}, onLoad: function (options) { // 页面初始化 options为页面跳转所带来的参数 }, onReady: function () { // 页面渲染完成 var cxt_arc = wx.createCanvasContext('canvasArc');//创建并返回绘图上下文con

  • 微信小程序-详解微信登陆、微信支付、模板消息

    微信公众平台近日悄然开始内测微信小程序(微信公众号)功能,引来无数开发者和普通用户关注,微信支付的能力,是随着小程序的发布一并推出的,具有介绍如下: wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. OBJECT参数说明: success返回参数说明: 示例代码: //app.js App({ onLaunch: functio

  • 微信小程序 解决swiper不显示图片的方法

    微信小程序 解决swiper不显示图片的方法 1.我说的swiper不显示图片是只有一个swiper的框,但不显示设置好的图片. 第一个要确定的是图片路径设置的正不正确,确定路径没有设置错,还有一个可能的原因就是,放swiper的这个页面(也就是这个wxml文件)没有在app.json里面的pages进行注册 确决的方法是: 找到项目下的app.json文件 在app.json的配置文件下的pages进行页面注册,像下面图片这样 小程序的文档也写了"小程序中新增/减少页面,都需要对 pages

  • 微信小程序开发探究

    前段时间比较流行的微信小程序,因为一直没有所谓内测码也没具体关注.拖到现在正好借组内分享的时机来仔细了解一下微信小程序.了解一个新的事物无外乎从是什么(本质),怎么用(具体用法),为什么用(优缺点)来学习,首先分析一下微信小程序是什么,听起来比较高大上,说实话原来我确实挺疑惑,到底这一套是什么开发机制,native?hybrid?纯h5?看网上各种教程上来就说api说语法,感觉不先理清楚是什么的问题就去搬api过来纯粹是耍流氓. 一.微信小程序是什么:     言归正传,微信小程序的本质是什么?

  • PHP:微信小程序 微信支付服务端集成实例详解及源码下载

    微信小程序 微信支付服务端集 理论上集成微信支付的全部工作可以在小程序端完成,因为小程序js有访问网络的能力,但是为了安全,不暴露敏感key,而且可以使用官方提供的现成php demo更省力,于是在服务端完成签名与发起请求,小程序端只做一个wx.requestPayment(OBJECT)接口的对接. 整体集成过程与JSAPI.APP类似,先统一下单,然后拿返回的结果来请求支付. 一共三步: 1.小程序端通过wx.login的返回的code换取openid 2.服务端向微信统一下单 3.小程序端

  • 微信小程序进行微信支付的步骤昂述

    最近开发微信小程序进入到支付阶段,一直以来从事App开发,所以支付流程还是熟记于心的.但是微信小程序的支付就有点奇怪了,应用的创建是在公众号里,但是文档的介绍却在公众号中无法找到直接入口,甚是不解,而且小程序的师傅到底是属于公众号支付范畴还是app支付范畴也成疑问.下面是小程序支付文档的入口(嵌套在小程序api中): https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1 小程序支付步骤: 1,预支付

  • 微信小程序 石头剪刀布实例代码

    微信小程序 石头剪刀布 昨天看有个石头剪刀布的练习,就拿出来做了一下,布局的代码浪费了很多时间,果然CSS这块的还不是很熟练,下面直接上图上代码了. .js: var numAi = 0 var timer Page({ data:{ //控制按钮是否可点击 btnState:false, //记录获胜次数 winNum:0, //中间的话"Ho~ You Win" gameOfPlay:'', //用户选择的图片 imageUserScr:'/pages/image/wenhao.p

  • 微信小程序 实战实例开发流程详细介绍

    前言:         微信小程序最近要发布了,抽空学习下如何开发,在网上找到的实例,觉得不错,给大家分享, 前后两天花了大约四五个小时制作完了自己第一个小程序,当然是没法发布的,小程序的发布要求还是挺严格的:企业资质.HTTPS.审核. 先大概介绍下自己,我9年前和很多网友一样开始自学编程,这些年来什么语言都学过.什么平台都接触过,自己也做过十来个产品,所以编程基础不是很稳固但是各方面都相对比较熟悉,因此在接触小程序的时候上手比较快. 至于为什么现在选择开发小程序,原因很简单,尝尝鲜! 学习

  • Android中微信小程序支付倒计时功能

    看效果 由于web 经验弱爆- -  一开始我的思路是找事件,但是看了半天API 基本都是点击触摸,通过物理触发- - 我居然忽略了生命周期,生命周期+线程不就完全OK吗- 事实证明,线程还是王道啊,一开始就应该这么搞嘛- 度娘上面也看了很多都是用js写的,but,可能刚做没几天吧,我对js与微信小程序掌握还不够熟练 思路: onLoad:function(options)调用倒计时方法函数 定义线程进行数据动态现实 1. 日期转化成毫秒 2.定义线程动态显示 3.渲染倒计时 1.毫秒转成固定格

  • 使用DeviceOne实现微信小程序功能

    微信小程序即将推出,还没推出就火的不行了.基于微信这个巨大平台,小程序必然能有巨大成功.不过它并不能完全取代App,该开发App还得开发.如果我们自己想实现一个基于自己的APP包含类似微信的小程序功能,该如何实现了?我们先来看看小程序的技术特点. 小程序的特点 1. 跨平台,微信就像JRE,在不同操作系统上都有实现,所以微信上的小程序就像运行在JRE上的java程序,从而实现跨平台.另外解决了多平台多机型的适配问题. 2. 体验好,webview加载html是最容易的跨平台方式,但是在手机上的体

  • JS中微信小程序自定义底部弹出框

    实现微信小程序底部弹出框效果,代码分为html,css和js两部分,具体代码详情大家参考下本文. html <view class="commodity_screen" bindtap="hideModal" wx:if="{{showModalStatus}}"></view> <view animation="{{animationData}}" class="commodity_a

  • 微信小程序 解决请求服务器手机预览请求不到数据的方法

    微信小程序 解决请求服务器手机预览请求不到数据的方法 微信小程序的文档中明确说明了所有的请求是必须使用https的,以没用过https,由于小程序,不得不接触到https,研究了好长时间把tomcat配置好了https.然后用开发者工具测试是否能请求到数据,发现能获取到很开心. 后来是注册了小程序,在小程序后台也进行了设置,见下图 给项目加了APPID,准备进行手机预览的测试 这里说一下,在开发小程序时尽量把图片放到自己的服务器上,因为小程序在上传和预览时都有编译包的限制,没有算过,大概是1M,

随机推荐