使用Canvas绘制简单的时钟控件

Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表、动画等。

没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和Flash进行交互。有了Canvas,我们就再也不需要Flash了,直接使用JavaScript完成绘制。

基本使用

在html源码中只要像普通标签那样使用即可,比如下面的示例,但是在一些老旧的浏览器在中是不支持canvas的,因此我们常在canvas标签中提示用户,具体代码如下所示。

    <canvas id="myCanvas" width="300px" height="300px">
        您的浏览器不支持canvas,请尝试更新浏览器
    </canvas>

或者使用JS脚本来进行检测,使用JavaScript代码检测是否支持canvas的代码示例如下:

    var myCanvas = document.getElementById(‘myCanvas‘);
    if (myCanvas.getContext) {
        myCanvas.log(‘你的浏览器支持Canvas!‘);
    } else {
        myCanvas.log(‘你的浏览器不支持Canvas!‘);
    }

开始绘制

由于绘制canvas通常代码需要比较多,我们常常使用引用js的方式来绘制canvas,这里我们也是引入js文件来操作canvas,HTML源码如下所示

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>学习Canvas绘制始终效果</title>
        <style>
            canvas{
                border: 1px solid #cccccc;
            }
        </style>
    </head>
    <body>
    <canvas id="myCanvas" width="300px" height="300px">
        您的浏览器不支持Canvas,请尝试更新浏览器
    </canvas>
    <script src="js/canvas.js"></script>
    </body>
    </html>

创建js文件

根据实际的需要创建js文件,这里我引入的地址是js/canvas.js,因此需要和HTML源码文件同级下创建js文件夹,然后再js文件夹中创建canvas.js文件。

绘制测试示例

绘制效果如下

<div style="align: center">
<img src = "http://www.zhoutao123.com:9000/upload/2017/12/4s4ptf692qhjtq6f1pdddj1l9b.png" width="200">
</div>

动态效果

预备代码

这里保持一些全局变量,方便后面使用的

    //获取canvas的上下文环境
    var myCanvas = document.getElementById(‘myCanvas‘)
    var ctx = myCanvas.getContext(‘2d‘)
    //获取canvas的宽度和高度
    var canvasWidth = myCanvas.width
    var canvasHeight = myCanvas.height

绘制背景

我们首先绘制背景,分析背景可以看到,他是由一个大的黑色与圆圈包裹,里面有一个灰色的略小的圆圈,在灰色圆圈的周围均匀分布着时钟点,这些时钟点每逢5的倍数的时候突出显示,否则就是灰色显示,这就是我们的需求,具体注释在代码中可以详细看到。

    //开始绘制背景
    function drawBackground() {
        //未防止当前画布环境被破坏,因此我们保存当前的绘制环境
        ctx.save()
        //开始绘制路径
        ctx.beginPath()
        //配置绘制颜色,我们首先绘制的是黑色圆圈,因此我们配置为黑色
        ctx.strokeStyle = ‘#000000‘
        //绘制宽度为6个像素
        ctx.lineWidth = 6
        //开始绘制圆,圆心未知是宽和高的一半,半径是宽度的一半减去圆圈的宽度
        //这里最后的两个参数需要注意
        //指的是绘制圆圈的起点和绘制的弧度
        //我们从0点开始绘制然后绘制2*PI个弧度,也就是一个正圆
        //这里的点是从x轴正方向开始的
        ctx.arc(canvasWidth/2,canvasHeight/2,canvasHeight/2-3,0,2*Math.PI)
        //配置完成,开始绘制
        ctx.stroke()

        //同样的需求开始绘制灰色的圆圈
        ctx.beginPath()
        ctx.strokeStyle = ‘#CCCCCC‘
        ctx.lineWidth = 1
        ctx.arc(canvasWidth/2,canvasHeight/2,(canvasWidth/2-15),0,2*Math.PI)
        ctx.stroke()

        //将原点从左上角0,0移动到中心位置
        ctx.translate(canvasWidth/2,canvasHeight/2)

        //需要现实的数字
        //这是可以看到,数字是从3开始的,也验证了我们的之前说的绘制从x轴正方向开始
        //在时钟界面x轴正方向就是3点钟
        var colorNumber = [3,4,5,6,7,8,9,10,11,12,1,2]
        //配置字体和对齐方向
        ctx.font="25px Arial";
        ctx.textAlign = "center"
        ctx.textBaseline = "middle"
        //循环遍历,开始绘制数字
        for(var i = 0;i<colorNumber.length;i++){
            var dep = 2 * Math.PI /12 * i;
            ctx.fillText(colorNumber[i],(canvasWidth/2-30) * Math.cos(dep),(canvasHeight/2-30)* Math.sin(dep))
        }

        //绘制时钟点
        for(var i = 0;i<60;i++){
            var  rad =  2 * Math.PI /60 * i;
            var x = Math.cos(rad) * (canvasHeight/2-16)
            var y = Math.sin(rad) * (canvasHeight/2-16)
            ctx.beginPath();
            //如果是5的倍数,使用黑色填充,否则使用灰色填充
            if (i % 5 === 0){
                ctx.fillStyle = "#000"
                ctx.arc(x,y,2,0,2*Math.PI,false)
            }else{
                ctx.fillStyle = "#CCC"
                ctx.arc(x,y,2,0,2*Math.PI,false)
            }
            ctx.fill()
        }
    }

绘制时针

绘制时针、分针以及秒针的理念是先绘制0时刻的样子,然后旋转画布一定的弧度,从而达到转动的效果。

    //绘制时针
    function drawHours(hours,minte) {
        //保存环境
        ctx.save()
        //计算时钟角度和偏离的角度
        var rad = 2 * Math.PI / 12 * hours;
        var rad2 = 2 * Math.PI / 12 /60 * minte;
        //旋转画布
        ctx.rotate(rad+rad2)
        ctx.beginPath();
        //配置绘制效果
        ctx.lineWidth = 6
        ctx.strokeStyle = "#000"
        //线的两端保持圆角
        ctx.lineCap = "round"
        //将绘制点移动到中心原点以下10个像素点
        ctx.moveTo(0,10);
        //绘制一个线
        ctx.lineTo(0,-(canvasWidth-150)/2)
        ctx.stroke()
        //恢复之前保存的环境
        ctx.restore()
    }

绘制分针和秒针

绘制分针和秒针的方法和时针一样,仅仅是绘制的颜色和宽度不一样,这里不再详细赘述.

    //绘制分针
    function drawMinute(minute) {
        ctx.save()
        var rad = 2 * Math.PI / 60 * minute;
        ctx.rotate(rad)
        ctx.beginPath();
        ctx.lineWidth = 3
        ctx.strokeStyle = "#000"
        ctx.lineCap = "round"
        ctx.moveTo(0,10);
        ctx.lineTo(0,-(canvasWidth-100)/2)
        ctx.stroke()
        ctx.restore()
    }
    //绘制秒针
    function drawSecond(second) {
        ctx.save()
        var rad = 2 * Math.PI / 60 * second;
        ctx.rotate(rad)
        ctx.beginPath();
        ctx.lineWidth = 3
        ctx.strokeStyle = "#f00"
        ctx.lineCap = "round"
        ctx.moveTo(0,20);
        ctx.lineTo(0,-(canvasWidth-40)/2)
        ctx.stroke()
        ctx.restore()
    }

绘制中心白点

时针、分针和秒针的中心集合点出有白点,类似某个机械元件,将三个针锁住,我们只要绘制原点即可。

    //绘制原点
    function drawPoint() {
        ctx.beginPath()
        ctx.fillStyle ="#FFF"
        ctx.arc(0,0,3,0,2*Math.PI)
        ctx.fill()
    }

开始时钟

我们将当前时间绘制到始终上面即可,需要注意的是,在绘制之前需要将之前绘制的东西清除掉。

    //开始启动时针
    function startColor() {
        //清除画布内容
        ctx.clearRect(0,0,canvasWidth,canvasHeight)
        var date = new Date()
        var hour = date.getHours()
        var minute = date.getMinutes()
        var second = date.getSeconds()
        drawBackground()
        drawHours(hour,minute)
        drawMinute(minute)
        drawSecond(second)
        drawPoint()
        ctx.restore()
    }

设置定时重新绘制

要想动态的让时钟跑起来,我们需要设置一个定时执行器,每秒更新一次,这样始终就完全动起来了

    setInterval(startColor,1000)

总结

这个时钟的宽度和高度已经写死了,在动态调节的过程中,会出现错位等问题,下一篇将修正这个问题,敬请期待。

原文地址:https://www.cnblogs.com/zhoutao825638/p/10381985.html

时间: 2024-11-08 06:54:51

使用Canvas绘制简单的时钟控件的相关文章

C# 时钟控件

//控件名:myNewClock //作者:刘典武 //时间:2011-06-10 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace O

学习笔记:HTML5 Canvas绘制简单图形

HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" width="1024" style="border:1px solid #aaa;text-align:center;"> 你的浏览器不支持Canvas,请更新浏览器再试!!! </canvas> 在canvas标签之间应该做浏览器是否支持的检测,

自定义时钟控件

1.自定义控件时钟的布局和Java类 values文件下的attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyClock"> <attr name="circleColor01" format="color"/> <attr nam

使用Canvas绘制图形的基本教程

原文地址:http://www.cnblogs.com/picaso/archive/2012/11/26/2789077.html HTML5火的正热,最近有个想法也是要用到HTML的相关功能,所以也要好好学习一把. 好好看了一下Canvas的功能,感觉HTML5在客户端交互的功能性越来越强了,今天看了一下Canvas绘图,下边是几个实例,记下以备后用. 1.使用Canvas绘制直线: <!doctype html> <html> <head> <meta ch

使用html5 canvas绘制圆形或弧线

注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链接以了解使用html5 canvas绘制图形的完整内容. 在html5中,CanvasRenderingContext2D对象也提供了专门用于绘制圆形或弧线的方法,请参考以下属性和方法介绍: arc(x, y, radius, startRad, endRad, anticlockwise) 在canvas画

HTML5之Canvas绘图——使用Canvas绘制图形的基本教程

原文转自:http://www.cnblogs.com/picaso/archive/2012/11/26/2789077.html HTML5火的正热,最近有个想法也是要用到HTML的相关功能,所以也要好好学习一把. 好好看了一下Canvas的功能,感觉HTML5在客户端交互的功能性越来越强了,今天看了一下Canvas绘图,下边是几个实例,记下以备后用. 1.使用Canvas绘制直线: 1 <!doctype html> 2 <html> 3 <head> 4 <

canvas制作简单钟表

之前用html+css+JavaScript实现了一个简单钟表,但还是有一些问题,主要是一些css属性不同浏览器支持效果不一样,所以尝试用 canvas实现了一个简单的钟表,效果在下方,当然了,采用canvas同样会有一些浏览器不支持... 这里只讨论canvas的实现方式.^_^ html部分 html部分很简单,写入canvas标签,其id设置为“canvas”,用css设置成居中显示,代码如下: 1 <!doctype html> 2 <html> 3 <head>

用canvas绘制一个简易时钟

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

WPF使用Canvas绘制可变矩形

1.问题以及解决办法 最近因为项目需要,需要实现一个位置校对的功能,大致的需求如下:有一个图片,有一些位置信息,但是位置信息可能和实际有些偏差,需要做简单调整,后面会对这张图片进行切割等,做些处理.(位置信息连接起来是一个个小矩形.) 解决以上问题的大致思路如下:使用canvas进行绘制,把图片作为canvas的背景,在canvas上绘制矩形,类似于qq截图一样,矩形框可以使用鼠标拖动调整大小.然后在记下修改后的位置,提供给后面切割图片使用.目前的关键问题就是实现类似qq截图那样可以拖动的矩形.