使用canvas绘制一个时钟
周末学习canvas的一些基础功能,顺带写了一个基础的时钟。现在加工一下,做的更好看一点,先放上效果图:
谈一些自己的理解:
(1)、要绘制一个新的样式(不想被其他样式影响,或者影响到其他样式),那么一定记得先用beginPath(),beginPath()可以新建一个子路径,接下来的绘制,都是针对该子路径进行的。如果不适用该方法,那么默认和之前路径为同一路径设置,在接下来的绘制中,前面设置的路径会被重复绘制(打个比方,如果不用beginPath(),上面我绘制了一个长方形,边框宽度为1,下面我又绘制了一个长方形,边框宽度为5,那么上面的长方形会被重新绘制,且边框宽度也变为5)。相对的还有一个closePath()方法,如果前面设置的路径是开放的,该方法会自动用直线连接终点和起点。
(2)、因为时、分、秒针都是通过循环并且旋转来做出移动效果,所以需要在每次旋转前,通过save()方法保存下当前状态,并在旋转后restore()恢复到之前状态,否则每次旋转都会在上一次旋转的基础上进行。
(3)、仔细看的话可以发现秒针的尾端是一个弧线,canvas里有很多曲线的绘制方法,且大多与切线(切点)有关,具体可以搜索下,网上有很多详解文章了。
(4)、lineTo()、arc()、arcTo()这些都仅仅是绘制路径,最后要通过fill()或者stroke()来完成绘制。
下面给出完整代码,补上了注释:
<!doctype html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<style>
</style>
</head>
<body>
<canvas id="my_clock" width="1200" height="900">不支持canvas</canvas>
<script>
var myClock = document.getElementById('my_clock');
var ctx = myClock.getContext('2d');
var clockImg = new Image();
clockImg.src = 'clock.png';
ctx.translate(600, 400); var startTime = new Date().getTime(),
count = 0; function clock() {
ctx.clearRect(-600, -400, 1200, 900); // 裁剪钟面图,只留下圆的钟面
ctx.beginPath();
ctx.arc(0, 0, 250, 0, 2 * Math.PI);
ctx.clip(); // 钟面图有点歪,需要差不多顺时针旋转1/3度
ctx.save()
ctx.rotate(1 / 3 * 2 * Math.PI / 60);
ctx.drawImage(clockImg, - 250, -250, 500, 500);
ctx.restore(); // 这里注释的部分的是绘制的一个简单的钟面,如果不用图片可以打开下面的注释
// ctx.beginPath();
// ctx.arc(0, 0, 200, 0, 2 * Math.PI, false); // ctx.moveTo(195, 0);
// ctx.arc(0, 0, 195, 0, 2 * Math.PI, false);
// ctx.stroke();
// ctx.closePath(); // ctx.font = '16px Arial';
// ctx.textAlign = 'center';
// ctx.textBaseline = 'middle'; // ctx.fillText('12', 0, -180);
// ctx.fillText('3', 180, 0);
// ctx.fillText('6', 0, 180);
// ctx.fillText('9', -180, 0); var nowTime = new Date(),
sec = nowTime.getSeconds(),
min = nowTime.getMinutes() + sec / 60,
hour12 = nowTime.getHours() >= 12 ? nowTime.getHours() - 12 : nowTime.getHours(),
hour = hour12 + min / 60; // 实时时间转换成角度,一圈是360度,也就是2PI,一圈有60小格,一小格就是(2 * Math.PI / 60)
var angle = 2 * Math.PI / 60,
secHandAngle = sec * angle,
minHandAngle = min * angle,
hourHandAngle = hour * 5 * angle; // 秒针
ctx.save();
ctx.beginPath();
ctx.rotate(secHandAngle)
ctx.moveTo(-2, 10);
ctx.lineTo(0, -240);
ctx.lineTo(2, 10);
ctx.moveTo(-2, 10);
ctx.arcTo(0, -240, 2, 10, 2);
ctx.stroke();
ctx.restore(); // 分针
ctx.save();
ctx.beginPath();
ctx.rotate(minHandAngle)
ctx.moveTo(0, 0);
ctx.lineTo(0, -170);
ctx.lineWidth = 2;
ctx.stroke();
ctx.restore(); // 时针
ctx.save();
ctx.beginPath();
ctx.rotate(hourHandAngle)
ctx.moveTo(-5, 0);
ctx.lineTo(0, -120);
ctx.lineTo(5, 0);
ctx.strokeStyle = '#fff'
ctx.fillStyle = 'rgba(0, 0, 0, .3)';
ctx.lineWidth = 1;
ctx.stroke();
ctx.fill();
ctx.restore(); // 减少setTimeout误差
count++;
var diff = new Date().getTime() - (startTime + count * 1000);
var nextStart = (1000 - diff) < 0 ? 0 : 1000 - diff;
setTimeout(clock, nextStart);
} // 占用线程
// setInterval(function(){
// var j = 0;
// while (j++ < 100000000);
// }, 0);
// setInterval(function(){
// var j = 0;
// while (j++ < 100000000);
// }, 0);
// setInterval(function(){
// var j = 0;
// while (j++ < 100000000);
// }, 0); setTimeout(clock, 1000);
// setInterval(clock, 1000) </script>
</body>
</html>
然后给上我用的钟面图:
使用canvas绘制一个时钟的更多相关文章
- 用canvas绘制一个时钟
实现一个时钟的绘制和时间的显示 一,首先是页面的搭建html部分以及一点点的css代码,因为css这块用的比较少,所以就没有单独出来: <!DOCTYPE html> <html l ...
- 用canvas绘制一个简易时钟
在见识了html5中canvas的强大,笔者准备制作一个简易时钟. 下面就是成果啦,制作之前我们先分析一下,绘制一个时钟需要做哪些准备. 一 . 1.首先这个时钟分为表盘,指针(时针,分针,秒针)和数 ...
- 深夜,用canvas画一个时钟
深夜,用canvas画一个时钟 查看demo 这几天准备阿里巴巴的笔试,可以说已经是心力交瘁,自从阿里和蘑菇街的内推被刷掉之后,开始越来越怀疑起自己的能力来,虽然这点打击应该是微不足道的.毕竟校招在刚 ...
- 通过H5的新标签canvas做出一个时钟的全过程,希望对初学者有帮助
最近学习了H5中的一个新标签canvas并且用它做出了一个时钟,最下面是成品图像,还不错吧,这只是我学习中的一个小demo,做得有点粗糙,但终究是做出来了,以后再写自己的网页主页再做一个好看点放上去. ...
- 用HTML5的canvas做一个时钟
对于H5来说,canvas可以说是它最有特色的一个地方了,有了它之后我们可以随意的在网页上画各种各样的图形,做一些小游戏啊什么的.canvas这个标签的用法,在网上也有特别多的教程了,这里就不作介绍了 ...
- HTML5 在canvas绘制一个矩形
笔者:本笃庆军 原文地址:http://blog.csdn.net/qingdujun/article/details/32930501 一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统 ...
- Canvas绘制一个大鱼喂小鱼的游戏
Canvas是HTML5中的一部分,强大的API足以让我们绘制我们任意想绘制的东西.利用Canvas的基础学习以及JavaScript面向对象的思想绘制一个小游戏,下面是源码地址https://git ...
- canvas绘制表盘时钟
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Canvas 绘制一个像素风电子时钟
想法是在 Canvas 上绘制由小方块组成的数字. 第一步是实现绘制小方块的方法,先画出一个边长为 5 的 10x10 个方块,使用两个 for 循环很简单就能完成. for (let i = 0; ...
随机推荐
- Java:方法的参数是传值还是传引用
Java中方法的参数总是采用传值的方式. 下列方法欲实现对象的交换,但实际上是不能实现的. public void swap(simpleClass a,simpleClass b){ simpleC ...
- javaSE基础05
javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...
- jquery遍历不同色彩的li
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- AngularJS 路由
AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 通常 ...
- JS中,!=, !== 和 !的区别和使用场景
var num = 1; var str = '1'; var test = 1; test == num //true 相同类型 相同值 test === num //true 相同类型 ...
- 一、常见PHP网站安全漏洞
对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.session文件漏洞 Sess ...
- Android中用TextView显示大量文字的方法
最近学习Android中,试着实现一个简单的显示新闻Demo的时候,遇到了一个问题:一条新闻的内容文字很多,放在TextView上面超出屏幕了,怎么破? 查了一下资料,找到了两种方法实现: 1. 只用 ...
- 安装Python环境时遇到的问题
问题描述:An error occurred during the installation of assembly 'Microsoft.VC90.MFC,version="9.0.210 ...
- FZU 2137 奇异字符串 后缀树组+RMQ
题目连接:http://acm.fzu.edu.cn/problem.php?pid=2137 题解: 枚举x位置,向左右延伸计算答案 如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有 ...
- Beginning Scala study note(7) Trait
A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...