最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

HTML5 Canvas 繪制股市走勢圖

  發(fā)布時(shí)間:2023-04-25 16:48:47   作者: 劉煎蛋   我要評論
分時(shí)大盤回顧功能是一種用于分析股票行情的工具,本文就介紹一下HTML5 Canvas 繪制股市走勢圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

分時(shí)大盤回顧功能是一種用于分析股票行情的工具,在多個(gè)股票軟件中都有應(yīng)用。通過這個(gè)功能,用戶可以查看一段時(shí)間內(nèi)大盤的走勢圖以及漲跌停數(shù)量對比,并回放歷史數(shù)據(jù)。在這個(gè)過程中,用戶可以暫停、播放、拖動時(shí)間軸等操作,以便在復(fù)盤時(shí)更好地分析市場走勢。

效果

實(shí)現(xiàn)思路

  • 分時(shí)大盤回顧中,一天有240個(gè)數(shù)據(jù)點(diǎn)。我使用變量currentIndex從0開始配合定時(shí)器不斷疊加切換數(shù)據(jù),在每次清空重繪Canvas時(shí)達(dá)到視覺動畫效果;暫停、啟動、拖動時(shí)間軸等操作均通過控制currentIndex變量完成。
  • 紅色的矩形提示有一個(gè)緩緩加載的效果,主要是利用rgba將最后一個(gè)值從0提升到1的一個(gè)過程。
  • 在模擬器上,當(dāng)拖動時(shí)間軸時(shí),界面不會卡頓。但是在真機(jī)上,拖動時(shí)間軸會導(dǎo)致界面卡頓的問題。為了解決這一問題,我增加了一個(gè)節(jié)流,稀釋了執(zhí)行頻率,以此來降低拖動時(shí)間軸所產(chǎn)生的負(fù)荷。

啟動、暫停

  • 啟動時(shí),將paused置為true。然后,清空畫布并疊加currentIndex,接著重新進(jìn)行繪制并開啟定時(shí)器,重復(fù)上述操作。當(dāng)currentIndex大于等于數(shù)據(jù)長度時(shí),就終止定時(shí)器。
  • 暫停時(shí)將paused置為false即可。
play() {
    const { node } = this;
    if (!this.data.paused) return false;
    if (this.currentIndex >= this.data.list.length - 1) {
        this.triggerEvent('endEvent');
        clearTimeout(this.time);
        return false;
    }
    this.ctx.clearRect(0, 0, node.width, node.height);
    this.currentIndex += 1;
    this.startDraw();
    this.time = setTimeout(this.play.bind(this), 16.667);
},

繪制矩形

矩形文字居中處理方法

首先,使用ctx.measureText(text)方法獲取文字的實(shí)際寬度,然后根據(jù)Canvas的大小和文字的寬度計(jì)算出文字左上角在Canvas中的坐標(biāo)。具體來說,將Canvas的寬度除以2,減去文字寬度的一半,即可得到文字左上角的橫坐標(biāo);將Canvas的高度除以2,加上文字高度的一半,即可得到文字左上角的縱坐標(biāo)。

var text = "Hello world!";
var width = ctx.measureText(text).width;
var height = 20; // 假設(shè)文字高度為20px
ctx.font = `${height}px Arial`;
var x = canvas.width / 2 - width / 2;
var y = canvas.height / 2 + height / 2;
ctx.fillText(text, x, y);

矩形緩入效果

要實(shí)現(xiàn)Canvas中矩形的透明度從0到1的出現(xiàn)過程,可以使用rgba的最后一個(gè)值來控制矩形的透明度,并在每一幀更新矩形的顏色和位置來實(shí)現(xiàn)矩形的淡入效果。具體實(shí)現(xiàn)步驟如下:

  • opacity設(shè)置為0,樣整個(gè)矩形就是完全透明的。
  • 在每一幀的requestAnimationFrame()調(diào)函數(shù)中,先清空畫布(使用clearRect()方法),然后更新矩形的顏色。
  • 每一次更新矩形時(shí),透明度增加一個(gè)較小的值,如0.01,當(dāng)透明度變?yōu)?時(shí)停止動畫。
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");

var x = canvas.width / 2 - 50; // 矩形位于屏幕中央
var y = canvas.height / 2 - 50;
var width = 100;
var height = 100;
var speed = 2; // 矩形移動速度
var opacity = 0; // 矩形初始透明度為0

function drawRect() {
    ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空畫布
    ctx.fillStyle = `rgba(254,82,105, ${opacity})`;
    ctx.fillRect(x, y, width, height); // 繪制矩形

    opacity += 0.01; // 每幀透明度增加0.01,從而使矩形緩慢淡入屏幕
    if (opacity >= 1) {
        cancelAnimationFrame(animation); // 矩形完全進(jìn)入Canvas后停止動畫
    } else {
        requestAnimationFrame(drawRect); // 繼續(xù)更新狀態(tài)
    }
}

var animation = requestAnimationFrame(drawRect); // 開始動畫循環(huán)

時(shí)間軸拖動

在拖動圓點(diǎn)時(shí)最主要的就是計(jì)算當(dāng)前拖到了哪個(gè)時(shí)間點(diǎn),將計(jì)算結(jié)果賦值給currentIndex畫布再重新繪制,從而實(shí)現(xiàn)拖動回放的效果。

this.throttle(() => {
    const { ctx2, ctx, canvas2, minTime, node } = this;
    const x = e.touches[0].x;
    this.currentIndex = Math.floor(Math.max(minTime, Math.min(240, x / canvas2.width * (240 - minTime))));
    ctx.clearRect(0, 0, node.width, node.height);
    ctx2.clearRect(0, 0, canvas2.width, canvas2.height);
    this.startDraw()
}, 16.667)

currentIndex計(jì)算說明

  • x / canvas2.width獲取用戶在Canvas上觸摸的x坐標(biāo)除以Canvas的寬度,得到用戶在橫向上的百分比。
  • x / canvas2.width * (240 - minTime)將用戶在橫向上的百分比乘以最大幀數(shù)和最小幀數(shù)之差,得到時(shí)間線上的位置(總共240幀,minTime為最小時(shí)間)。
  • Math.min(240, ...)將上一步計(jì)算出的時(shí)間線上的位置與240取最小值,確保時(shí)間線上的位置不會超過最大幀數(shù)。
  • Math.max(minTime, ...)將上一步計(jì)算出的時(shí)間線上的位置與最小時(shí)間取最大值,確保時(shí)間線上的位置不會低于最小幀數(shù)。
  • Math.floor(...)將上一步計(jì)算出的時(shí)間線上的位置向下取整,得到整數(shù)幀數(shù)。

總結(jié)

到此這篇關(guān)于HTML5 Canvas 繪制股市走勢圖的文章就介紹到這了,更多相關(guān)HTML5 Canvas股市走勢圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

丹寨县| 鲜城| 庆城县| 抚远县| 那曲县| 青海省| 平乡县| 九龙城区| 伽师县| 嘉荫县| 巴林左旗| 宜兰市| 雅江县| 柘荣县| 朝阳市| 台南县| 昌邑市| 红桥区| 凤庆县| 梅河口市| 民乐县| 麻城市| 彭水| 安仁县| 永宁县| 夏邑县| 兰考县| 静乐县| 大新县| 二连浩特市| 湖南省| 右玉县| 临颍县| 兴仁县| 文安县| 永春县| 三门峡市| 修文县| 绿春县| 寻甸| 襄垣县|