通过Canvas + JS 实现简易时钟实战

最近通过各种渠道学习了下html5中的canvas元素,为了练练手就随手写了一个简易的时钟。时钟本身不复杂,没有使用图片进行美化,下面就与大家分享一下具体的代码:



这是最终实现的效果:

部分的启发点来自于 http://developer.51cto.com/art/201503/467645.htm

html代码:

<!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Clock</title>
        <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        .canvas{
            margin-left: 20px;
            margin-top: 20px;
           
            
        }
        </style>
    </head>
    <body >
     <canvas class = "canvas" id="canvasId" width = ‘400‘ height = ‘400‘></canvas>

  </body>

js代码:

var Clockbox = function(obj,width,height){
            this.o = {
                ‘dates‘:[],                        //时间
                ‘obj‘:obj,                            //canvas对象
                ‘width‘:width,                        //canvas宽度
                ‘height‘:height,                    //canvas高度
                ‘obj2d‘:obj.getContext(‘2d‘),        //2d对象
                ‘wcolor‘:‘#000000‘,                    //线条颜色
                ‘scalewidth‘:30,                     //刻度长度
                ‘msradius‘:(1/30)*Math.PI,            //分秒的弧度
                ‘hsradius‘:(1/6)*Math.PI,            //时的弧度
                 ‘hourHandLength‘ : (width/5),         /*时针长度*/
                ‘minHandLength‘:(width/6*1.8),         /*分针长度*/
                ‘secHandLength‘:(width/20*8),         /*秒针长度*/
                ‘fontsize‘:30                       //数字大小
            }
            var _this = this;
            this.infn();
            setInterval(function(){
              _this.o.obj2d.translate(-_this.o.width/2,-_this.o.height/2);
                _this.o.obj2d.clearRect(0,0,_this.o.width,_this.o.height);
                _this.infn();
            },1000)
        }
        Clockbox.prototype = {
            infn:function(){
                //表盘
                var obj2d = this.o.obj2d;
               
                var dates = new Date();
                this.o.dates = [dates.getHours(),dates.getMinutes(),dates.getSeconds()];
            
                //绘制
                obj2d.beginPath();
                obj2d.arc(this.o.width/2,this.o.height/2,this.o.width/2,0,2*Math.PI,false);
                obj2d.strokeStyle = this.o.wcolor;
                obj2d.stroke();
                
                //刻度
                this.scalefn(obj2d);
                //时针
                this.hour(obj2d);
                //分针
                this.minute(obj2d);
                //秒针
                this.sec(obj2d);
            },
            //绘制刻度和指针
            scalefn:function(obj2d){
                obj2d.translate(this.o.width/2,this.o.height/2);
                for(var i = 0;i<12;i++){
                    obj2d.moveTo(this.o.width/2-this.o.scalewidth, 0);
                       obj2d.lineTo(this.o.width/2, 0);  
                    obj2d.rotate(this.o.hsradius);
                }
                obj2d.font = "bold "+this.o.fontsize+"px impack";
                obj2d.textAlign = "center";
                obj2d.fillStyle = "#ff9000";
                obj2d.fillText("12",0,-((this.o.width/2)-(this.o.scalewidth*2+10)));
                obj2d.fillText("3",((this.o.width/2)-(this.o.scalewidth*2)),this.o.fontsize/3);
                obj2d.fillText("6",0,((this.o.width/2)-(this.o.scalewidth*2)));
                obj2d.fillText("9",-((this.o.width/2)-(this.o.scalewidth*2)),this.o.fontsize/3);
                obj2d.stroke();
                obj2d.restore();
            },
            //时针
            hour:function(obj2d){
                  obj2d.save();
                  obj2d.rotate(this.o.hsradius*Number(this.o.dates[0]));
                
                obj2d.moveTo(0,0);
                obj2d.lineTo(0,-this.o.hourHandLength);
                
                obj2d.stroke();
                obj2d.restore();
            },
            //分针
            minute:function(obj2d){
                obj2d.save();
                obj2d.rotate(this.o.msradius*Number(this.o.dates[1]));
                 obj2d.beginPath();
                obj2d.moveTo(0,0);
                obj2d.lineTo(0,-this.o.minHandLength);
                
                obj2d.stroke();
                obj2d.restore();
            },
            //秒针
            sec:function(obj2d){
                obj2d.save();
                obj2d.rotate(this.o.msradius*Number(this.o.dates[2]));
                obj2d.beginPath();
                obj2d.moveTo(0,0);
                obj2d.lineTo(0,-this.o.secHandLength);
                
                obj2d.stroke();
                obj2d.restore();
            }
        }
       function main(){

     var can = document.getElementById(‘canvasId‘);
            var Clock =    new Clockbox(can,400,400);
        
      }

js代码详解:

      1.首先这里使用了面向对象的形式

      2.这里为了方便更改大小,传入了3个参数 obj,width,height,分别表示canvas元素  以及它的宽度和高度,表盘的半径是宽的二分之一

      3. 因为1小时有60分钟  所以每一个分钟单元格应该有的弧度就是(1/(60/2))*Math.PI,小时同理

      4.   依据现在的时间 用 .rotate()方法对指针做角度控制 12点的时针的弧度就是 一个小时的弧度*12

      5.最后每秒不断的清除画布  重构 就形成了一个动态的时钟

遇到的问题:

   translate()  在画完之后 canvas的原点并不在左上角了   ..... 最后在定时器重新设定解决了这个问题

时间: 2024-10-12 20:51:53

通过Canvas + JS 实现简易时钟实战的相关文章

用canvas绘制一个简易时钟

在见识了html5中canvas的强大,笔者准备制作一个简易时钟. 下面就是成果啦,制作之前我们先分析一下,绘制一个时钟需要做哪些准备. 一 . 1.首先这个时钟分为表盘,指针(时针,分针,秒针)和数字三部分. 2.表盘是个圆,这个简单. 3.绘制指针时,需要先获取到系统时间,然后找到时间和角度的关系. 4.然后利用画圆函数,把起始和终点设为同一角度,即可画出射线(指针).  二. 接下来,我们再分析一下,绘制时钟需要用到的函数. 1.arc(x, y, r, start, stop) x, y

Canvas + JS 实现简易的时钟

之前学习了下html5中的canvas元素,为了练练手就实现了一个简易的时钟.时钟本身并不复杂,也没有使用图片进行美化,不过麻雀虽小五脏俱全,下面就与大家分享一下: 实现效果: html代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>C

WEB前端开发学习----9. 使用canvas来画个时钟

canvas元素在html5中的重要性非同一般.配合JS让我们实现了在浏览器页面中作画的强大功能.不再单单依靠图片,flash等外部文件,减少http请求,从而网页加载速度更加快捷. 简单的线段: 看个小演示  canvas小房子 不用函数累死人.... 旋转: 使用提供的rotate()方法.需要注意的是,在旋转前,应该重新定位原点.一般来说将要旋转的图像的端点重定向为原点,以此为基础来旋转.也就是说先定位,再设置旋转角度,最后画图.看个演示  canvas 扇子.这样要比一道一道的画线方便许

canvas简单实现动态时钟

使用到的知识: 1.     获取系统时间 2.     画图形,空心图形,实心图形,以及一些属性 3.     for循环 准备工作:添加一块画布1000*1000(随意),引用canvas.js <!doctype html> <html>  <head>   <meta charset="UTF-8">   <meta name="Generator" content="EditPlus?&quo

Android 开发第七弹:简易时钟(秒表)

本文承接,Android 开发第五弹:简易时钟(闹钟) 和 Android 开发第六弹:简易时钟(计时器),这一部分是关于秒表的. 布局 同样是新建一个类(StopWatchView)并扩展自LinearLayout,并将其用作布局. <myapplication.nomasp.com.clock.StopWatchView android : id = "@+id/tabStopWatch" android : layout_width = "match_parent

Android 开发第六弹:简易时钟(计时器)

接上篇Android 开发第五弹:简易时钟(闹钟) ,这次是一个时钟类应用,目前依旧是主要的功能,长得还是很挫.当然了,核心功能是有的-- 时钟 先把简单的时钟给列出来吧,这里都写的很简单,即便要用世界各个城市的话,也只是相应的加上或减去几个小时. 新建TimeView类,并扩展自LinearLayout,然后布局文件和上一篇中那么写就好了. <myapplication.nomasp.com.clock.TimeView android : id = "@+id/tabTime"

Node.js C++ addon编写实战(一)之node-gyp

http://deadhorse.me/nodejs/2012/10/08/c_addon_in_nodejs_node_gyp.html 这是一个三篇的系列文章,记录Node.js C++扩展开发中的一些经验与坑.Node.js C++ addon编写实战(一)之node-gypNode.js C++ addon编写实战(二)之对象转换Node.js C++ addon编写实战(三)之Buffer 补上第四篇:Node.js C++ addon编写实战(四)之兼容v0.11+与nan模块 从n

html5 canvas+js实现ps钢笔抠图

html5 canvas+js实现ps钢笔抠图 1. 项目要求需要用js实现photoshop中钢笔抠图功能,就用了近三四天的时间去解决它,最终还是基本上把他实现了. 做的过程中走了不少弯路,最终一同事找到了canvans以比较核心的属性globalCompositeOperation = "destination-out", 属性可以实现通过由多个点构成的闭合区间设置成透明色穿透画布背景色或是背景图片,这样省了许多事. 2.实现效果: 鼠标点完之后会将所有的点连成闭合区间,并可自由拖

使用node.js制作简易爬虫

最近看了些node.js方面的知识,就像拿它来做些什么.因为自己喜欢摄影,经常上蜂鸟网,所以寻思了一下,干脆做个简单的爬虫来扒论坛的帖子. 直接上代码吧. 1 var sys = require("sys"), 2 http = require("http"), 3 fs = require("fs"); 4 var url = "http://newbbs.fengniao.com/forum/forum_125.html"