第一次在博客园注册发博。有一次去人家单位开标,看到开标网站上有个钟表动画,一时兴起,就写了个简单的钟表动画。

用js和html5 canvas对象实现一个简单钟表程序

主要用到的就是h5的canvas对象

canvas对象本人也不是很熟,大致看了几个常用的方法,难免有不足之处,仅是练习所用。

实现思路:画表盘,画刻度,画表针就是这么个思路。

主要就涉及到以下几个方法

arc 创建弧/曲线(用于创建圆形或部分圆)

rotate 旋转

lineTo画线

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Js实现一个简单的钟表动画</title>
<style type="text/css">
canvas{ margin-left:500px;
margin-top:100px; } </style>
</head> <body>
<canvas id="canvas" width="600" height="600"></canvas>
<script language="javascript">
/*
作者:胖兔
时间:2017.8.9
描述:用js和html5 canvas对象实现一个简单钟表程序
*/ var Canvas = { //属性
Context:document.getElementById("canvas").getContext('2d'), //擦除
Clear:function(){ var cxt = Canvas.Context;
var width = cxt.canvas.width;
var height = cxt.canvas.height;;
this.Context.clearRect(0,0, width, height);
},
//radius钟表半径,sencondScaleWidth刻度长度,secondHandWidth秒针长度
CreateClock:function(radius,sencondScaleWidth,secondHandWidth){
var me = this;
var radius = radius;
var sencondScaleWidth = sencondScaleWidth;
var secondHandWidth = secondHandWidth;
//小时刻度
var hourScaleWidth = sencondScaleWidth*2;
//时针分针长度
var hourHandWidth = secondHandWidth*80/100;
//分针长度
var minuteHandWidth = secondHandWidth*90/100;
//确定圆心坐标
var point = {x:this.Context.canvas.width/2,y:this.Context.canvas.height/2};
var ctx = this.Context;//获取上下文
//绘制圆圈 function drawCircle(){ ctx.save();//记录画笔状态
//确定画笔的位置在圆心点
ctx.translate(point.x,point.y);
//ctx.fillStyle = "black";
ctx.strokeStyle="gray";
ctx.lineWidth = 2;
ctx.beginPath();//开始绘制路径
ctx.arc(0,0,radius,0,Math.PI*2);
ctx.closePath();//关闭路径
ctx.stroke();//绘制
ctx.restore();//复位 }
//绘制刻度
function drawScale(){
ctx.save();//记录画笔状态
var perHourRadian = Math.PI/6;
var perMinuteRadian = Math.PI/30;
//确定画笔的位置在圆心点
ctx.translate(point.x,point.y);
ctx.strokeStyle="gray"; //此处为了省事,只在表盘上简单的写了几个时间数字
ctx.font = "bold 30px impack"
var dc = radius-hourScaleWidth-30;
ctx.fillText("3", dc, 10);
ctx.fillText("6", -10,dc );
ctx.fillText("9", -dc, 10);
ctx.fillText("12", -15, -dc);
ctx.stroke(); for(var i=0;i<12;i++){
//坐标旋转
ctx.rotate(perHourRadian);
ctx.moveTo(radius-hourScaleWidth,0);
ctx.lineTo(radius,0);
} for(var i=0;i<60;i++){
//坐标旋转
ctx.rotate(perMinuteRadian);
ctx.moveTo(radius-sencondScaleWidth,0);
ctx.lineTo(radius,0);
} ctx.stroke();//绘制
ctx.restore(); //radian
}
//drawScale();
function drawHand(){ var myDate = new Date();
var curHour = myDate.getHours();
var curMinute = myDate.getMinutes();
var curSecond = myDate.getSeconds(); //绘制时针
curHour = curHour>12?curHour-12:curHour;
var hourRadian = (curHour+curMinute/60+curSecond/3600) * (Math.PI/6);
//绘制分针
var minuteRadian = (curMinute+curSecond/60) * (Math.PI/30);
//绘制秒针
var secondRadian = curSecond * (Math.PI/30); function run(radian,width,color){
ctx.save();
ctx.translate(point.x,point.y);
ctx.rotate(-Math.PI/2);
ctx.strokeStyle=color
ctx.beginPath();
ctx.rotate(radian);
ctx.moveTo(0,0);
ctx.lineTo(width,0);
ctx.closePath();
ctx.stroke();
ctx.restore();
}
run(hourRadian,hourHandWidth,"black");
run(minuteRadian,minuteHandWidth,"green");
run(secondRadian,secondHandWidth,"red"); }
//drawHand();
function drawAll(){
me.Clear();
drawCircle();
drawScale();
drawHand();
}
setInterval(drawAll,1000); } }; Canvas.CreateClock(290,20,200); </script>
</body>
</html>

最新文章

  1. UITextView 点return 隐藏键盘
  2. SQL Server中的分页
  3. [WPF]ListView点击列头排序功能实现
  4. python核心编程-习题-第二章
  5. IWorkSpace接口介绍
  6. JavaWeb从0开始学(一)-----搭建第一个Web应用程序与JSP工作原理
  7. avalon2对比avalon1 新增的功能汇总
  8. 运用El表达式截取字符串/获取list的长度
  9. istio入门(01)istio是什么?
  10. 16进制字符串转QByteArray,char转16进制字符串
  11. Java中的升序和降序
  12. Oracle根据主键获取对应表,Oracle根据外键获取相关表
  13. Mac 小记 — 杂录
  14. Inline Route Constraints in ASP.NET Core MVC
  15. Django多个中间件的执行顺序
  16. Java的各种打包方式
  17. Camera2点击对焦实现
  18. 背水一战 Windows 10 (41) - 控件(导航类): Frame
  19. jsonp 接口
  20. 移动端经常出现的兼容问题,谈谈移动端应用或者wap站的一些优化技巧和心得

热门文章

  1. Spring-Boot:6分钟掌握SpringBoot开发
  2. php调用webservice接口
  3. easyui动态生成列
  4. 【转】String字符串相加的问题
  5. http content-type accept的区别
  6. [js高手之路] javascript面向对象写法与应用
  7. Hibernate Mapping Exception:-9
  8. Python学习手册 :Python 学习笔记第一天
  9. 第九章 MySQL中LIMIT和NOT IN案例
  10. 组件 layui 常用控件下拉框的应用