canvas 入门之作:

三步实现一个时钟:

直接上效果:

 
  • step 1  : 背景制作
    首先制作从1-12的数字:

        var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    canvas.width = canvas.height = 400;
    ctx.translate(200,200);
    var R = 150;
    ctx.font = "14px Helvetica";
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    for(var i=1;i<13;i++){
    var radian = (i*30)*Math.PI / 180;
    ctx.fillText(i,R*Math.sin(radian),R*(-Math.cos(radian)))
    }

    关于 js 中Math.cos()和 Math.sin()的作用是这样的:

    Math.sin(x)      x 的正玄值。返回值在 -1.0 到 1.0 之间;
    
    Math.cos(x)    x 的余弦值。返回的是 -1.0 到 1.0 之间的数;
    
    这两个函数中的X 都是指的“弧度”而非“角度”,弧度的计算公式为: 2*PI/360*角度;
    
    30° 角度 的弧度 = 2*PI/360*30;

    效果图如下:
    十分简单的绘出了背景;

  • step 2 : 绘出当前时间的指针位置
    var getTime = function(){
    var myDate = new Date();
    return {
    H:myDate.getHours(), //获取当前小时数(0-23)
    M:myDate.getMinutes(), //获取当前分钟数(0-59)
    S:myDate.getSeconds(), //获取当前秒数(0-59)
    }
    } var sDeg = 6*Math.PI / 180;
    var dDeg = 30*Math.PI /180; var Animation = function(time){
    ctx.strokeStyle = "#e20437";
    ctx.moveTo(0,0);
    ctx.lineTo(140*Math.sin(sDeg*time.S),140*(-Math.cos(sDeg*time.S)))
    ctx.lineWidth = 2;
    ctx.lineCap = 'round';
    ctx.stroke();
    ctx.beginPath();
    ctx.lineWidth = 2;
    ctx.strokeStyle = "#000";
    ctx.moveTo(0,0);
    ctx.lineTo(100*Math.sin(sDeg*time.M),100*(-Math.cos(sDeg*time.M)));
    ctx.stroke();
    ctx.beginPath();
    ctx.lineWidth = 3;
    ctx.moveTo(0,0);
    ctx.lineTo(80*Math.sin(dDeg*time.H),80*(-Math.cos(dDeg*time.H)));
    ctx.stroke();
    }
    var time = getTime();
    Animation(time);

    因为秒针的颜色与时针,分针的不同,所以才用了 ctx.beginPath()多次;
    效果图:

  • step 3 :添加动画
    给 canvas添加动画:
        var Animation = function(time){
    ctx.clearRect(-200,-200,400,400);
    printBG();
    ctx.strokeStyle = "#e20437";
    ctx.moveTo(0,0);
    ctx.lineTo(140*Math.sin(sDeg*time.S),140*(-Math.cos(sDeg*time.S)))
    ctx.lineWidth = 2;
    ctx.lineCap = 'round';
    ctx.stroke();
    ctx.beginPath();
    ctx.lineWidth = 2;
    ctx.strokeStyle = "#000";
    ctx.moveTo(0,0);
    ctx.lineTo(100*Math.sin(sDeg*time.M),100*(-Math.cos(sDeg*time.M)));
    ctx.stroke();
    ctx.beginPath();
    ctx.lineWidth = 3;
    ctx.moveTo(0,0);
    ctx.lineTo(80*Math.sin(dDeg*time.H),80*(-Math.cos(dDeg*time.H)));
    ctx.stroke();
    };
    var time = getTime();
    Animation(time);
    setInterval(function(){
    time.S += 1;
    if(time.S>60){
    time = getTime();
    }
    Animation(time);
    },1000)

    为什么我会每60秒就获取一次时间呢?因为 setInterval 有一个众所周知的缺点,在时间计算方面随着时间的推移,会因为阻塞等等原因失去准确率,所以我这样做可以提高时间的准确,当然使用 webwork 应该也能解决问题;

    其实在实现的过程中,大家都发现了连背景也要重新绘制,效率真的非常差,这正是原生 API 的不足之处,这个可以使用一些框架来进行解决;
    另一种方法是,专门制作一个背景将两者重叠在一起;还有一个 api 是也可以解决这个问题的就是:ctx.clip(),这是可以在 canvas里扣下一部分画面,只在这里面绘图,不过碰到动画和背景相接触的就没有办法了,局限性比较大

    完整的代码我都放在了 GitHub 里:https://github.com/Grewer/JsDemo/tree/master/clock
    demo 地址:https://grewer.github.io/JsDemo/clock/step3.html

canvas入门之时钟的实现的更多相关文章

  1. Canvas入门(2):图形渐变和图像形变换

    来源:http://www.ido321.com/986.html 一.图形渐变(均在最新版Google中测试) 1.绘制线性渐变 1: // 获取canvas 的ID 2: var canvas = ...

  2. Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形

    来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...

  3. HTML5 canvas入门

    HTML5 Canvas入门 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形.在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字. ...

  4. 深夜,用canvas画一个时钟

    深夜,用canvas画一个时钟 查看demo 这几天准备阿里巴巴的笔试,可以说已经是心力交瘁,自从阿里和蘑菇街的内推被刷掉之后,开始越来越怀疑起自己的能力来,虽然这点打击应该是微不足道的.毕竟校招在刚 ...

  5. canvas自适应圆形时钟绘制

    前面的话 前面介绍过canvas粒子时钟的绘制,本文将详细介绍canvas自适应圆形时钟绘制 效果演示 最终自适应圆形时钟的效果如下所示 功能分析 下面来分析一下该圆形时钟的功能 [1]静态背景 对于 ...

  6. canvas 入门

    <canvas>是HTML5新增的,是可以使用脚本(JavaScript)在其中绘制图像的HTML元素. canvas是由HTML代码配合高度和宽度属性而定义出的可绘制区域,JavaScr ...

  7. Canvas 入门案例

    五.  Canvas 入门案例 1.  canvas 圆形绘制 <!DOCTYPE html> <html lang="en"> <head> ...

  8. Canvas入门笔记-实现极简画笔

    今天学习了Html5 Canvas入门,已经有大神写得很详细了http://www.cnblogs.com/tim-li/archive/2012/08/06/2580252.html#8 在学习过后 ...

  9. canvas做的时钟,学习下

    canvas标签只是图形容器,您必须使用脚本来绘制图形. getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.——获取上下文对象. getContext(" ...

随机推荐

  1. Memcached存储命令

    Memcached各个存储命令的语法格式都类似,且有相同的参数和参数含义,先将可能出现的各个参数的意义说明如下: key:    键值 key-value 结构中的 key,用于查找缓存值. flag ...

  2. ASP.NET没有魔法——ASP.NET Identity的加密与解密

    前面文章介绍了如何使用Identity在ASP.NET MVC中实现用户的注册.登录以及身份验证.这些功能都是与用户信息安全相关的功能,数据安全的重要性永远放在第一位.那么对于注册和登录功能来说要把密 ...

  3. Oracle 表空间扩充

    Oracle 表空间扩充 一.现场环境: (1)操作系统:AIX (2)数据库:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - ...

  4. c++の奇技淫巧

    >如何用cmd编译c++?-m32究竟是什么操作?这究竟是道德的沦丧还是人性的泯灭,请收看今日的c++奇技淫巧 咳咳,扯远了(正经脸)主要是今天学了c++的一些编译技巧以及cmd的一些操作,总结 ...

  5. poj 2566 Bound Found

    Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4384   Accepted: 1377   Spe ...

  6. jQuery基础应用

    什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多"的JavaScript库. jQuery库包含以下功能: HT ...

  7. java设计师初入职场,如何站稳脚跟

    本文内容一共由3部分展开 a:新人如何快速融入团队 b:如何在职场中提升自己影响力 c:如何规进行职业规划 a:如何快速融入团队   能在层层选拔下进入公司,说明你工作的能力还是得到公司的认可,不过这 ...

  8. 用cmd命令创建oracle 数据库、用户和表空间

    Win+R调查运行窗口,输入cmd回车 连接到本地oracle库 创建名为"SXSJ"的表空间,其初始大小为512M,支持自动扩展,每次增量为32M: create tablesp ...

  9. 全面理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  10. VS2015如何连接mySQL数据库

    mySQL数据库           如题,今天给大家简单演示一下VS2015如何连接mySQL数据库.       首先呢,大家需要安装vs2015和mySQL这两个软件,我还安装了一个辅助软件SQ ...