原理说明

1、通过arc方法实现钟表外环;

2、通过line实现钟表时针,分针,秒针和刻度标志的绘制,基于save和restore方法旋转画布绘制不同角度的指针;

3、通过font方法实现在画布上绘制文字,基于save和restore方法旋转绘制的文字,使文字正向显示。

实例效果图如下

绘制钟表圆形边框方法,centerX表示圆中心点x坐标,centerY表示圆中心店y坐标

function drawClockBall (centerX,centerY) {
ctx.strokeStyle = centerBallColor;
ctx.lineWidth = centerBallRange;
ctx.beginPath();
ctx.arc(centerX,centerY,centerBallRadius + centerBallRange / 2,0,2 * Math.PI);
ctx.closePath();
ctx.stroke();
ctx.strokeStyle = outerBallColor;
ctx.lineWidth = outerBallRange;
ctx.beginPath();
ctx.arc(centerX,centerY,centerBallRadius + centerBallRange + outerBallRange / 2,0,2 * Math.PI);
ctx.closePath();
ctx.stroke();
ctx.strokeStyle = centerBallColor;
ctx.lineWidth = outerLineWidth;
ctx.beginPath();
ctx.arc(centerX,centerY,centerBallRadius + centerBallRange + outerBallRange,0,2 * Math.PI);
ctx.closePath();
ctx.stroke();
}

绘制3,6,9,12时刻刻度和文字方法,rotate表示图形旋转角度,centerX表示图形绘制中心点x坐标,centerY表示图形绘制中心店y坐标

function drawClockSpecialMark(rotate,centerX,centerY){
ctx.save();
ctx.translate(centerX,centerY);
ctx.rotate(rotate * Math.PI / 180)
ctx.fillStyle = clockMarkColor;
ctx.beginPath();
ctx.arc(0,-centerBallRadius + clockMarkWidth * 2,clockMarkCircleRadius,0,2 * Math.PI);
ctx.closePath();
ctx.fill(); ctx.translate(0,-centerBallRadius + clockMarkWidth * 3 + fontSize);
ctx.rotate(-rotate * Math.PI / 180)
ctx.font = fontSize + 'px bold 黑体';
ctx.fillStyle = fontColor;
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(parseInt(rotate / 30), 0, 0);
ctx.restore();
}

绘制非3,6,9,12时刻刻度和文字方法,rotate表示图形旋转角度,lineWidth表示刻度线条宽度,range表示刻度之间的差值,centerX表示图形绘制中心点x坐标,centerY表示图形绘制中心店y坐标

function drawClockIntMark(rotate,lineWidth,range,centerX,centerY) {
ctx.save();
ctx.translate(centerX,centerY);
ctx.rotate(rotate * Math.PI / 180)
ctx.strokeStyle = clockMarkColor;
ctx.lineWidth = lineWidth;
ctx.beginPath();
ctx.moveTo(0,-centerBallRadius + clockMarkWidth);
ctx.lineTo(0,-centerBallRadius + clockMarkWidth * 3 - range);
ctx.stroke();
if (rotate % 30 == 0) {
ctx.translate(0,-centerBallRadius + clockMarkWidth * 3 + fontSize);
ctx.rotate(-rotate * Math.PI / 180)
ctx.font = fontSize + 'px bold 黑体';
ctx.fillStyle = fontColor;
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(parseInt(rotate / 30), 0, 0);
}
ctx.restore();
}

绘制时钟时针,分针,秒针方法,centerX表示圆中心点x坐标,centerY表示圆中心店y坐标

function drawIndicatorFun(centerX,centerY) {
var newDate = new Date();
var currentHour = newDate.getHours();
var currentMinute = newDate.getMinutes();
var currentSecond = newDate.getSeconds();
ctx.fillStyle = indicatorColor;
ctx.beginPath();
ctx.arc(centerX,centerY,indicatorBallRadius,0,2 * Math.PI);
ctx.closePath();
ctx.fill();
ctx.fillStyle = '#fff';
ctx.beginPath();
ctx.arc(centerX,centerY,indicatorBallRadius - 3,0,2 * Math.PI);
ctx.closePath();
ctx.fill();
// 时针
ctx.save();
ctx.translate(centerX,centerY);
ctx.rotate((currentHour * 30 + currentMinute / 60 * 30) * Math.PI / 180)
ctx.strokeStyle = indicatorColor;
ctx.lineWidth = 3;
ctx.beginPath();
ctx.moveTo(0,25)
ctx.lineTo(0,-centerBallRadius + clockMarkWidth * 12,clockMarkCircleRadius)
ctx.stroke();
ctx.restore();
// 分针
ctx.save();
ctx.translate(centerX,centerY);
ctx.rotate((currentMinute * 6 + currentSecond / 60 * 6) * Math.PI / 180)
ctx.strokeStyle = indicatorColor;
ctx.lineWidth = 3;
ctx.beginPath();
ctx.moveTo(0,25)
ctx.lineTo(0,-centerBallRadius + clockMarkWidth * 3,clockMarkCircleRadius)
ctx.stroke();
ctx.restore();
// 秒针
ctx.save();
ctx.translate(centerX,centerY);
ctx.rotate((currentSecond * 6) * Math.PI / 180)
ctx.strokeStyle = indicatorSecondColor;
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(0,25)
ctx.lineTo(0,-centerBallRadius + clockMarkWidth * 3,clockMarkCircleRadius)
ctx.stroke();
ctx.restore();
}

实例预览地址:基于canvas实现钟表

后话

希望上述讲解对您有帮助!!!

基于canvas实现钟表的更多相关文章

  1. Particles.js基于Canvas画布创建粒子原子颗粒效果

    文章目录 使用方法 自定义参数 相关链接 Particles.js是一款基于HTML5 Canvas画布的轻量级粒子动画插件,可以设置粒子的形状.旋转.分布.颜色等属性,还可以动态添加粒子,效果非常炫 ...

  2. 基于canvas的二维码邀请函生成插件

    去年是最忙碌的一年,实在没时间写博客了,看着互联网行业中一个又一个人的倒下,奉劝大家,健康要放在首位,保重身体.好了,言归正传,这是17年的第一篇博文,话说这天又是产品同学跑过来问我说:hi,lenn ...

  3. 7个华丽的基于Canvas的HTML5动画

    说起HTML5,可能让你印象更深的是其基于Canvas的动画特效,虽然Canvas在HTML5中的应用并不全都是动画制作,但其动画效果确实让人震惊.本文收集了7个最让人难忘的HTML5 Canvas动 ...

  4. 微信小程序-基于canvas画画涂鸦

    代码地址如下:http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  5. 基于canvas的仪表盘效果

    概述 基于Canvas实现的仪表盘及效果.通过配置参数,可以任意修改仪表盘颜色,刻度,动画过渡时间等,满足不同场景下的使用.同时使用原生的Canvas,也是学习Canvas的很好的例子. 详细 代码下 ...

  6. canvas画画板,canvas画五角星,canvas制作钟表、Konva写钟表

    制作一个画画板,有清屏有橡皮擦有画笔可以换颜色 style样式 <head> <meta charset="UTF-8"> <title>画画板 ...

  7. 基于canvas二次贝塞尔曲线绘制鲜花

    canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...

  8. 基于canvas实现的高性能、跨平台的股票图表库--clchart

    什么是 ClChart? ClChart是一个基于canvas创建的简单.高性能和跨平台的股票数据可视化开源项目.支持PC.webApp以及React Native和Weex等平台.在React Na ...

  9. 基础canvas应用-钟表绘制

    首先,canvas语法基础薄弱的小伙伴请点这里,剩下的小伙伴们可以接着往下看了. 一个表,需要画什么出来呢:3条线(时分秒针),1个圆(表盘),以及60条短线/点(刻度). 嗯,没毛病. 那接下来让我 ...

随机推荐

  1. PopupWindow弹出框

    使用PopupWindow实现一个悬浮框,悬浮在Activity之上,显示位置可以指定 首先创建pop_window.xml: <?xml version="1.0" enc ...

  2. [VB.NET Tips]VB.NET专有的字符串处理函数

    .NET Framework类库中含有专门为Visual Basic.NET程序员设计的函数和过程. 这些方法虽然是为VB.NET程序员设计的,但是也可以被.NET Framework上支持的任何语言 ...

  3. 2020Pycharm安装教程!最新2020pycharm安装!如何安装Pycharm2020版本!如何安装Pycharm!如何安装2020Pycharm!2020Pycharm永久激活!

    本教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Pytho ...

  4. FPGA 开发详细流程你了解吗?

    FPGA 的详细开发流程就是利用 EDA 开发工具对 FPGA 芯片进行开发的过程. FPGA 的详细开发流程如下所示,主要包括电路设计.设计输入.综合(优化).布局布线(实现与优化).编程配置五大步 ...

  5. jenkins插件之Publish Over SSH的使用

    1,安装 在插件管理选项搜索Publish Over SSH,然后点击安装即可完成 2,安装完成之后,就可以在jenkins的配置系统中找到Publish Over SSH 配置完服务器之后,然后在项 ...

  6. ETL-Kettle学习笔记(入门,简介,简单操作)

    KETTLE Kettle:简介 ETL:简介 ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换, ...

  7. 链表-LinkList

    什么是链表 维基百科:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存 ...

  8. Hadoop点滴-何时使用hadoop fs、hadoop dfs与hdfs dfs命令

    何时使用hadoop fs.hadoop dfs与hdfs dfs命令 编辑 删除 hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件 ...

  9. 对vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制

    一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...

  10. F#周报2019年第40期

    新闻 将项目成熟度重新考虑为一个社区过程 介绍.NET Core Windows Form设计器预览1 F# 4.7可以预览新语言特性与语法 视频及幻灯片 DotnetConf2019展示 .NET设 ...