js实现时钟效果

编辑
文档创建者:axing (73248 )     浏览次数:328次     编辑次数:3次     最近更新:jiangsr 于 2018-01-29     

目录:

1.问题描述编辑

在做报表的时候希望实时的展现时间,并有一个比较美观的效果,效果如下图:


222

2.实现思路编辑

利用HTIML5的画布功能并配合js代码,获取系统的实时时间,并间隔一秒绘制一次时钟。

3.实现步骤编辑

1)在单元格中输入以下代码,然后使用HTML显示内容:

222

<canvas id="view" height="300px" width="300px"></canvas> 

注:代码中的宽和高属性可以根据自己的需要调整。

2)在预览方式中添加js加载结束事件,如下:

222

js代码如下:

var dom=document.getElementById("view"); //获取canvas元素 var ctx=dom.getContext("2d"); //创建context对象 var width=ctx.canvas.width; var height=ctx.canvas.height; var r=width/2; //绘制时钟背景 function drawBackground(){ ctx.translate(r,r); //将画布原点重置为画布的中心 ctx.beginPath(); ctx.lineWidth=10; ctx.arc(0,0,r-5,0,2*Math.PI); //绘制一个圆,即时钟的边框 ctx.stroke(); //绘制时钟上的刻度 for(var i=0;i<60;i++){ var x=(r-20)*Math.cos(Math.PI*2/60*i); var y=(r-20)*Math.sin(Math.PI*2/60*i); //每逢5个刻度使用黑色绘制,其余用灰色绘制 if(i%5===0){ ctx.fillStyle="#000000"; }else{ ctx.fillStyle="#cccccc"; } ctx.beginPath(); ctx.arc(x,y,5,0,2*Math.PI); ctx.fill(); } //绘制时钟上的数字 ctx.font="20px Arial"; ctx.textAlign="center"; ctx.textBaseline="middle"; ctx.fillStyle="#000000"; for(var j=0;j<12;j++){ var ax=(r-50)*Math.cos(Math.PI*2/12*j); var ay=(r-50)*Math.sin(Math.PI*2/12*j); ctx.beginPath(); ctx.fillText(j>9?j-9:j+3,ax,ay); //因为PI的角度计算是从3点钟方向顺时针计算的,所以要对数字判断处理 ctx.fill(); } } //绘制时针 function drawHour(hour,minute,second){ ctx.save(); //保存当前绘图环境 ctx.beginPath(); //时针的角度等于小时的角度加分钟和秒钟转化为小时的角度 var rad=2*Math.PI/12*hour+2*Math.PI/12/60*minute+2*Math.PI/12/60/3600*second; ctx.rotate(rad); ctx.lineWidth=14; ctx.lineCap="round"; //设置画线结束端为圆帽形 ctx.moveTo(0,20); ctx.lineTo(0,-r+100); ctx.stroke(); ctx.restore(); //返回之前保存的绘图环境 } //绘制分针 function drawMinute(minute,second){ ctx.save(); //保存当前绘图环境 ctx.beginPath(); //分针的角度等于分钟的角度加秒钟转化为分钟的角度 var rad=2*Math.PI/60*minute+2*Math.PI/3600*second; ctx.rotate(rad); ctx.lineWidth=10; ctx.lineCap="round"; ctx.moveTo(0,20); ctx.lineTo(0,-r+80); ctx.stroke(); ctx.restore(); //返回之前保存的绘图环境 } //绘制秒针 function drawSecond(second){ ctx.save(); //保存当前绘图环境 ctx.beginPath(); ctx.fillStyle="#FF0000"; var rad=2*Math.PI/60*second; //秒针的角度为当前秒钟的角度 ctx.rotate(rad); ctx.lineWidth=2; ctx.lineCap="round"; ctx.moveTo(0,30); ctx.lineTo(8,0); ctx.lineTo(0,-r+30); ctx.lineTo(-8,0); ctx.lineTo(0,30); ctx.fill(); ctx.restore(); //返回之前保存的绘图环境 } //重新绘制时钟 function run(){ ctx.clearRect(0,0,width,height); //清空整张画布,在下面的代码中重新绘制 ctx.save(); //保存当前绘图环境 var time =new Date(); //获取当前时间 var hour=time.getHours(); //获取小时数 var minute=time.getMinutes(); //获取分钟数 var second=time.getSeconds(); //获取秒数 drawBackground(); //绘制背景 drawHour(hour,minute,second); //绘制时针 drawMinute(minute,second); //绘制分针 drawSecond(second); //绘制秒针 //绘制时钟中心的那个点 ctx.fillStyle="#555"; ctx.beginPath(); ctx.arc(0,0,8,0,2*Math.PI); ctx.fill(); ctx.restore(); //返回之前保存的绘图环境 } window.setInterval(function(){run();},1000); //每隔一秒重新绘制时钟

4.保存预览编辑

点击分页预览,效果如上图。

已完成模板可参考%FR_HOME%\WebReport\WEB-INF\reportlets\doc\JS\js实现时钟效果.cpt 

5.备注说明编辑

如果是在决策报表中,就添加报表块然后执行相同操作,然后在报表块的事件里把上述js代码添加到下面代码的function里面。

setTimeout(function(){ },1000);

附件列表


主题: 二次开发
如果您认为本文档还有待完善,请编辑

文档内容仅供参考,如果你需要获取更多帮助,请咨询帆软技术支持
关于技术问题,您还可以通过帆软论坛获取帮助,论坛上有非常多的大神,有些水平比帆软工程师还要高哦。
若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

本文档是否有用?
谢谢! 我们非常感谢您的反馈。
提交反馈: