zoukankan      html  css  js  c++  java
  • 使用canvas绘制动态时钟

    本文参考:https://www.imooc.com/learn/612
    先放一个运行动图给大家看看
    在这里插入图片描述
    此前未曾学过canvas,因觉着有趣便跟着课程学了一下,也对canvas有了更加深入的理解。

    绘制时钟的几个步骤:
    1、画表盘那个圆
    2、画时钟边上那种小点
    3、画1-2-3-4…-12这几个数字(本例子是从3-4-5-…-12-1-2)
    4、画静态的指针
    5、让指针动起来
    6、在指针动起来后清除指针原来的图像
    7、对时钟放大放小情况进行优化

    代码如下:
    HTML

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title></title>
    	<link rel="stylesheet" type="text/css" href="./css/style.css">
    </head>
    <body>
    	<div>
    		<canvas id="clock" height="200px" width="200px"></canvas>
    	</div>
    
    
    <script type="text/javascript" src="./js/index.js"></script>
    </body>
    </html>
    

    CSS

    div{
    	text-align: center;
    	margin-top: 250px;
    }
    #clock{
    	border: 0px solid #ccc;
    }
    

    JS

    var dom = document.getElementById('clock');
    var ctx = dom.getContext('2d');
    var width = ctx.canvas.width;
    var height = ctx.canvas.height;
    var r = width/2;
    var rem = width / 200;
    
    /*
    	返回一个渐变色的gradient,用来绘制渐变色边框
    	http://www.w3school.com.cn/tags/canvas_strokestyle.asp
    */
    function getColorfulGradient() {
    	var gradient = ctx.createLinearGradient(-r,r,r,-r);
    	gradient.addColorStop("0","#2af598");
    	gradient.addColorStop("1","#009efd");
    	return gradient;
    }
    
    function drawBackground() {
    	ctx.save();
    	ctx.translate(r,r);
    	ctx.beginPath();
    	ctx.strokeStyle=getColorfulGradient();
    	ctx.lineWidth = 10 * rem;
    	ctx.arc(0,0,r-ctx.lineWidth/2,0,2*Math.PI,false);
    	ctx.stroke();
    
    	var hourNumbers = [3,4,5,6,7,8,9,10,11,12,1,2];
    	ctx.font = 18 * rem + 'px Arial';
    	ctx.textAlign = 'center';
    	ctx.textBaseline = 'middle';
    	hourNumbers.forEach(function(number, i) {
    		var rad = 2 * Math.PI / 12 * i;
    		var x = Math.cos(rad) * (r-30*rem);
    		var y = Math.sin(rad) * (r-30*rem);
    		ctx.fillText(number,x,y);
    	});
    
    
    	for (var i = 0; i < 60; i++){
    		var rad = 2 * Math.PI / 60 * i;
    		var x = Math.cos(rad) * (r-18*rem);
    		var y = Math.sin(rad) * (r-18*rem);
    		ctx.beginPath();
    		if (i % 5 == 0){
    			ctx.fillStyle = '#A770EF';
    			ctx.arc(x,y,2*rem,0,2*Math.PI,false);
    		}else{
    			ctx.fillStyle = '#FDB99B';
    			ctx.arc(x,y,2*rem,0,2*Math.PI,false);
    		}
    		ctx.fill();
    	}
    }
    
    function drawHour(hour,minute){
    	ctx.save();
    	ctx.beginPath();
    	var rad = 2 * Math.PI / 12 * hour;
    	var mrad = 2 * Math.PI /12 /60 * minute;
    	ctx.rotate(rad + mrad);
    	ctx.lineWidth = 4*rem;
    	ctx.lineCap = "round";
    	ctx.moveTo(0,10*rem);
    	ctx.lineTo(0,-r/2+5*rem);
    	ctx.stroke();
    	ctx.restore();
    }
    
    function drawMinute(minute) {
    	ctx.save();
    	ctx.beginPath();
    	var rad = 2 * Math.PI / 60 * minute;
    	ctx.rotate(rad);
    	ctx.lineWidth = 3*rem;
    	ctx.lineCap='round';
    	ctx.moveTo(0,10*rem);
    	ctx.lineTo(0,-r/2-2*rem);
    	ctx.stroke();
    	ctx.restore();
    }
    
    function drawSecond(second) {
    	ctx.save();
    	ctx.beginPath();
    	var rad = 2 * Math.PI / 60 * second;
    	ctx.rotate(rad);
    	ctx.moveTo(-2,20*rem);
    	ctx.lineTo(2,20*rem);
    	ctx.lineTo(1,-r/2-18*rem);
    	ctx.lineTo(-1,-r/2-18*rem);
    	var gradient = ctx.createLinearGradient(0,20,0,-r/2-18);
    	gradient.addColorStop("0","#f78ca0");
    	gradient.addColorStop("0.19","#f9748f");
    	gradient.addColorStop("0.6","#fd868c");
    	gradient.addColorStop("1","#fe9a8b");
    	ctx.fillStyle = gradient;
    	ctx.fill();
    	ctx.restore();
    }
    
    function drawDot(){
    	ctx.beginPath();
    	ctx.fillStyle = '#fff';
    	ctx.arc(0,0,3*rem,0,2*Math.PI, false);
    	ctx.fill();
    }
    
    
    function draw() {
    	ctx.clearRect(0,0,width,height);
    	drawBackground();
    	drawDot();
    	var now = new Date();
    	var hour = now.getHours();
    	var minute = now.getMinutes();
    	var second = now.getSeconds();
    	drawHour(hour, minute);
    	drawMinute(minute);
    	drawSecond(second);	
    	drawDot();
    	ctx.restore();
    }
    
    draw();
    setInterval(draw,1000);
    
  • 相关阅读:
    framework 3 ,4
    C# 线程
    ReportingService错误:配置参数 SharePointIntegrated 被设置为 True,但无法加载 Share Point 对象模型
    C# 打印 word pdf PrintOut方法
    C# 多线程控制控件实例(例程简单,注释详细)
    Windchill MethodServer启动后自动关闭
    Press C#使用指定打印机打印Word,Excel等Office文件和打印PDF文件的代码 (转)
    ExtJs入门
    The transaction log for database 'wcadmin' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.datab
    JS+调用word打印功能实现在Webfrom客户端
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287490.html
Copyright © 2011-2022 走看看