精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩高清二区| 成人精品福利| 小嫩嫩精品导航| 中文字幕av一区| 婷婷中文字幕在线观看| 1234区中文字幕在线观看| 久久这里都是精品| 亚洲www在线| 黄色一级视频免费看| 亚洲影视一区二区三区| 亚洲国产欧美精品| 亚洲免费999| 国产精选在线| 自拍偷拍亚洲综合| 欧美精品二区三区四区免费看视频| 中文字幕第99页| 一级成人国产| 久久影院资源网| 在线免费观看视频| 国内精品偷拍| 欧美一卡2卡三卡4卡5免费| 久草青青在线观看| 超碰在线中文字幕| **网站欧美大片在线观看| 久久久人人爽| 欧美一级特黄aaaaaa大片在线观看| 美女任你摸久久| 欧美亚洲成人xxx| 久热精品在线观看| 91精品推荐| 最近中文字幕日韩精品 | 成年人免费高清视频| 亚洲va在线| 中文字幕亚洲专区| 人妻一区二区视频| 亚欧洲精品视频在线观看| 精品免费99久久| www.偷拍.com| 国产在线不卡一区二区三区| 欧美色区777第一页| 国产a视频免费观看| 成人影院av| 欧美小视频在线| 大j8黑人w巨大888a片| 欧美一卡二卡| 亚洲一区在线免费观看| 91大学生片黄在线观看| h网站久久久| 亚洲少妇30p| 人人妻人人澡人人爽精品欧美一区| 国产一二三区在线视频| 国产欧美久久久精品影院| 欧美日韩一区在线观看视频| 欧美日韩视频精品二区| 久久久.com| 亚洲电影一二三区| 色多多视频在线观看| 国产精品国产三级国产aⅴ入口| 亚洲电影网站| 国产激情在线| 亚洲午夜激情网站| 无码专区aaaaaa免费视频| 国内激情视频在线观看| 日韩欧美在线字幕| 97公开免费视频| 亚洲青青一区| 日韩精品中文字幕在线一区| 怡红院一区二区| 小嫩嫩12欧美| 中文字幕欧美日韩在线| 日日噜噜夜夜狠狠久久波多野| 一区二区三区网站 | 一本一道久久a久久精品综合 | 日本在线视频1区| 久久久精品蜜桃| 一区二区三区视频在线播放| 天堂成人av| 欧美日韩另类字幕中文| 国语对白做受xxxxx在线中国| 亚洲精品555| 欧美一区二区三区视频| 熟女人妻在线视频| 日韩在线欧美| 欧美极品美女视频网站在线观看免费| 精品成人久久久| 裸体在线国模精品偷拍| 国产精品国产三级国产专区53 | 亚洲第一狼人区| 欧美久久一区二区三区| 日韩av在线看| 999福利视频| 伊人久久综合| 国产精品视频中文字幕91| 亚洲经典一区二区| 欧美国产成人在线| 91精品国产91久久久久麻豆 主演| 一级毛片久久久| 日韩一区二区影院| 一区二区三区伦理片| 欧美国产高潮xxxx1819| 日本精品视频网站| wwwav在线播放| 中文子幕无线码一区tr| 成人精品视频在线播放| 久久er热在这里只有精品66| 精品视频偷偷看在线观看| 午夜三级在线观看| 日韩精品一卡二卡三卡四卡无卡| 亚洲在线第一页| 成人高清在线| 欧美日韩精品中文字幕| 第一页在线视频| 欧美日韩中字| 国产69久久精品成人看| 精品国自产在线观看| 中文字幕精品在线不卡| ww国产内射精品后入国产| 久久影院一区二区三区| 神马久久桃色视频| 无码人妻丰满熟妇区五十路| 成人黄色网址在线观看| 91社在线播放| 日韩一区二区三免费高清在线观看| 亚洲国产精久久久久久| 亚洲欧美一区二区三区四区五区| 久久亚洲色图| 久久精品国产美女| 丁香花视频在线观看| 欧美一区二区成人| 亚洲波多野结衣| 久久国产视频网| 日韩精品另类天天更新| 韩国美女久久| 精品一区二区三区四区| 亚洲男人第一av| 9i在线看片成人免费| 国产高清av在线播放| 影音先锋欧美激情| 欧美人与物videos| 亚洲av永久纯肉无码精品动漫| 亚洲精品少妇30p| 中文字幕一区二区在线观看视频| 欧美aaaa视频| 91在线免费看网站| 成人短视频在线观看| 91精品国产综合久久福利| 自拍偷拍第9页| 久久99国产精品免费网站| 亚洲乱码一区二区三区| 粉嫩一区二区三区在线观看| 久久av在线看| 高潮一区二区三区乱码| 亚洲观看高清完整版在线观看| 久久国产劲爆∧v内射| 国产婷婷精品| 免费看成人午夜电影| 日本欧美一区| 神马久久桃色视频| www.综合色| 亚洲va欧美va天堂v国产综合| 91九色蝌蚪porny| 亚洲视频1区| 日本不卡在线播放| 外国成人毛片| 久久91超碰青草是什么| 天天舔天天干天天操| 在线亚洲一区二区| 日韩精品一区二区亚洲av性色 | 国产成人精品无码免费看夜聊软件| 久久福利毛片| 亚洲一区二区不卡视频| 97se亚洲| 国产999精品久久久影片官网| 国产三级视频在线播放线观看| 欧美日韩免费观看一区二区三区| 青娱乐国产盛宴| 99久久国产综合色|国产精品| 欧美日韩在线不卡视频| 欧美xxxx中国| 国产视频一区二区不卡| 99久久er| 久久久久久久一区二区三区| 国产高清免费av在线| 91麻豆精品国产91久久久久| 日韩美女黄色片| 国产精品热久久久久夜色精品三区| 日日夜夜精品视频免费观看| 国产午夜久久| 国产人妻互换一区二区| 亚洲黄页网站| 99超碰麻豆| av成人免费看| 91av在线网站| 国产一区久久精品| 亚洲毛片在线观看.| 国产精品福利电影| 欧美色道久久88综合亚洲精品| 91精品少妇一区二区三区蜜桃臀| proumb性欧美在线观看| 黄大色黄女片18第一次| 日韩视频三区| 国产对白在线播放| 亚洲毛片免费看| 97碰碰视频| 国产精品原创视频| 91精品国产色综合久久不卡98| fc2ppv国产精品久久| 国产亚洲精品91在线| 天天操天天操天天操| 91精选在线观看| 中文字幕在线观看视频免费| 亚洲大片在线观看| 欧美在线视频第一页| 欧美激情一二三区| 一区二区三区少妇| 成人一区二区在线观看| 色噜噜狠狠一区二区三区狼国成人| 一本色道久久综合亚洲精品不卡| 青青草免费在线视频观看| 欧美综合视频| 日本亚洲导航| 曰本一区二区三区视频| 精品国产乱码久久久久久郑州公司| 狂野欧美xxxx韩国少妇| 成人网欧美在线视频| 国产精品美女午夜爽爽| 国产aⅴ夜夜欢一区二区三区 | av中文字幕一区二区三区| 亚洲精品97久久| 成人午夜视频一区二区播放| 91麻豆精品国产91久久久久| 国产又粗又猛又黄又爽| 欧美色成人综合| 中文在线免费看视频| 在线观看91精品国产入口| 69国产精品视频免费观看| 精品久久久久久久久久久久| 国产成年人免费视频| 亚洲第一主播视频| 久草国产精品视频| 欧美日韩国产中文字幕 | 黄色网在线播放| www日韩欧美| 国产淫片在线观看| 欧美老肥婆性猛交视频| 欧美xxxxhdvideosex| 欧美国产日韩二区| 国产一二三在线| 热99久久精品| 日韩av首页| 国产一区视频在线播放| 国产精品视频一区二区三区综合 | 韩国精品美女www爽爽爽视频| 91九色美女在线视频| 国产综合在线看| 亚洲精品成人图区| 国产成人短视频| 久久精品超碰| 99视频在线免费观看| 欧美精品国产白浆久久久久| 久久亚洲高清| 日韩欧美国产精品综合嫩v| 亚洲 欧洲 日韩| 欧美三级小说| 免费毛片小视频| 免费看欧美美女黄的网站| 在线观看岛国av| 国产**成人网毛片九色 | 国产精品成人一区二区不卡| 熟女熟妇伦久久影院毛片一区二区| 欧美另类专区| 91九色在线观看视频| 青娱乐精品视频在线| 亚洲国产日韩在线一区| av电影一区二区| 日本黄色激情视频| 一区二区三区国产精品| 亚洲精品中文字幕乱码三区91| 欧美色爱综合网| 丰满肉嫩西川结衣av| 亚洲人成啪啪网站| a篇片在线观看网站| 青草青草久热精品视频在线网站| 欧美日韩卡一| 国产一区二区三区黄| 日韩激情图片| 免费看黄在线看| 麻豆视频一区二区| 制服丝袜第一页在线观看| 欧美精彩视频一区二区三区| 青青草原在线免费观看视频| 欧洲亚洲国产日韩| 高清国产mv在线观看| 在线日韩精品视频| av资源网在线播放| 成人深夜直播免费观看| 免费观看不卡av| 国产午夜精品视频一区二区三区| 日韩有码一区二区三区| 折磨小男生性器羞耻的故事| 国产精品久久久久永久免费观看 | 欧美成熟毛茸茸复古| 欧美久久影院| 爱爱爱爱免费视频| 国产亚洲精品精华液| 国产精品19乱码一区二区三区| 欧美日韩亚洲丝袜制服| 色鬼7777久久| 久久久免费在线观看| 精品视频91| 亚洲精品日韩成人| 翔田千里一区二区| 日韩免费高清一区二区| 一区二区三区四区在线播放| www.亚洲激情| 亚洲欧美在线一区二区| 成年人黄色大片在线| 懂色中文一区二区三区在线视频| 欧美电影免费播放| 我要看一级黄色大片| 久久一留热品黄| 午夜精品久久久久久久久久久久久蜜桃| 欧美一卡2卡三卡4卡5免费| 毛片在线播放a| 国产精品久久久久久久久久免费| 亚洲第一福利社区| 亚洲自偷自拍熟女另类| 91视频在线看| 日韩av电影网| 亚洲丁香婷深爱综合| 丰满大乳少妇在线观看网站| 国产高清精品一区二区三区| 午夜精品网站| 亚洲国产日韩在线一区| 亚洲精品成人悠悠色影视| www.午夜激情| 韩国国内大量揄拍精品视频| 国产成人一二片| 黄色国产一级视频| 99视频一区二区三区| 欧美一二三区视频| 精品夜色国产国偷在线| 肉色欧美久久久久久久免费看| 久久精品人成| 日韩精品亚洲一区二区三区免费| 美女爆乳18禁www久久久久久| 91国产精品成人| av资源在线观看免费高清| 成人国产精品av| 欧美午夜精品| www.17c.com喷水少妇| 亚洲国产毛片aaaaa无费看| 人妻一区二区三区四区| 欧美亚洲第一区| 成人同人动漫免费观看| 四季av一区二区三区| 亚洲伦理在线精品| 蜜桃视频久久一区免费观看入口| 国内精品久久久久久久久| 精品按摩偷拍| 国产v亚洲v天堂无码久久久 | 国产成人久久精品77777最新版本| 好吊色视频在线观看| 日韩国产高清视频在线| 欧亚一区二区| 99精品视频网站| 不卡的av在线| 中文精品久久久久人妻不卡| 久久深夜福利免费观看| 成人资源在线| jizz欧美激情18| 亚洲欧美日韩人成在线播放| 欧美一区二区三区激情| 国产福利精品在线| 一级欧洲+日本+国产| 国产又黄又粗又猛又爽的视频| 欧美中文字幕一区| 99在线播放| 欧美精品一区二区视频| 激情图片小说一区| 亚洲第一精品在线观看| 久久伊人精品视频| 日韩欧美四区| 日韩成人av免费| 天天综合网 天天综合色| 色综合久久久久综合一本到桃花网| 国产精品久久久久久久天堂第1集| 免费看亚洲片| 欧美人妻精品一区二区三区| 亚洲片av在线| 97久久亚洲| 免费一区二区三区在线观看| 午夜国产精品影院在线观看| 三区四区电影在线观看| 精品国产乱码久久久久软件 | 欧美性xxxxxxxx| 国产偷倩在线播放| youjizz.com亚洲| 国产亚洲精品aa午夜观看| 农村少妇久久久久久久|