超详细,用canvas在微信小程序上画时钟教程

2023-11-05 11:08

本文主要是介绍超详细,用canvas在微信小程序上画时钟教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近开始学习canvas,看了慕课网的一个视频,开始自己动手在微信小程序上画个时钟,

首先我们可以先看以下微信小程序的官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/canvas/reference.html

和canvas的手册对比:http://www.w3school.com.cn/tags/html_ref_canvas.asp

我觉得其实除了删减一些内容之外没什么太大的区别

 

直接贴代码: 

wxml

<!--index.wxml-->
<view class="container">
<canvas canvas-id="clock"/>
</view>

wxss

复制代码
/**index.wxss**/.container {height: 100%;width: 100%;
}canvas {height: 100%;width: 100%;
}/*有些人会有疑问为什么设置了100%却没有100%,其实要到app.wxss里设置一下*/
/**app.wxss**/
page{width:100%;height:100%;
}
复制代码

js

复制代码
Page({data: {width: 0,height: 0},onLoad: function (options) {var that = this//获取系统信息  
    wx.getSystemInfo({//获取系统信息成功,将系统窗口的宽高赋给页面的宽高  success: function (res) {that.width = res.windowWidth// console.log(that.width)   375that.height = res.windowHeight// console.log(that.height)  625// 这里的单位是PX,实际的手机屏幕有一个Dpr,这里选择iphone,默认Dpr是2
      }})},onReady: function () {this.drawClock();// 每40ms执行一次drawClock(),人眼看来就是流畅的画面this.interval = setInterval(this.drawClock, 40);},// 所有的canvas属性以及Math.sin,Math.cos()等涉及角度的参数都是用弧度表示// 时钟drawClock: function () {const ctx = wx.createCanvasContext('clock');var height = this.height;var width = this.width;// 设置文字对应的半径var R = width / 2 - 60;// 把原点的位置移动到屏幕中间,及宽的一半,高的一半ctx.translate(width / 2, height / 2);// 画外框function drawBackground() {// 设置线条的粗细,单位pxctx.setLineWidth(8);// 开始路径
      ctx.beginPath();// 运动一个圆的路径// arc(x,y,半径,起始位置,结束位置,false为顺时针运动)ctx.arc(0, 0, width / 2 - 30, 0, 2 * Math.PI, false);ctx.closePath();// 描出点的路径
      ctx.stroke();};// 画时钟数function drawHoursNum() {ctx.setFontSize(20);// 圆的起始位置是从3开始的,所以我们从3开始填充数字var hours = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];hours.forEach(function (hour, i) {var rad = (2 * Math.PI / 12) * i;var x = R * Math.cos(rad);var y = R * Math.sin(rad);// 因为微信小程序不支持BaseLine这个属性,所以这里我们只能自己手动调整位置if (hour == 12) {ctx.fillText(hour, x - 11, y + 6);} else if (hour == 6) {ctx.fillText(hour, x - 5, y + 6);} else {ctx.fillText(hour, x - 6, y + 6);}})};// 画数字对应的点function drawdots() {for (let i = 0; i < 60; i++) {var rad = 2 * Math.PI / 60 * i;var x = (R + 15) * Math.cos(rad);var y = (R + 15) * Math.sin(rad);ctx.beginPath();// 每5个点一个比较大if (i % 5 == 0) {ctx.arc(x, y, 2, 0, 2 * Math.PI, false);} else {ctx.arc(x, y, 1, 0, 2 * Math.PI, false);}ctx.setFillStyle('black');ctx.fill();}ctx.closePath();}// 画时针function drawHour(hour, minute) {// 保存画之前的状态
      ctx.save();ctx.beginPath();// 根据小时数确定大的偏移var rad = 2 * Math.PI / 12 * hour;// 根据分钟数确定小的偏移var mrad = 2 * Math.PI / 12 / 60 * minute;// 做旋转ctx.rotate(rad + mrad);ctx.setLineWidth(8);// 设置线条结束样式为圆ctx.setLineCap('round');// 时针向后延伸8个px;ctx.moveTo(0, 8);// 一开始的位置指向12点的方向,长度为R/2ctx.lineTo(0, -R / 2);ctx.stroke();ctx.closePath();// 返回画之前的状态
      ctx.restore();}// 画分针function drawMinute(minute, second) {ctx.save();ctx.beginPath();// 根据分钟数确定大的偏移var rad = 2 * Math.PI / 60 * minute;// 根据秒数确定小的偏移var mrad = 2 * Math.PI / 60 / 60 * second;ctx.rotate(rad + mrad);// 分针比时针细ctx.setLineWidth(6);ctx.setLineCap('round');ctx.moveTo(0, 10);// 一开始的位置指向12点的方向,长度为3 * R / 4ctx.lineTo(0, -3 * R / 4);ctx.stroke();ctx.closePath();ctx.restore();}// 画秒针function drawSecond(second, msecond) {ctx.save();ctx.beginPath();// 根据秒数确定大的偏移var rad = 2 * Math.PI / 60 * second;// 1000ms=1s所以这里多除个1000var mrad = 2 * Math.PI / 60 / 1000 * msecond;ctx.rotate(rad + mrad);ctx.setLineWidth(4);// 设置线条颜色为红色,默认为黑色ctx.setStrokeStyle('red');ctx.setLineCap('round');ctx.moveTo(0, 12);ctx.lineTo(0, -R);ctx.stroke();ctx.closePath();ctx.restore();}//画出中间那个灰色的圆function drawDot() {ctx.beginPath();ctx.arc(0, 0, 8, 0, 2 * Math.PI, false);ctx.setFillStyle('lightgrey');ctx.fill();ctx.closePath();}function Clock() {// 实时获取各个参数var now = new Date();var hour = now.getHours();var minute = now.getMinutes()var second = now.getSeconds();var msecond = now.getMilliseconds();// 依次执行各个方法
      drawBackground();drawHoursNum();drawdots();drawHour(hour, minute);drawMinute(minute, second);drawSecond(second, msecond);drawDot();// 微信小程序要多个draw才会画出来,所以在最后画出
      ctx.draw();}// 执行Clock这个方法,实际上执行了所有步骤
    Clock();}
})
复制代码

最后出来是这个样子(比较遗憾的是小程序好像不支持设置canvas的文字样式):


 

最后有一个疑问,小程序不用像网页一样在执行前后加一个ctx.clearRect()和ctx.restore(),是否小程序每执行一次都会推倒重画?

这篇关于超详细,用canvas在微信小程序上画时钟教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/349436

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom