基于canvas实现钟表
原理说明
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实现钟表的更多相关文章
- Particles.js基于Canvas画布创建粒子原子颗粒效果
文章目录 使用方法 自定义参数 相关链接 Particles.js是一款基于HTML5 Canvas画布的轻量级粒子动画插件,可以设置粒子的形状.旋转.分布.颜色等属性,还可以动态添加粒子,效果非常炫 ...
- 基于canvas的二维码邀请函生成插件
去年是最忙碌的一年,实在没时间写博客了,看着互联网行业中一个又一个人的倒下,奉劝大家,健康要放在首位,保重身体.好了,言归正传,这是17年的第一篇博文,话说这天又是产品同学跑过来问我说:hi,lenn ...
- 7个华丽的基于Canvas的HTML5动画
说起HTML5,可能让你印象更深的是其基于Canvas的动画特效,虽然Canvas在HTML5中的应用并不全都是动画制作,但其动画效果确实让人震惊.本文收集了7个最让人难忘的HTML5 Canvas动 ...
- 微信小程序-基于canvas画画涂鸦
代码地址如下:http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- 基于canvas的仪表盘效果
概述 基于Canvas实现的仪表盘及效果.通过配置参数,可以任意修改仪表盘颜色,刻度,动画过渡时间等,满足不同场景下的使用.同时使用原生的Canvas,也是学习Canvas的很好的例子. 详细 代码下 ...
- canvas画画板,canvas画五角星,canvas制作钟表、Konva写钟表
制作一个画画板,有清屏有橡皮擦有画笔可以换颜色 style样式 <head> <meta charset="UTF-8"> <title>画画板 ...
- 基于canvas二次贝塞尔曲线绘制鲜花
canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...
- 基于canvas实现的高性能、跨平台的股票图表库--clchart
什么是 ClChart? ClChart是一个基于canvas创建的简单.高性能和跨平台的股票数据可视化开源项目.支持PC.webApp以及React Native和Weex等平台.在React Na ...
- 基础canvas应用-钟表绘制
首先,canvas语法基础薄弱的小伙伴请点这里,剩下的小伙伴们可以接着往下看了. 一个表,需要画什么出来呢:3条线(时分秒针),1个圆(表盘),以及60条短线/点(刻度). 嗯,没毛病. 那接下来让我 ...
随机推荐
- PopupWindow弹出框
使用PopupWindow实现一个悬浮框,悬浮在Activity之上,显示位置可以指定 首先创建pop_window.xml: <?xml version="1.0" enc ...
- [VB.NET Tips]VB.NET专有的字符串处理函数
.NET Framework类库中含有专门为Visual Basic.NET程序员设计的函数和过程. 这些方法虽然是为VB.NET程序员设计的,但是也可以被.NET Framework上支持的任何语言 ...
- 2020Pycharm安装教程!最新2020pycharm安装!如何安装Pycharm2020版本!如何安装Pycharm!如何安装2020Pycharm!2020Pycharm永久激活!
本教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Pytho ...
- FPGA 开发详细流程你了解吗?
FPGA 的详细开发流程就是利用 EDA 开发工具对 FPGA 芯片进行开发的过程. FPGA 的详细开发流程如下所示,主要包括电路设计.设计输入.综合(优化).布局布线(实现与优化).编程配置五大步 ...
- jenkins插件之Publish Over SSH的使用
1,安装 在插件管理选项搜索Publish Over SSH,然后点击安装即可完成 2,安装完成之后,就可以在jenkins的配置系统中找到Publish Over SSH 配置完服务器之后,然后在项 ...
- ETL-Kettle学习笔记(入门,简介,简单操作)
KETTLE Kettle:简介 ETL:简介 ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换, ...
- 链表-LinkList
什么是链表 维基百科:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存 ...
- Hadoop点滴-何时使用hadoop fs、hadoop dfs与hdfs dfs命令
何时使用hadoop fs.hadoop dfs与hdfs dfs命令 编辑 删除 hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件 ...
- 对vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制
一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...
- F#周报2019年第40期
新闻 将项目成熟度重新考虑为一个社区过程 介绍.NET Core Windows Form设计器预览1 F# 4.7可以预览新语言特性与语法 视频及幻灯片 DotnetConf2019展示 .NET设 ...