[Canvas]计时表/秒表
欲观看效果请点击下载,然后用浏览器打开index.html查看。
本作 Github地址:https://github.com/horn19782016/StopWatch
图例:
代码:
<!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <head> <title>秒表 19.3.5 8:28 by:逆火狂飙 horn19782016@163.com</title> <style> #canvas{ background:#ffffff; cursor:pointer; margin-left:10px; margin-top:10px; -webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.5); -moz-box-shadow:3px 3px 6px rgba(0,0,0,0.5); box-shadow:3px 3px 6px rgba(0,0,0,0.5); } #controls{ margin-top:10px; margin-left:15px; } </style> </head> <body onload="init()"> <div id="controls"> <input id='animateBtn' type='button' value='开始'/> <input id='elapsedTxt' type='text' value='' readonly/> </div> <canvas id="canvas" width="400px" height="400px" > 出现文字表示你的浏览器不支持HTML5 </canvas> </body> </html> <script type="text/javascript"> <!-- var paused=true; animateBtn.onclick=function(e){ paused=! paused; if(paused){ animateBtn.value="开始"; writeElapsed(); stopWatch.stop(); }else{ animateBtn.value="停止"; elapsedTxt.value='0'; stopWatch.start(); window.requestAnimationFrame(animate); } //alert("isRunning()="+stopWatch.isRunning()); //alert("getElapsedTime()="+stopWatch.getElapsedTime()); //alert("getPointerAngle()="+stopWatch.getPointerAngle()); } var stopWatch;// 秒表对象 var ctx;// 绘图环境 var r;// 表盘半径 function init(){ // init Canvas var canvas=document.getElementById('canvas'); r=200; canvas.width =2*r; canvas.height=2*r; ctx=canvas.getContext('2d'); stopWatch=new Stopwatch(); stopWatch.reset(); index=0; }; function writeElapsed(){ var date3=stopWatch.getElapsedTime(); //计算出相差天数 var days=Math.floor(date3/(24*3600*1000)) //计算出小时数 var leave1=date3%(24*3600*1000) //计算天数后剩余的毫秒数 var hours=Math.floor(leave1/(3600*1000)) //计算相差分钟数 var leave2=leave1%(3600*1000) //计算小时数后剩余的毫秒数 var minutes=Math.floor(leave2/(60*1000)) //计算相差秒数 var leave3=leave2%(60*1000) //计算分钟数后剩余的毫秒数 var seconds=Math.round(leave3/1000) var str="共用时"; if(days>0){ str=str+days+"天"; } if(hours>0){ str=str+hours+"小时"; } if(minutes>0){ str=str+minutes+"分钟"; } if(seconds>0){ str=str+seconds+"秒"; } str=str+(date3 % 1000)+"毫秒"; elapsedTxt.value=str; } function writeUsed(){ var date3=stopWatch.getElapsedTime(); //计算出相差天数 var days=Math.floor(date3/(24*3600*1000)) //计算出小时数 var leave1=date3%(24*3600*1000) //计算天数后剩余的毫秒数 var hours=Math.floor(leave1/(3600*1000)) //计算相差分钟数 var leave2=leave1%(3600*1000) //计算小时数后剩余的毫秒数 var minutes=Math.floor(leave2/(60*1000)) //计算相差秒数 var leave3=leave2%(60*1000) //计算分钟数后剩余的毫秒数 var seconds=Math.round(leave3/1000) var str="已用时"; if(days>0){ str=str+days+"天"; } if(hours>0){ str=str+hours+"小时"; } if(minutes>0){ str=str+minutes+"分钟"; } if(seconds>0){ str=str+seconds+"秒"; } //str=str+(date3 % 1000)+"毫秒"; elapsedTxt.value=str; } function draw(){ // Clear Canvas ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height); ctx.fillStyle="#ECF5FF"; ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height); // Paint Scales var width = ctx.canvas.width; var height = ctx.canvas.height; var BL = width / 200; ctx.save(); ctx.translate(r,r);// 平移到几何中心 // 画外面的蓝边 ctx.beginPath(); ctx.lineWidth = 5 * BL;//线要 乘上 比例 ctx.strokeStyle = "#2894FF"; ctx.arc(0, 0, r - 18 * BL, 2 * Math.PI, false);//乘上比例 ctx.stroke(); ctx.closePath(); ctx.beginPath(); ctx.lineWidth = 1 * BL;//线要 乘上 比例 ctx.strokeStyle = "#2894FF"; ctx.arc(0, 0, 2 * BL, 2 * Math.PI, false);//乘上比例 ctx.stroke(); ctx.closePath(); // 画表盘数字 ctx.fillStyle="#2894FF"; var hourNumber = [15, 20, 25, 30, 35, 40, 45,50, 55, 0, 5,10,]; ctx.font = 10 * BL + 'px Arial';//字体也有乘比例 字符串拼接 ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; hourNumber.forEach(function (number, i) { var rad = 2 * Math.PI / 12 * i; var x = Math.cos(rad) * (r - 8 * BL); var y = Math.sin(rad) * (r - 8 * BL); ctx.fillText(number, x, y); }); // 画刻度 for (var i = 0; i < 60; i+=0.5) { var rad = 2 * Math.PI / 60 * i; var x1 = Math.cos(rad) * (r - 20 * BL); var y1 = Math.sin(rad) * (r - 20 * BL); var x2 = Math.cos(rad) * (r - 24 * BL); var y2 = Math.sin(rad) * (r - 24 * BL); if (i % 2.5 == 0) { x2 = Math.cos(rad) * (r - 26 * BL); y2 = Math.sin(rad) * (r - 26 * BL); } ctx.beginPath(); ctx.lineWidth = 0.5 * BL;//线要 乘上 比例 ctx.strokeStyle = "#2894FF"; ctx.moveTo(x1,y1); ctx.lineTo(x2,y2); ctx.stroke(); ctx.closePath(); } // 画秒针 var date = new Date(); var second=date.getSeconds(); var angleS=second*6; ctx.save(); //ctx.rotate(getRad(-90)); ctx.lineWidth=0.5; ctx.strokeStyle = "black"; ctx.beginPath(); var angle=stopWatch.getPointerAngle(); if(Math.abs(angle%90,0)<2){ writeUsed(); } ctx.rotate(getRad(angle)); ctx.moveTo(-1 * BL, 16 * BL);//画出一个秒针 x轴-2 y轴20 ctx.lineTo(1 * BL,16 * BL); ctx.lineTo(1, -r + 26 * BL); ctx.lineTo(-1, -r + 26 * BL); ctx.fill(); ctx.stroke(); ctx.closePath(); ctx.restore(); ctx.restore(); } function animate(){ if(!paused){ draw(); //setTimeout( function(){ window.requestAnimationFrame(animate); /// 让浏览器自行决定帧速率 //}, 0.20 * 1000 );// 延时执行 } } //---------------------------------------------------Stopwatch类定义开始------------------------------------------------------------------->> Stopwatch=function(){} Stopwatch.prototype={ // Property startTime:0, running:false, elapsed:0, // method start:function(){ this.startTime=+new Date(); this.elapsed=0; this.running=true; }, stop:function(){ this.elapsed=(+new Date())-this.startTime; this.running=false; }, getElapsedTime:function(){ if(this.running){ return (+new Date())-this.startTime; }else{ return this.elapsed; } }, getPointerAngle:function(){ var sec=this.getElapsedTime()/1000; return (sec*6) % 360; }, getSeconds:function(){ var sec=this.getElapsedTime()/1000; return sec; }, isRunning:function(){ return this.running; }, reset:function(){ this.elapsed=0; }, } //---------------------------------------------------Stopwatch类定义结束-------------------------------------------------------------------<< // 常规函数:角度得到弧度 function getRad(degree){ return degree/180*Math.PI; } //--> </script>
2019年3月5日14点19分
[Canvas]计时表/秒表的更多相关文章
- HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版
HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...
- html5 canvas常用api总结(三)--图像变换API
canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...
- 【探索】利用 canvas 实现数据压缩
前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...
- 简单入门canvas - 通过刮奖效果来学习
一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...
- 获取Canvas当前坐标系矩阵
前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...
- Canvas坐标系转换
默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为x=0,y=0的点称作原点.在默认坐标系中,每一个点的坐标都是直接 ...
- Canvas绘图之平移translate、旋转rotate、缩放scale
画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响. 函数 方法 描 ...
- 用html5的canvas和JavaScript创建一个绘图程序
本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...
- html5标签canvas函数drawImage使用方法
html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本.参数传递三种形式: drawImage(image,x,y):在 ...
随机推荐
- CGI-- FASTCGI
http://blog.csdn.net/sweatott/article/details/54913151 CGI:是 Web Server 与 Web Application 之间数据交换的一种协 ...
- HDU 4568 SPFA + TSP
这道题是长沙邀请赛的题,当时是道签到题. 这种题还是很常见的,讲一下思路. 首先是预处理出每个宝藏之间的距离,还有到边的距离,直接对每个宝藏进行一次SPFA就可以了. 然后就是经典的求TSP的过程. ...
- c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换
最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序, ...
- nil coalescing operator
nil coalescing operator ?? 就是 optional和 三元运算符?:的简写形式. 比如一个optional String类型的变量 var a:String? // prin ...
- 解决ubuntu上在androidstudio中启动emulator闪退的问题(1)
作者 彭东林 pengdonglin137@163.com 平台 Ubuntu14.04 64 androidstudio 2.3.3 现象 在创建好模拟器后,点击启动时,模拟器界面刚出来就闪退了 解 ...
- How can i use iptables on centos 7?
I installed CentOS 7 with minimal configuration (os + dev tools). I am trying to open 80 port for ht ...
- cocos2d-x 保持屏幕点亮及自动变灰
很早之前遇到的问题,现在记录一下.有一家Android渠道(抱歉,时间太长了已经记不大清楚是哪一家了 oppo/联想/酷派?)在我们提交新版本时拒绝了,理由是:手机背光状态下,屏幕不会自动变灰. 这里 ...
- 黑马day17 ajax&实现username自己主动刷新
1. regist.jsp文件 <%@ page language="java" pageEncoding="utf-8"%> <!DOCTY ...
- SQLUnit 环境搭建
1 技术须要积累 前几天去一位笛友小赖家玩,才知道他的笛子吹得好不是偶然.是由于他真的用功了,电脑里面下载有超多的视频.教程等!这真的非常让我震撼!一直是在公司做技术,但资料考不出来,而我整理了多少技 ...
- Java并发编程的艺术(六)——线程间的通信
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...