最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

canvas动画时钟

来源:懂视网 责编:小采 时间:2020-11-27 15:37:25
文档

canvas动画时钟

canvas动画时钟:最近在学canvas,然后根据MDN上的例子做了个动画时钟(为什么要造个轮子,因为丑。)这是MDN上的例子,怎么说呢,比较复古吧。首先,找一张时钟的图片,就是下面这张了。——来自bigger than bigger的dribbble网站,图片来源(侵删)然后就开始用canva
推荐度:
导读canvas动画时钟:最近在学canvas,然后根据MDN上的例子做了个动画时钟(为什么要造个轮子,因为丑。)这是MDN上的例子,怎么说呢,比较复古吧。首先,找一张时钟的图片,就是下面这张了。——来自bigger than bigger的dribbble网站,图片来源(侵删)然后就开始用canva
最近在学canvas,然后根据MDN上的例子做了个动画时钟(为什么要造个轮子,因为丑。)

这是MDN上的例子,怎么说呢,比较复古吧。

2422145834-58213fc77124c_articlex.png

首先,找一张时钟的图片,就是下面这张了。

3432261377-582029d95e00a_articlex.png

——来自bigger than bigger的dribbble网站,图片来源(侵删)

然后就开始用canvas实现这个逼格满满的时钟吧。在html代码中插入canvas标签

在js文件中创建画布(假设我们使用的都是现代浏览器)。

function clock() {
 var ctx = document.getElementById('canvas').getContext('2d');
}

先来绘制时钟表盘,我们看到这张图是带有光线阴影效果的,画成一样难度太高。于是就用颜色的渐变来让时钟看起来稍微立体一点。在canvas中用createLinearGradient来创建一个新的渐变,并用addColorStop上色,最后把颜色赋给strokeStyle。详见运用样式与颜色 by MDN

//绘制表盘底色
ctx.translate(200, 200); //将坐标原点移到画布中心
ctx.rotate(-Math.PI/2); //将坐标轴逆时针旋转90度,x轴正方向对准12点方向
var lingrad = ctx.createLinearGradient(150, 0, -150, 0);
lingrad.addColorStop(0, '#242f37');
lingrad.addColorStop(1, '#48585c');
ctx.fillStyle = lingrad;
ctx.beginPath();
ctx.arc(0, 0, 150, 0, Math.PI * 2, true);
ctx.fill();

比较关键的一点是画布的坐标轴x轴正方向是时钟3点钟方向,为了方便起见,我们把它逆时针旋转90度让它指向十二点钟方向。

绘制刻度要用到旋转rotate(变形 Transformations by MDN),小时刻度有12个,相邻两个刻度与圆心连线的角度就是Math.PI/6,这里用的是弧度表示,也就是30度。那么我们就用for循环来画出小时的刻度。

for (var i = 0; i < 12; i++) {
 ctx.beginPath();
 ctx.strokeStyle = '#fff';
 ctx.lineWidth = 3;
 ctx.rotate(Math.PI / 6);
 ctx.moveTo(140, 0);
 ctx.lineTo(120, 0);
 ctx.stroke();
}

同理,分钟的刻度也一样。

ctx.beginPath();
for (i = 0; i < 60; i++) {
 if (i % 5 !== 0) { //去掉与小时刻度重叠的部分
 ctx.beginPath();
 ctx.strokeStyle = '#536b7a';
 ctx.lineWidth = 2;
 ctx.moveTo(140, 0);
 ctx.lineTo(130, 0);
 ctx.stroke();
 }
 ctx.rotate(Math.PI / 30);
}

表盘大致画好了,刻度也画好了,接下来就是绘制指针并让它指向正确的时间,是不是?不就就是画一条直线么。关键是指针rotate的角度是多少呢?其实也是比较简单的。先获取当前的时间,把小时转换为12小时制的。

var now = new Date(),
 sec = now.getSeconds(),
 min = now.getMinutes(),
 hr = now.getHours();
hr = hr > 12 ? hr - 12 : hr;

那么,时针的位置就是(相对于x轴正方向转过的角度):

ctx.rotate(hr * (Math.PI / 6) + min * (Math.PI / 360) + sec * (Math.PI / 21600));

同理,分针和秒针的位置:

ctx.rotate(min * (Math.PI / 30) + sec * (Math.PI/1800));
 //分针ctx.rotate(sec * (Math.PI /30)); //秒针

最后,最关键的让指针转动起来,这里要用到的是requestAnimationFrame方法,用来重绘页面,得到连贯逐帧的动画,实现最佳的动画效果。

window.requestAnimationFrame(callback);

这个callback就是我们的绘制时钟的clock()函数。需要注意的是每次执行完requestAnimationFrame后需要清除画布,不然出现重叠交错的现象,我们把它放在clock函数开始的地方。

ctx.clearRect(0, 0, canvas.width, canvas.height);

到这里,动画时钟就OK了 效果图如下:

2422145834-58213fc77124c_articlex.png

演示地址http://codepen.io/lifeng1893/pen/ALPamR

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

canvas动画时钟

canvas动画时钟:最近在学canvas,然后根据MDN上的例子做了个动画时钟(为什么要造个轮子,因为丑。)这是MDN上的例子,怎么说呢,比较复古吧。首先,找一张时钟的图片,就是下面这张了。——来自bigger than bigger的dribbble网站,图片来源(侵删)然后就开始用canva
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top