1. 概述
1.1 預期效果
在做報表的時候希望實時的展現時間,并有一個比較美觀的鍾表效果,如下圖所示:
1.2 實現思路
利用 HTIML的畫布功能并配合 JavaScript 代碼,獲取系統的實時時間,并間隔一秒繪制一次時鍾。
2. 示例
2.1 準備模板
新建模板,在 A1 單元格中添加 HTML 代碼,設置單元格顯示方式爲「用 HTML 顯示内容」。如下圖所示:
HTML 代碼如下:
注:代碼中的寬和高屬性可以根據自己的需要調整。
<canvas id="view" height="300px" width="300px"></canvas>
2.2 添加事件
點擊「模板>模板Web屬性>數據分析設置」,選擇「爲該模板單獨設置」,增加一個「加載結束」事件,如下圖所示:
JavaScript 代碼如下:
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); //每隔一秒重新繪制時鍾
如果是在決策報表中,添加報表塊然後執行相同操作,報表塊的事件裏把上述 JavaScript 代碼添加到下面代碼的 function 裏面。
setTimeout(function(){ },1000);
2.3 效果預覽
保存模板,點擊「分頁預覽」,效果如下圖所示:
注:不支持移動端。
3. 模板下載
已完成模板可參考%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\js實現時鍾效果.cpt
點擊可下載模板:js實現時鍾效果.cpt