反饋已提交
網絡繁忙
在做报表的时候希望实时的展现时间,并有一个比较美观的钟表效果,如下图所示:
利用 HTIML的画布功能并配合 JavaScript 代码,获取系统的实时时间,并间隔一秒绘制一次时钟。
新建模板,在 A1 单元格中添加 HTML 代码,设置单元格显示方式为「用 HTML 显示内容」。如下图所示:
HTML 代码如下:
注:代码中的宽和高属性可以根据自己的需要调整。
<canvas id="view" height="300px" width="300px"></canvas>
点击「模板>模板Web属性>数据分析设置」,选择「为该模板单独设置」,增加一个「加载结束」事件,如下图所示:
JavaScript 代码如下:
注:决策报表中,可通过给 body 或者报表块添加一个「初始化后」事件实现。代码需要加一个延迟函数,即将上述代码添加到setTimeout(function(){ },1000);代码的 { } 中。
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); //每隔一秒重新绘制时钟
保存模板,点击「分页预览」,效果如下图所示:
注:不支持移动端。
已完成模板可参考%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\js实现时钟效果.cpt
点击可下载模板:js实现时钟效果.cpt
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙