html5 canvas通过javascript绘制漂亮的时钟

小菜鸟新进博客园,发布一个时钟来纪念一下这个历史性的时刻!介于我比较喜欢那些循循善诱的教学方法,我也将遵循这种方式,一步一步讲述这个过程。让我们开始吧~

准备工作: 首先新建一个空的Web应用程序,并新建一个页面

进入正题了!

1. 创建一个< canvas>

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormClock.aspx.cs" Inherits="MyClock.WebFormClock" %>
 2  <!DOCTYPE html>
 3   <html xmlns="http://www.w3.org/1999/xhtml">
 4   <head runat="server">
 5     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 6      <title></title>
 7   </head>
 8  <body>
 9      <form id="form1" runat="server">
10      <div>
11          <canvas id="myCanvas" width="200" height="200"></canvas>
12      
13      </div>
14      </form>
15 </body>
16 </html>

 

上面指定了画布的尺寸,长宽各200~

 

2. 接下来我们将使用javascript来对上面的画布进行绘制

<body>
     <form id="form1" runat="server">
     <div>
         <canvas id="myCanvas" width="200" height="200"></canvas>
     <script type="text/javascript">
         var c = document.getElementById("myCanvas");
         var ctx = c.getContext("2d");
     </script>
     </div>
     </form>
</body>

我们现在获取了画布的对象,并建立了一个2d的绘画环境

 

那么一个时钟首先要有他的刻度表盘吧,所以我们现在来绘制它

3. 绘制表盘

ctx.beginPath();
        ctx.translate(100, 100);
        ctx.rotate(-Math.PI / 2);
        ctx.save();


        for (var i = 0; i < 60; i += 5) {
            ctx.fillRect(84, -3, 10, 6);
            ctx.rotate(Math.PI / 6);
        }
        ctx.closePath();

 

我们将画布的坐标系原点移至画布的中心,并将画布旋转-90度,然后保存这个状态!

然后使用循环语句绘制刻度盘(每画一个刻度,画板选装30度)

效果图如下:

 

4. 绘制指针

var slen = 60;
        var mlen = 48;
        var hlen = 35;

        var s = 0, m = 0, h = 0;

        function Refresh() {

            var time = new Date();
            s = time.getSeconds();
            m = time.getMinutes();
            h = time.getHours();

            
            //画时针
            ctx.fillStyle = '#555555';
            ctx.rotate((h + m / 60) * Math.PI / 6);
            ctx.fillRect(-8, -2, hlen, 4);
            ctx.restore();
            ctx.save();
            //画分针
            ctx.fillStyle = '#555555';
            ctx.rotate((m + s / 60) * Math.PI / 30);
            ctx.fillRect(-10, -1.5, mlen, 3);
            ctx.restore();
            ctx.save();
            //画秒针
            ctx.rotate(s * Math.PI / 30);
            ctx.fillStyle = 'Black';
            ctx.fillRect(-12, -1, slen, 2);
        }

        var MyInterval = setInterval("Refresh();", 1000);

开始的slen,mlen,hlen是我所定义的指针长度的常量

因为时钟需要每秒刷新状态,所以我们将整个情况放在一个方法内(Refresh),在最后让这个方法每秒执行一次

然后就有了这样的效果:

 

5. 擦除之前的笔画


html5的画布,那也是画布嘛,一个劲的往上画而不擦除以前的笔画,那肯定就会变成这样:

这真的太不科学了!所以我们对以前的内容进行清除

//以下为清除画板内容
            {
                ctx.globalCompositeOperation = "destination-out";
                ctx.strokeStyle = "rgba(250,250,250,0)";
                ctx.beginPath();
                ctx.arc(0, 0, 83, 0, 2 * Math.PI);
                ctx.closePath();
                ctx.fill();
                ctx.globalCompositeOperation = "source-over";
                ctx.restore();
                ctx.save();
            }

 

6. 让他变的更漂亮


仅仅上面这个样子,明显是不能满足我们对美的渴望的~那么我们现在来让秒针变得更加个性化

那么接下来,我将去除传统意义上的秒针,用扇形来表示现在的秒针

//用扇形来表示秒
            var radialgradient = ctx.createRadialGradient(0, 0, 10, 0, 0, 83);
            radialgradient.addColorStop(0.4, '#c4f2ff');
            radialgradient.addColorStop(1, "rgba(250,250,250,0)");
            ctx.fillStyle = radialgradient;
            ctx.beginPath();
            ctx.moveTo(0, 0);
            ctx.arc(0, 0, 82, 0, s * Math.PI / 30, false);
            ctx.closePath();
            ctx.fill();
            ctx.restore();
            ctx.save();

 

这样子的话,我们就用扇形扫过的区域来表示当前的秒数了,并且在上面使用了径向渐变3

效果如下:

 

7.很好很好,已经基本大功告成了~

但是我想让他变得更加好玩一些,那就让当前的分钟数,来决定扇形的颜色好了~

var colorarray = ['#c4f2ff', '#dadada', '#baffe7', '#ffd7ba', '#fffdba', '#deffba', '#baffc4', '#bac9ff', '#ffbaeb', '#ffbaba'];

//用扇形来表示秒
            var radialgradient = ctx.createRadialGradient(0, 0, 10, 0, 0, 83);
            radialgradient.addColorStop(0.4, colorarray[m % 10]);
            radialgradient.addColorStop(1, "rgba(250,250,250,0)");
            ctx.fillStyle = radialgradient;
            ctx.beginPath();
            ctx.moveTo(0, 0);
            ctx.arc(0, 0, 82, 0, s * Math.PI / 30, false);
            ctx.closePath();
            ctx.fill();
            ctx.restore();
            ctx.save();

我申明了一个有10种颜色的数组,然后根据现在分钟数除以10的余数来决定用哪一种~

 

8. 最后的完整代码

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormClock.aspx.cs" Inherits="MyClock.WebFormClock" %>
 2 
 3 <!DOCTYPE html>
 4 
 5 <html xmlns="http://www.w3.org/1999/xhtml">
 6 <head runat="server">
 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 8     <title></title>
 9 </head>
10 <body>
11     <form id="form1" runat="server">
12     <div>
13         <canvas id="myCanvas" width="200" height="200"></canvas>
14     <script type="text/javascript">
15         var colorarray = ['#c4f2ff', '#dadada', '#baffe7', '#ffd7ba', '#fffdba', '#deffba', '#baffc4', '#bac9ff', '#ffbaeb', '#ffbaba'];
16         var c = document.getElementById("myCanvas");
17         var ctx = c.getContext("2d");
18 
19         ctx.beginPath();
20         ctx.translate(100, 100);
21         ctx.rotate(-Math.PI / 2);
22         ctx.save();
23 
24 
25         for (var i = 0; i < 60; i += 5) {
26             ctx.fillRect(84, -3, 10, 6);
27             ctx.rotate(Math.PI / 6);
28         }
29         ctx.closePath();
30 
31         var slen = 60;
32         var mlen = 48;
33         var hlen = 35;
34 
35         var s = 0, m = 0, h = 0;
36 
37         function Refresh() {
38 
39             var time = new Date();
40             s = time.getSeconds();
41             m = time.getMinutes();
42             h = time.getHours();
43 
44             //以下为清除画板内容
45             {
46                 ctx.globalCompositeOperation = "destination-out";
47                 ctx.strokeStyle = "rgba(250,250,250,0)";
48                 ctx.beginPath();
49                 ctx.arc(0, 0, 83, 0, 2 * Math.PI);
50                 ctx.closePath();
51                 ctx.fill();
52                 ctx.globalCompositeOperation = "source-over";
53                 ctx.restore();
54                 ctx.save();
55             }
56 
57             //以下为绘画
58             //用扇形来表示秒
59             var radialgradient = ctx.createRadialGradient(0, 0, 10, 0, 0, 83);
60             radialgradient.addColorStop(0.4, colorarray[m % 10]);
61             radialgradient.addColorStop(1, "rgba(250,250,250,0)");
62             ctx.fillStyle = radialgradient;
63             ctx.beginPath();
64             ctx.moveTo(0, 0);
65             ctx.arc(0, 0, 82, 0, s * Math.PI / 30, false);
66             ctx.closePath();
67             ctx.fill();
68             ctx.restore();
69             ctx.save();
70             //画时针
71             ctx.fillStyle = '#555555';
72             ctx.rotate((h + m / 60) * Math.PI / 6);
73             ctx.fillRect(-8, -2, hlen, 4);
74             ctx.restore();
75             ctx.save();
76             //画分针
77             ctx.fillStyle = '#555555';
78             ctx.rotate((m + s / 60) * Math.PI / 30);
79             ctx.fillRect(-10, -1.5, mlen, 3);
80             ctx.restore();
81             ctx.save();
82             ////画秒针
83             //ctx.rotate(s * Math.PI / 30);
84             //ctx.fillStyle = 'Black';
85             //ctx.fillRect(-12, -1, slen, 2);
86         }
87 
88         var MyInterval = setInterval("Refresh();", 1000);
89         </script>
90     </div>
91     </form>
92 </body>
93 </html>

 

OK~

转载于:https://www.cnblogs.com/ButterBall/archive/2012/12/04/2801754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值