精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端高級之路:寫一個高逼格可視化“圓環

開發
日常生產生活中,我們會經常讀到或使用各種類型的圖表。圓環(圓弧)便是一種較常見的類型,用于直觀展現某一數據指標占整體的比例。本文以 HTML Canvas 的實現為主(當然,SVG 黨可以在了解原理后自行實現),逐層介紹圓環圖表開發的一些主要思路和原理。

圖1 所示是一些我們平時比較常見的一些圓環(圓弧)效果。雖然圖形的主體構成都是圓弧,但不同效果在信息傳達的功能上卻略有差異。如:

  • 閉合的圓環可以表示流程 “進度” 的概念
  • 非閉合圓環一般用于狀態量(標量)的展示,一般也稱為 “儀表盤” 效果
  • 不同的色相可用于標識狀態量的狀態區間(如:低危-中危-高危 區間的標識可以使用三種顏色的構成的過渡效果進行表達)

為了更加方便、完善地解決我們在業務開發時的具體需要,可以對這些風格、樣式進行一定分析、抽象,總結出一個通用組件需要具備的能力,如:

  • 顏色、漸變可配(支持傳入單一色值或顏色序列)
  • 圓弧寬度可調(內、外半徑大小可配置)
  • 圓弧夾角可調(開始角度、截止角度可配置)
  • 圓弧端點造型可選(可切換平角/半圓造型
  • 文案效果可調(字號、字體、顏色等)

下面,我們著手于實現這樣一個功能全面、業務通用性較強的圓環組件。

1. 圓環的造型
繪制圓環造型的第一步,需要先繪制圓環圖表構成要素,即一段一段的圓弧。而對于像下圖中這樣的兩種倒角效果(黃色部分圓弧兩端的樣式),既可以是直角,也可以是半圓。 

因此,我們需要實現一個通用的方法來繪制圓弧,提供兩種倒角風格給用戶。

1.1 前景圓弧的繪制

圓弧繪制的思路如上圖所示,按先后順序大致分為幾個步驟:

(1)繪制圓弧起始端的半圓輪廓

(2)繪制圓弧的外邊緣輪廓

(3)繪制圓弧終止端的半圓輪廓

(4)繪制圓弧的內邊緣輪廓

(5)閉合輪廓并填充色彩

注:由于 canvas 繪制圓弧的方法默認是順時針方向,因而我們的繪圖步驟也是沿著順時針方向

以下是一些姿勢要領:

1.1.1 端點坐標的計算
在繪制端點半圓之前我們需要端點的位置坐標,以其實端為例,根據圓環的半徑(內外徑的均值,即圓弧中線的半徑)和起始端點的角度如何計算圓上一點的坐標:

  1. // 計算圓弧上某點的坐標 
  2. // originX, originY - 圓心的坐標 
  3. // radius - 圓環半徑,等于圓環內、外徑的平均值,也即圓弧中線的半徑 
  4. // alpha - 弧度 
  5. function calcPosition(originX, originY, radius, alpha) { 
  6.   return [ 
  7.     radius * Math.cos(alpha) + originX, 
  8.     radius * Math.sin(alpha) + originY, 
  9.   ]; 

1.1.2 端點半圓的起止角度

在 canvas 中繪制一個 arc,需要知道其起始角度和終止角度。由于 canvas 繪制默認方向為屏幕順時針方向(屏幕 Z軸 的左手螺旋方向),從上面的示意圖中可以看出:

起始端半圓弧度范圍 - [radianStart - Math.PI, radianStart]

終止端半圓弧度范圍 - [radianEnd, radianEnd + Math.PI]

1.1.3 繪制半圓
有了端點坐標和起止角度,便可以繪制端點的半圓:

  1. // 以起始端的半圓倒角為例 
  2. myCanvas.context.arc( 
  3.   x, 
  4.   y, 
  5.   (radiusOutter - radiusInner) / 2,     // 小圓半徑,等于圓環線寬的一半 
  6.   radianStart - Math.PI, 
  7.   radianStart 
  8. ); 

直角倒角風格的繪制與半圓倒角圓弧的繪制步驟基本相同,主要差別在于不用繪制圓弧兩個端點的小半圓,改成繪制直線。背景圓弧的繪制也與前景圓弧方法一致。

2. Canvas 實現錐形漸變
上面的步驟可以繪制出圓弧的輪廓,要達到 圖1 那樣的視覺效果,我們需要給前面繪制出來的輪廓填充圖像。

沿著圓周方向的漸變,因為其圖像形似圓錐體的俯瞰效果,俗稱錐形漸變:

眾所周知,CSS 中有一個名為 conic-gradient 的屬性直接支持錐形漸變,而 HTML Canvas 的原生 API 目前還沒有類似的能力。那么,我們如何在 canvas 中繪制出這樣的圖像呢?

下面我們講下大致的原理:

(1)對用戶傳入的顏色進行插值,得到一個顏色序列。

這里,我們直接使用 canvas 原生的 createLinearGradient 方法,在離屏 canvas 中繪制一個 1px 的線性漸變效果,圖像寬度正好是我們要插值的數量,漸變插值的結果也就是 canvas 上對應像素位置的色值。

 

顏色插值(漸變取色)代碼實現如下:

  1. // 用于實現顏色插值的工具類 
  2. export default class ColorInterpolate { 
  3.   // 參數01: stops - 為要插值的顏色序列,數據格式形如:[[0, 'red'], [0.5, 'green'], [1.0, 'yellow']] 
  4.   // 參數02: segment - 插值段落數,即插值結果的顏色值的數量 
  5.   constructor(stops = [], segment = 100) { 
  6.     // 構建離屏 canvas 
  7.     const canvas = document.createElement('canvas'); 
  8.     canvas.width = segment; 
  9.     canvas.height = 1; 
  10.     this.ctx = canvas.getContext('2d'); 
  11.  
  12.     // 繪制線性漸變 
  13.     const gradient = this.ctx.createLinearGradient(0, 0, segment, 0); 
  14.     for (let [offset, color] of stops) { 
  15.       gradient.addColorStop(offset, color); 
  16.     } 
  17.  
  18.     this.ctx.fillStyle = gradient; 
  19.     this.ctx.fillRect(0, 0, segment, 1); 
  20.   } 
  21.  
  22.   // 根據位置偏移量獲取插值后的色值 
  23.   getColor(offset) { 
  24.     const imgData = this.ctx.getImageData(offset, 0, 1, 1); 
  25.     return `rgba(${imgData.data.slice(0, 3).join(',')}, ${imgData.data[3] / 255})`; 
  26.   } 

(2)如下圖所示,我們可以把漸變的圖像看成是由足夠多填充了單個色值的小 “扇面” 拼接而成。

按照這樣的思路,我們只需要遍歷上面色彩插值得到的各個顏色,然后逐個繪制小扇面,便可得到一個錐形漸變圖像。

為此我們封裝了一個名為 createConicalGradient 的方法,其使用習慣與 canvas 原生的 createLinearGradient 和 createRadialGradient 方法相似。具體代碼見 我的 Github(覺得有用的童鞋可以 star 一下)。

3. 過渡動畫
3.1 圓弧的過渡
在數值發生改變時,我們的圖表需要一個能夠跟隨數據改變的過渡動畫效果,對于 canvas 而言,便是清除舊圖像然后繪制新一幀圖像。這里有一些方法包裝上的技巧:

  1. // 注:偽代碼,真實場景建議 OOP 方式包裝為工具類 
  2.  
  3. let _animTick = null
  4. let _animFrames = null
  5. let _frameData = null
  6. let _animDiff = null
  7.  
  8. // 動畫方法 
  9. function _animate(duration) { 
  10.   if (_animTick === null) { 
  11.     // 根據動畫時長 duration 計算整個動畫一共需要多少幀(以 60fps 計算) 
  12.     _animFrames = Math.round((duration / 1e3) * 60); 
  13.  
  14.     // 相鄰兩幀動畫的數據變化 
  15.     _animDiff = _calcAnimDiff(_animFrames); 
  16.  
  17.     // 動畫幀數標識 
  18.     _animTick = 0; 
  19.   } 
  20.  
  21.   // 當前幀的數據值 
  22.   _frameData = _caclCurentData(_animDiff, _animTick); 
  23.   _renderFrame(_frameData); 
  24.  
  25.   if (_animTick !== null && _animTick < _animFrames) { 
  26.     // 繼續執行動畫 
  27.     window.requestAnimationFrame(() => { 
  28.       _animate(); 
  29.       _animTick += 1; 
  30.     }); 
  31.   } else { 
  32.     // 動畫結束 
  33.     _renderFrame(_frameData); 
  34.     _animTick = null
  35.   } 
  36.  
  37. // 繪制當前幀 
  38. function _renderFrame(data) { 
  39.   // ... 
  40.  
  41. // 計算動畫相鄰幀的數據差異 
  42. function _calcAnimDiff() { 
  43.   // ... 
  44.  
  45. // 根據兩幀數據差計算當前幀 
  46. function _caclCurentData() { 
  47.   // ... 

3.2 兩種動畫模式
在過渡動畫執行的過程中,需要考慮兩種不同的模式:一種是漸變圖像不變化,僅是圓弧的輪廓從舊狀態變化到新狀態;一種是漸變圖像的夾角范圍跟隨輪廓的大小改變。

這兩種模式其實都有一定意義:前者可以使用不同顏色代表數值的不同狀態;后者僅僅是將漸變的顏色看成一種裝飾效果。

4. 結果演示
比較關鍵的原理都介紹完了,最后展示一下我們封裝的圖表組件的效果(右側 GUI 部分是我們自研的設計引擎的編輯效果):

 

 

責任編輯:姜華 來源: 晨曦大前端
相關推薦

2016-11-17 12:49:36

云運維銀行卡建設

2017-06-19 08:30:35

大數據數據可視化報表

2020-06-08 15:18:50

Python圖片PIL

2024-05-22 16:03:49

2020-04-10 14:20:47

算法可視化Github

2024-03-11 00:05:00

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2021-08-11 06:57:17

驗證碼圖片顯示

2017-07-10 14:18:34

微服務架構可視化

2021-06-09 11:26:37

BokehPython可視化

2019-10-09 17:12:16

PythonLinuxWindows

2013-12-06 10:05:29

數據中心網絡操作可視化

2025-02-14 00:25:00

SQL寫法業務

2015-04-01 10:07:06

云計算概念公有云私有云

2022-04-20 20:30:36

可視化模塊Python

2025-10-10 07:00:00

Python數據可視化數據分析

2017-10-14 13:54:26

數據可視化數據信息可視化

2022-07-07 08:50:26

Python可視化模塊代碼

2021-03-31 13:28:17

開源工具Python編程語言

2017-08-17 14:20:35

大數據可視化方法
點贊
收藏

51CTO技術棧公眾號

国产午夜精品理论片在线| aa在线观看视频| av 一区二区三区| 好看的av在线不卡观看| 日韩av一区在线观看| 丰满人妻中伦妇伦精品app| 国产私人尤物无码不卡| 青青草视频在线免费播放| 每日更新av在线播放| 国内精品伊人久久久久影院对白| 欧美韩国理论所午夜片917电影| 亚洲熟女乱综合一区二区三区| 欧洲一级精品| 亚洲综合视频在线观看| 欧美日韩亚洲一区二区三区在线观看 | 黄色免费大全亚洲| 欧美日产在线观看| 九一国产精品视频| 老司机在线视频二区| 91麻豆成人久久精品二区三区| 国产精品永久免费视频| 国内免费精品视频| 一级欧洲+日本+国产| 亚洲欧美综合另类中字| 亚洲一区和二区| jizzyou欧美16| 色综合一个色综合| 全黄性性激高免费视频| a视频在线免费看| 国产嫩草影院久久久久| 精品国产乱码久久久久久108| 国产精品免费无遮挡| 日韩国产高清影视| 91av在线不卡| 久久国产精品波多野结衣| 久久婷婷蜜乳一本欲蜜臀| 日韩成人在线视频观看| 一区二区三区人妻| 成人免费在线观看视频| 色欧美乱欧美15图片| 自拍日韩亚洲一区在线| 免费污视频在线| 亚洲男人都懂的| 综合网五月天| 在线激情免费视频| 国产午夜亚洲精品羞羞网站| 明星裸体视频一区二区| 天天干,夜夜操| 大陆成人av片| 国产91aaa| 亚洲精品无码久久久| 国产美女视频一区| 成人a在线视频| 一本久道久久综合无码中文| 日本aⅴ亚洲精品中文乱码| 欧美一级电影久久| 色屁屁影院www国产高清麻豆| 亚洲小说区图片区| 久久乐国产精品| 国产午夜福利片| 亚洲精选国产| 日av在线播放中文不卡| 综合网在线观看| 日本一区中文字幕| 国产欧美在线看| 99国产精品99| 国产成人午夜电影网| 不卡一区二区三区视频| 国产香蕉在线观看| 久久综合999| 亚洲v国产v| 国产黄色在线免费观看| 一区二区三区在线免费播放 | 人妻激情偷乱视频一区二区三区| 久久久91麻豆精品国产一区| 精品少妇一区二区三区视频免付费| 特黄特色免费视频| 欧美日韩一本| 国产亚洲美女精品久久久| 少妇高潮惨叫久久久久| 亚洲精品极品少妇16p| 久久久久久91| 日韩视频在线观看一区| 欧美aaaaaa午夜精品| 成人黄色大片在线免费观看| 亚洲福利在线观看视频| 91亚洲精品乱码久久久久久蜜桃 | 中文字幕一区二区三区在线视频| 色综合久久中文字幕综合网小说| 久久精品视频6| 日韩专区一卡二卡| 91黄在线观看| 国产片在线观看| 一区二区在线观看视频| jizzjizzxxxx| 91麻豆精品| 日韩高清欧美高清| www.xx日本| 99日韩精品| 91精品国产综合久久香蕉最新版| 日韩一级片免费在线观看| 中文一区在线播放| 嫩草影院中文字幕| 久久亚洲精品爱爱| 欧美成人a∨高清免费观看| 久久丫精品国产亚洲av不卡| 性欧美69xoxoxoxo| 日本久久久久久久| 精品久久久无码中文字幕| 国产亚洲短视频| 免费av手机在线观看| 全球中文成人在线| 亚洲毛片在线观看| 欧美三根一起进三p| 日韩国产成人精品| 久久久久久国产精品mv| 成人日日夜夜| 欧美性受极品xxxx喷水| jlzzjizz在线播放观看| 伊人成综合网| 国产精品综合久久久| 天堂av在线资源| 亚洲色图制服诱惑| www亚洲成人| 欧美美女在线| 91国语精品自产拍在线观看性色 | 秋霞影院一区| 最好看的2019年中文视频| 久久国产精品免费看| 国产精品一区二区在线观看不卡 | 欧美成熟视频| 国产啪精品视频| 国产高清av在线| 色综合天天综合网天天看片| 国产精品成人99一区无码| 在线成人直播| 成人性生交大片免费看小说| av二区在线| 欧美图区在线视频| 亚洲自拍偷拍图| 视频一区中文字幕国产| 欧美动漫一区二区| 亚洲精品福利电影| 亚洲精品视频二区| 亚洲天堂视频网站| 91麻豆福利精品推荐| 黑森林福利视频导航| 色综合久久中文| 欧美一区二区色| 手机福利小视频在线播放| 亚洲va韩国va欧美va精品 | 精品按摩偷拍| 性色av一区二区咪爱| 污污视频在线观看网站| 午夜久久电影网| 中文字幕 亚洲一区| 99国产精品自拍| 裸模一区二区三区免费| 韩国美女久久| 中文字幕精品久久| 911美女片黄在线观看游戏| 国产精品伦理在线| 日韩av一卡二卡三卡| 91精品99| 国产超碰91| 亚洲电影观看| 一本色道久久综合狠狠躁篇怎么玩| 免费看污视频的网站| 国产精品视频线看| 三级性生活视频| 伊人久久婷婷| 日本午夜精品一区二区| 久久久久亚洲av成人无码电影| 新片速递亚洲合集欧美合集| 一区二区欧美在线| 国产美女免费视频| 亚洲国产日韩一区二区| 波多野结衣片子| 精品写真视频在线观看| 亚洲精品久久久久久久蜜桃臀| 全球av集中精品导航福利| 日韩av片免费在线观看| 男人天堂久久久| 精品日韩成人av| 在线视频一区二区三区四区| 中文字幕日本不卡| 中文字幕精品视频在线| 麻豆成人综合网| 无码 制服 丝袜 国产 另类| 欧美精品尤物在线观看| 亚洲字幕一区二区| 成人勉费视频| 欧美另类在线观看| 久久精品蜜桃| 日韩亚洲欧美综合| 亚洲成熟少妇视频在线观看| ...av二区三区久久精品| 久久性爱视频网站| 麻豆精品国产91久久久久久| 欧美,日韩,国产在线| 操欧美老女人| 高清视频在线观看一区| 欧美日韩五区| 欧美风情在线观看| 国产大片在线免费观看| 欧美一级二级三级乱码| av大片免费观看| 国产欧美日韩精品a在线观看| 日韩av福利在线观看| 国产精品久久久久久久免费软件| 亚洲国产一区二区三区在线播| 9999久久久久| 亚洲超丰满肉感bbw| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 麻豆国产一区二区三区四区| 91精品国产免费久久久久久| 成人网视频在线观看| 欧美成人三级在线| ,亚洲人成毛片在线播放| 精品久久中文字幕久久av| www.xx日本| 久久婷婷国产综合精品青草 | √资源天堂中文在线| 亚洲蜜桃精久久久久久久| 香蕉视频黄色在线观看| 国产福利一区二区| 亚洲精品视频导航| 久久久久久黄| 国产一区 在线播放| 丰满少妇乱子伦精品看片| 99视频+国产日韩欧美| 亚洲精品少妇一区二区| 中文有码一区| 国产精选一区二区| 国产精品久久久久久久久久辛辛 | 豆国产96在线|亚洲| 亚洲黄色小视频在线观看| 国产模特精品视频久久久久| 日韩五码在线观看| 亚洲色图欧美| 亚洲制服欧美久久| 国产成人调教视频在线观看| 国产一区二区三区奇米久涩 | 久久精品九九| 欧美丰满熟妇bbbbbb百度| 综合精品一区| 在线码字幕一区| 国产精品欧美在线观看| 欧美xxxx黑人又粗又长密月| 鲁大师精品99久久久| 国产精品国模大尺度私拍| www.久久草.com| 91成人伦理在线电影| 国产一区二区| 91在线免费视频| 亚洲国产aⅴ精品一区二区三区| 日韩美女福利视频| 在线观看爽视频| 69久久夜色精品国产69乱青草| 伊人成综合网站| 国产91在线高潮白浆在线观看| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 精品久久精品| 日本一区精品| 日韩精品福利一区二区三区| 久热国产精品视频一区二区三区| 小嫩嫩12欧美| 欧美日韩国产精品一区二区| 国内精品视频在线观看| 色播亚洲婷婷| 1769视频在线播放免费观看| 久久久久久久久久久电影| 国产高清自拍视频| 91啪九色porn原创视频在线观看| 久久久久久久久久久国产精品| 国产香蕉久久精品综合网| 微拍福利一区二区| 国产精品亲子伦对白| 人与动物性xxxx| 亚洲亚洲精品在线观看| 日韩手机在线观看| 色哟哟国产精品| 国产欧美日韩另类| 欧美视频在线观看一区| 国产精品欧美激情在线| 日韩一二三区视频| 久久精品色图| 久久精品2019中文字幕| 日韩精品卡一| 668精品在线视频| 国产精品久久久久久av公交车| av免费观看久久| 偷拍视屏一区| 久久免费一级片| 国产精品毛片一区二区三区| 亚洲老女人av| 97精品久久久午夜一区二区三区| 精品成人无码一区二区三区| 中文字幕在线不卡视频| 黄色一级片在线| 日本韩国欧美三级| 国产高清精品软件丝瓜软件| 精品视频在线播放| 麻豆电影在线播放| 日本欧美中文字幕| 韩国一区二区三区视频| 久久偷看各类wc女厕嘘嘘偷窃 | 国产精品一区二区三区99 | jvid福利写真一区二区三区| 午夜精产品一区二区在线观看的| 亚洲欧美日韩中文字幕一区二区三区| www.毛片.com| 日韩亚洲欧美中文三级| 黄色国产在线| 国产做受高潮69| 欧美xxxx网站| 欧美激情第六页| 国产精品99久久精品| 欧美国产日韩在线播放| 国产凹凸在线观看一区二区| 免费看的黄色网| 色网站国产精品| 蜜臀久久99精品久久久| 日韩一区二区三区xxxx| 精品亚洲美女网站| 国产精品亚洲综合| 天天天综合网| 伊人影院综合在线| 久久美女艺术照精彩视频福利播放| 国产波霸爆乳一区二区| 欧美午夜片在线免费观看| 99久久精品免费看国产交换| 国产一区二区三区18| aa视频在线观看| 成人精品水蜜桃| 天天av综合| 欧美日韩一区二区三区69堂| 国产欧美日韩另类视频免费观看| 久久久久久福利| 欧美一区二区大片| 久操视频在线| 国产精品视频99| 蜜桃tv一区二区三区| 国产特级黄色大片| 99热这里都是精品| 国产奶水涨喷在线播放| 欧美挠脚心视频网站| 国内av一区二区三区| 欧美一区二区影院| 欧美激情在线精品一区二区三区| 日韩欧美国产免费| 99精品热视频| 超碰超碰超碰超碰| 精品无人区乱码1区2区3区在线 | 一个色综合网站| 一级黄色片在线| 久久这里有精品| 国产精品麻豆| 国产麻豆电影在线观看| 国产一区999| 久久黄色小视频| 日韩视频永久免费| 国模雨婷捆绑高清在线| 国产成人一区二区三区免费看| 亚洲激情视频| av直播在线观看| 色综合久久久久网| 日韩三级影院| 91精品中文在线| 欧美日本一区二区高清播放视频| 性猛交╳xxx乱大交| 亚洲第一主播视频| 桃花色综合影院| 国产剧情久久久久久| 午夜激情久久| 久久aaaa片一区二区| 精品色蜜蜜精品视频在线观看| 色视频在线看| 4388成人网| 国产韩国精品一区二区三区| 人妻精品久久久久中文字幕69| 婷婷六月综合网| 国产高清在线| 国产欧美在线视频| 国产精品亚洲综合色区韩国| www在线观看免费视频| 欧美日韩国产高清一区二区三区 | 日韩一区三区| 成年人网站av| 日韩欧美高清视频| 一级毛片视频在线| av色综合网| 老司机精品视频一区二区三区| 国产盗摄一区二区三区在线| 亚洲二区中文字幕| 日韩成人亚洲| 人人妻人人澡人人爽欧美一区| 成人a免费在线看| 91久久久久久久久久久久| 欧美激情综合色|