歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> HTML5 rotate 做儀表盤

HTML5 rotate 做儀表盤

日期:2017/3/1 10:24:19   编辑:Linux編程

我們的項目中有關於數據倉庫和挖掘,用戶要求UI的界面需要儀表盤,我網上找了下,沒有發現免費的HTML儀表盤,餅圖啥圖表的確很多,那就沒有辦法了,我和同事自己做了一個儀表盤,結果如下。


之後我們就來討論下這個簡單的儀表盤是怎麼做的。我們先大致有一個想法,設定一個寬高2:1的canvas,儀表盤的半徑就是canvas的高度,儀表盤需要的數據有上面分幾個區域(一般是低中高三個區域,為了測試我們准備了四個區域),刻度線和文字,指針,和指針指向的值。


首先第一步自然是canvas的聲明

  1. <body>
  2. <div>
  3. <canvas id="board" width="800" height="600">
  4. </canvas>
  5. </div>
  6. </body>
  7. </html>
之後的工作都在javascript中完成,我們需要定義一些對象
  1. //儀表盤面板
  2. var panel = function(id, option) {
  3. this.canvas = document.getElementById(id); //獲取canvas元素
  4. this.cvs = this.canvas.getContext("2d"); //得到繪制上下文
  5. this.width = this.canvas.width; //對象寬度
  6. this.height = this.canvas.height; //對象高度
  7. this.level = option.level;
  8. this.outsideStyle = option.outsideStyle;
  9. }
這個panel就是我們的儀表盤對象,參數的id是canvas元素,option是我們需要提交給儀表盤的一些參數值。這個option的定義如下:option對象可以擴展,你可以通過optin定制更加自由強大的儀表盤對象的。
  1. var panelOption = {
  2. maxLength: 30,
  3. interval: 5,
  4. level: [//儀表盤需要呈現的數據隔離區域
  5. {start: 0, color: "red" },
  6. { start: 30, color: "yellow" },
  7. { start: 40, color: "blue" },
  8. { start: 100, color: "Lime" }
  9. ],
  10. outsideStyle: { lineWidth: 4, color: "rgba(100,100,100,1)" }
  11. };
在繪制元素的時候,我們常常需要保存和恢復現場,特別當我們使用轉移,旋轉等方法的時候,一定要記得先save最後restore。為了方便,我們編寫了一個save函數提供這個方式,這個模式類似C#中的委托,和設計模式中的觀察著模式
  1. panel.prototype.save = function(fn) {
  2. this.cvs.save();
  3. fn();
  4. this.cvs.restore();
  5. }
上面這個save可以方便的幫助我們保存和回復現場。

我們定義個用於畫半圓的方法,這個方法中,我們將需要畫半圓時做的translate放到save函數中,這樣畫半圓的變形操作不會對其他操作有影響。

  1. panel.prototype.drawArc = function() {
  2. var p = this;
  3. var cvs = this.cvs;
  4. p.save(function() {
  5. cvs.translate(p.width / 2, p.height); //將坐標點移到矩形的底部的中間
  6. cvs.beginPath();
  7. cvs.lineWidth = p.outsideStyle.lineWidth;
  8. cvs.strokeStyle = p.outsideStyle.color;
  9. cvs.arc(0, 0, p.height - cvs.lineWidth, 0, Math.PI / 180 * 180, true); //畫半圓
  10. cvs.stroke();
  11. });
  12. }
然後我們繪制中間顏色的填充區域
  1. panel.prototype.drawLevelArea = function(level) {
  2. var p = this;
  3. var cvs = this.cvs;
  4. for (var i = 0; i < level.length; i++) {
  5. p.save(function() {
  6. cvs.translate(p.width / 2, p.height);
  7. cvs.rotate(Math.PI / 180 * level[i].start);
  8. p.save(function() {
  9. cvs.beginPath();
  10. cvs.arc(0, 0, p.height - p.outsideStyle.lineWidth, Math.PI / 180 * 180, Math.PI / 180 * 360);
  11. cvs.fillStyle = level[i].color;
  12. cvs.fill();
  13. });
  14. });
  15. }
  16. }
Copyright © Linux教程網 All Rights Reserved