反饋已提交
網絡繁忙
在做報表的時候希望即時展現時間,並有一個比較美觀的鐘表效果,如下圖所示:
利用 HTIML的畫布功能並配合 JavaScript 程式碼,獲取系統的實時時間,並間隔一秒轉列一次時鐘。
建立範本,在 A1 儲存格中新增 HTML 程式碼,設定儲存格顯示方式為「用 HTML 顯示內容」。如下圖所示:
HTML 程式碼如下:
注:程式碼中的寬和高屬性可以根據自己的需要調整。
<canvas id="view" height="300px" width="300px"></canvas>
點選「範本>範本Web屬性>分頁預覽設定」,選擇「為該範本單獨設定」,增加一個「載入結束」事件,如下圖所示:
JavaScript 程式碼如下:
注1:決策報表中,可透過給 body 或者報表塊新增一個「初始化後」事件實現。程式碼需要加一個延遲函式,即將上述程式碼新增到setTimeout(function(){ },1000);程式碼的 { } 中。
注2:FVS 範本中,可透過給表格組件新增「初始化後」事件實現。程式碼與上述決策報表相同,但需要在 JavaScript 程式碼的開頭加上 "use document"; 。
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\doctw\JS\js實現時鐘效果.cpt
點選可下載範本:js實現時鐘效果.cpt
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙