日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue+canvas實現數據實時從上到下刷新瀑布圖效果(類似QT的)

瀏覽:17日期:2022-09-30 18:18:23

話不多說了,先上一張Demo圖,實現的功能有:左側圖例、右側瀑布圖、鼠標移入彈出當前坐標對應的數據信息(有優化的空間,大家自由發揮)。

vue+canvas實現數據實時從上到下刷新瀑布圖效果(類似QT的)

圖例使用到的插件

這里推薦使用安裝npm插件colormap

瀑布圖主體內容

這里不多做解釋了,都是一些原生標簽還有vue綁定的事件,可以根據實際項目情況自己封裝成組件,我這里是寫在一起的。

<template> <div><div class='content'> <div class='neirong'><!--圖例--><div class='legend'> <canvas ref='legend'></canvas></div><!--瀑布圖--><div ref='waterFallContent' @mousemove='waterFallMove($event)' @mouseleave='waterFallLeave'> <canvas ref='waterFall'></canvas> <!--鼠標移入彈出框--> <div ref='tip' class='tip'></div></div> </div></div> </div></template>

這里是用到的Data數據

colormap:顏色庫 legend:圖例 waterFall:瀑布圖 waterFallList:瀑布圖源數據 waterFallIndex:瀑布圖定時器用到的計數標識 waterFallCopyList:瀑布圖二維數組(用來顯示數據做的臨時儲存) waterFallIntervals:瀑布圖定時器 waterFallWidth:瀑布圖的寬度(后端返回的數據length) waterFallHeight:瀑布圖定高度(也可以理解成渲染次數 例如30次渲染完成) maxNum:圖例最大值 minNum:圖例最小值

<script> export default {name: 'index',data() { return {colormap: [],legend: null,waterFall: null,waterFallList: [],waterFallIndex: 0,waterFallCopyList: [],waterFallIntervals: null,waterFallWidth: 0,waterFallHeight: 0,maxNum: 10,minNum: 0 }},

下面是具體的方法,寫的比較粗略,大家湊活看吧,覺得有用的大家拿走,不足之處自由發揮修改

方法調用這就不解釋了,離開頁面銷毀定時器。

mounted() { let dx = this dx.setColormap() dx.createLegendCanvas() dx.queryChartList()},destroyed() { let dx = this clearInterval(dx.waterFallIntervals)},創建顏色庫

這個地方具體看上面插件的官網有詳細的介紹

setColormap() { let dx = this let colormap = require(’colormap’) dx.colormap = colormap({ colormap: ’jet’, nshades: 150, format: ’rba’, alpha: 1, })},創建圖例

createLegendCanvas() {let dx = thislet legendRefs = dx.$refs.legenddx.legend = legendRefs.getContext(’2d’)let legendCanvas = document.createElement(’canvas’)legendCanvas.width = 1let legendCanvasTemporary = legendCanvas.getContext(’2d’)const imageData = legendCanvasTemporary.createImageData(1, dx.colormap.length)for (let i = 0; i < dx.colormap.length; i++) { const color = dx.colormap[i] imageData.data[imageData.data.length - i * 4 + 0] = color[0] imageData.data[imageData.data.length - i * 4 + 1] = color[1] imageData.data[imageData.data.length - i * 4 + 2] = color[2] imageData.data[imageData.data.length - i * 4 + 3] = 255}legendCanvasTemporary.putImageData(imageData, 0, 0)dx.legend.drawImage(legendCanvasTemporary.canvas, 0, 0, 1, dx.colormap.length, 50, 0, 200, dx.legend.canvas.height) },創建瀑布圖

createWaterFallCanvas() {let dx = thislet waterFall = dx.$refs.waterFalldx.waterFall = waterFall.getContext(’2d’)waterFall.width = dx.waterFallWidthwaterFall.height = dx.$refs.waterFallContent.offsetHeight },繪制單行圖像

rowToImageData(data) {let dx = thisif (dx.$refs.waterFallContent !== undefined) { let canvasHeight = Math.floor(dx.$refs.waterFallContent.offsetHeight / dx.waterFallHeight) let imgOld = dx.waterFall.getImageData(0, 0, dx.waterFallWidth, canvasHeight * dx.waterFallIndex + 1) const imageData = dx.waterFall.createImageData(data.length, 1) for (let i = 0; i < imageData.data.length; i += 4) {const cindex = dx.colorMapData(data[i / 4], 0, 130)const color = dx.colormap[cindex]imageData.data[i + 0] = color[0]imageData.data[i + 1] = color[1]imageData.data[i + 2] = color[2]imageData.data[i + 3] = 255 } for (let i = 0; i < canvasHeight; i++) {dx.waterFall.putImageData(imageData, 0, i) } dx.waterFall.putImageData(imgOld, 0, canvasHeight)} },返回數據對應的Colormap顏色

colorMapData(data, outMin, outMax) {let dx = thisif (data <= dx.minNum) { return outMin} else if (data >= dx.maxNum) { return outMax}return Math.round(((data - dx.minNum) / (dx.maxNum - dx.minNum)) * outMax) },鼠標移入瀑布圖

waterFallMove(event) {let dx = thislet dataWidth = (dx.$refs.waterFallContent.offsetWidth / dx.waterFallWidth).toFixed(2)let dataHeight = (dx.$refs.waterFallContent.offsetHeight / dx.waterFallHeight).toFixed(2)let x = Math.floor(event.offsetX / dataWidth)let y = Math.floor(event.offsetY / dataHeight)try { dx.$refs.tip.innerHTML = ’數值:’ + JSON.parse(JSON.stringify(dx.waterFallCopyList[y][x])) let xx = event.offsetX + 5 let yy = event.offsetY - 20 if (event.offsetX > 1300) {xx = event.offsetX - 160yy = event.offsetY - 20 } dx.$refs.tip.style.position = ’absolute’ dx.$refs.tip.style.left = xx + ’px’ dx.$refs.tip.style.top = yy + ’px’ dx.$refs.tip.style.display = ’block’} catch (e) { dx.$refs.tip.style.display = ’none’} },鼠標移出瀑布圖

waterFallLeave() {let dx = thisdx.$refs.tip.style.display = ’none’ },瀑布圖假數據模擬

queryChartList() {let dx = thisdx.waterFallWidth = 1500dx.waterFallHeight = 30let data = []for (let i = 0; i < 1500; i++) { data.push(Math.floor(Math.random() * (20 - 1)) + 1)}if (dx.waterFall === null) { dx.createWaterFallCanvas(data.length)}dx.rowToImageData(data)dx.waterFallCopyList.unshift(data)dx.waterFallIndex++if (dx.waterFallIndex > dx.waterFallHeight) { dx.waterFallCopyList.pop()}dx.waterFallIntervals = setTimeout(() => { dx.queryChartList()}, 1000) },

樣式代碼

.neirong {width: 1800px;height: 100%;margin: 80px auto;display: flex;justify-content: center; } .legend {width: 25px;height: 500px; } canvas {width: 100%;height: 100%; } .waterFall {width: 1500px;height: 500px;position: relative; } .tip {pointer-events: none;display: none;background-color: #0404049e;border-radius: 10px;color: #fff;padding: 10px;box-sizing: border-box; }

到這里這個Demo基本就是可以運行的,不會有任何報錯,代碼寫的不是很高級,我本人也是個初級的小菜鳥,也是第一次寫文章,希望大佬可以給出一些更好的建議我也會好好學習的,也希望那些遇到類似這個需求沒什么思路的小伙伴可以借鑒我的踩坑之旅,可以更快的成長起來。

到此這篇關于vue+canvas實現數據實時從上到下刷新瀑布圖效果(類似QT的)的文章就介紹到這了,更多相關vue+canvas實時刷新瀑布圖 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
风间由美中文字幕在线看视频国产欧美| 免费观看久久久4p| 亚洲2区在线| 99视频+国产日韩欧美| 日韩免费一区| 国产一区二区三区四区五区传媒| 香蕉久久国产| 国产精品毛片| 免费中文字幕日韩欧美| 国产毛片久久| 国产亚洲欧洲| 久久亚洲影院| 亚洲精品极品| 亚洲精品中文字幕99999| 蜜桃一区二区三区在线| 国产美女一区| 亚洲视频电影在线| 日本不卡不码高清免费观看| 亚洲毛片网站| 日本欧美大码aⅴ在线播放| 日韩av网站在线免费观看| 日本伊人久久| 国产亚洲观看| 免费看久久久| 正在播放日韩精品| 青青久久av| 亚洲精品一二三区区别| 9色精品在线| 亚洲精品精选| 国产极品一区| 欧美片第1页| 黑丝美女一区二区| 日本亚洲最大的色成网站www| 日本在线成人| 国产一区二区视频在线看| 久久久噜噜噜| 婷婷综合在线| 亚洲精品精选| 精品国产午夜肉伦伦影院| 欧美日韩视频网站| 国产一区导航| 国产乱人伦精品一区| 国产成人精品亚洲线观看| 少妇精品导航| 伊人久久大香伊蕉在人线观看热v| 日韩国产精品久久久久久亚洲| 日韩av在线免费观看不卡| 国产一区丝袜| 午夜久久99| 69堂精品视频在线播放| 色婷婷综合网| 蜜桃视频欧美| 日本成人在线网站| 98精品视频| 麻豆亚洲精品| 麻豆国产精品视频| 午夜久久久久| 国产精品99久久免费观看| 91精品国产91久久久久久黑人| 国产在线不卡| 欧美日本不卡| 亚洲一级网站| 国产精品色婷婷在线观看| 亚洲爱爱视频| 日韩欧美另类中文字幕| 97精品国产福利一区二区三区| 久久视频精品| 国产日韩中文在线中文字幕 | 欧美一级一区| se01亚洲视频 | 日韩高清在线不卡| 国产麻豆久久| 国产亚洲精品美女久久久久久久久久| 欧美日韩精品免费观看视欧美高清免费大片| 蜜桃视频一区二区三区| 国产aⅴ精品一区二区三区久久 | 成人三级高清视频在线看| 视频一区在线视频| 国产不卡一区| **爰片久久毛片| 国产精品av久久久久久麻豆网| 欧美一区二区三区免费看| jiujiure精品视频播放| 欧美激情99| 亚洲一二av| 国产亚洲一区二区手机在线观看 | 日本а中文在线天堂| 蜜臀精品一区二区三区在线观看 | 成人国产精品| 日韩国产在线不卡视频| 欧美日韩国产高清| 成人国产精品久久| 人人爱人人干婷婷丁香亚洲| 狠狠久久婷婷| 美女毛片一区二区三区四区最新中文字幕亚洲| 亚洲精品小说| 亚洲综合电影| 国产日韩一区二区三区在线播放| 日韩午夜av| 日韩欧美精品综合| 国产精品国码视频| 日韩精选在线| 老牛影视一区二区三区| 91精品一区二区三区综合| 精品三级在线观看视频| 国产欧美精品| 日韩精品亚洲专区在线观看| 黄色精品网站| 精品成人免费一区二区在线播放| 清纯唯美亚洲综合一区| 视频一区欧美精品| 日韩精品91| 国产粉嫩在线观看| 麻豆精品视频在线| 国产精区一区二区| 日韩av三区| 亚州av日韩av| 三级欧美韩日大片在线看| 欧美日韩激情在线一区二区三区| 欧美成a人免费观看久久| 日韩亚洲一区在线| 国模精品一区| 成人免费一区| 精品一区不卡| 日韩激情中文字幕| 日本色综合中文字幕| 综合激情视频| 亚洲狼人精品一区二区三区| 夜久久久久久| 黄色不卡一区| 日韩一区二区免费看| 欧美日韩国产免费观看视频| 亚洲小说欧美另类婷婷| 婷婷六月综合| 亚洲一区二区动漫| 亚洲一区免费| 蜜桃一区二区三区在线观看| 亚洲精品高潮| 欧美亚洲福利| 91嫩草精品| 午夜久久av | 国产高清视频一区二区| 国产精品永久| 国产精品黄色| 国产一区2区在线观看| 精品国产网站| 日韩国产在线| 2023国产精品久久久精品双| 91精品国产91久久久久久黑人| 亚洲一级高清| 玖玖玖国产精品| 亚洲精品精选| 国产精品2023| 日韩欧美1区| 亚洲欧美日韩国产综合精品二区 | 精品视频国产| 亚洲成人一区在线观看| 亚洲一区国产| 欧美另类中文字幕| 国产aⅴ精品一区二区三区久久| 色老板在线视频一区二区| 99国产精品久久久久久久| 亚洲伊人精品酒店| 91精品一区| 国产福利亚洲| 亚洲深夜视频| 伊人久久亚洲美女图片| 国产一区二区三区不卡av| 日韩成人亚洲| 欧美1区免费| 日本国产一区| 国产欧美高清| 国产一区二区三区免费在线| 福利一区在线| 1024精品久久久久久久久| 激情综合网址| 久久国产成人| 中文字幕乱码亚洲无线精品一区| 国产精品av一区二区| 深夜福利亚洲| 国产精品伦一区二区| 精品国产乱码久久久| 日韩国产一区二区三区| 欧美国产三级| 亚洲福利国产| 国产亚洲毛片| 日韩精品久久久久久久软件91| 欧美日韩一区二区三区不卡视频 | 日韩国产91| 免费在线观看一区| 日韩不卡在线| 亚洲欧美久久久| 欧美日韩亚洲一区| www在线观看黄色| jiujiure精品视频播放| 美女黄网久久| 欧美激情91| 偷拍精品精品一区二区三区| 一区二区精品| 国产精品日本一区二区不卡视频|