设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 50|回复: 15

HTML5 Canvas 绘制股市走势图

[复制链接]

1

主题

59

回帖

137

积分

注册会员

积分
137
发表于 2024-4-20 08:09:35 | 显示全部楼层 |阅读模式
前言

分时大盘回顾功能是一种用于分析股票行情的工具,在多个股票软件中都有应用。通过这个功能,用户可以查看一段时间内大盘的走势图以及涨跌停数量对比,并回放历史数据。在这个过程中,用户可以暂停、播放、拖动时间轴等操作,以便在复盘时更好地分析市场走势。
效果


实现思路

       
  • 分时大盘回顾中,一天有240个数据点。我使用变量
    1. currentIndex
    复制代码
    从0开始配合定时器不断叠加切换数据,在每次清空重绘Canvas时达到视觉动画效果;暂停、启动、拖动时间轴等操作均通过控制
    1. currentIndex
    复制代码
    变量完成。   
  • 红色的矩形提示有一个缓缓加载的效果,主要是利用rgba将最后一个值从0提升到1的一个过程。   
  • 在模拟器上,当拖动时间轴时,界面不会卡顿。但是在真机上,拖动时间轴会导致界面卡顿的问题。为了解决这一问题,我增加了一个节流,稀释了执行频率,以此来降低拖动时间轴所产生的负荷。
启动、暂停

       
  • 启动时,将
    1. paused
    复制代码
    置为true。然后,清空画布并叠加
    1. currentIndex
    复制代码
    ,接着重新进行绘制并开启定时器,重复上述操作。当
    1. currentIndex
    复制代码
    大于等于数据长度时,就终止定时器。   
  • 暂停时将
    1. paused
    复制代码
    置为false即可。
  1. play() {
  2.     const { node } = this;
  3.     if (!this.data.paused) return false;
  4.     if (this.currentIndex >= this.data.list.length - 1) {
  5.         this.triggerEvent('endEvent');
  6.         clearTimeout(this.time);
  7.         return false;
  8.     }
  9.     this.ctx.clearRect(0, 0, node.width, node.height);
  10.     this.currentIndex += 1;
  11.     this.startDraw();
  12.     this.time = setTimeout(this.play.bind(this), 16.667);
  13. },
复制代码
绘制矩形

矩形文字居中处理方法

首先,使用
  1. ctx.measureText(text)
复制代码
方法获取文字的实际宽度,然后根据Canvas的大小和文字的宽度计算出文字左上角在Canvas中的坐标。具体来说,将Canvas的宽度除以2,减去文字宽度的一半,即可得到文字左上角的横坐标;将Canvas的高度除以2,加上文字高度的一半,即可得到文字左上角的纵坐标。
  1. var text = "Hello world!";
  2. var width = ctx.measureText(text).width;
  3. var height = 20; // 假设文字高度为20px
  4. ctx.font = `${height}px Arial`;
  5. var x = canvas.width / 2 - width / 2;
  6. var y = canvas.height / 2 + height / 2;
  7. ctx.fillText(text, x, y);
复制代码
矩形缓入效果

要实现Canvas中矩形的透明度从0到1的出现过程,可以使用
  1. rgba
复制代码
的最后一个值来控制矩形的透明度,并在每一帧更新矩形的颜色和位置来实现矩形的淡入效果。具体实现步骤如下:
       
  • opacity设置为0,样整个矩形就是完全透明的。   
  • 在每一帧的
    1. requestAnimationFrame()
    复制代码
    调函数中,先清空画布(使用clearRect()方法),然后更新矩形的颜色。   
  • 每一次更新矩形时,透明度增加一个较小的值,如0.01,当透明度变为1时停止动画。
  1. var canvas = document.getElementById("myCanvas");
  2. var ctx = canvas.getContext("2d");

  3. var x = canvas.width / 2 - 50; // 矩形位于屏幕中央
  4. var y = canvas.height / 2 - 50;
  5. var width = 100;
  6. var height = 100;
  7. var speed = 2; // 矩形移动速度
  8. var opacity = 0; // 矩形初始透明度为0

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

  13.     opacity += 0.01; // 每帧透明度增加0.01,从而使矩形缓慢淡入屏幕
  14.     if (opacity >= 1) {
  15.         cancelAnimationFrame(animation); // 矩形完全进入Canvas后停止动画
  16.     } else {
  17.         requestAnimationFrame(drawRect); // 继续更新状态
  18.     }
  19. }

  20. var animation = requestAnimationFrame(drawRect); // 开始动画循环
复制代码
时间轴拖动

在拖动圆点时最主要的就是计算当前拖到了哪个时间点,将计算结果赋值给
  1. currentIndex
复制代码
画布再重新绘制,从而实现拖动回放的效果。
  1. this.throttle(() => {
  2.     const { ctx2, ctx, canvas2, minTime, node } = this;
  3.     const x = e.touches[0].x;
  4.     this.currentIndex = Math.floor(Math.max(minTime, Math.min(240, x / canvas2.width * (240 - minTime))));
  5.     ctx.clearRect(0, 0, node.width, node.height);
  6.     ctx2.clearRect(0, 0, canvas2.width, canvas2.height);
  7.     this.startDraw()
  8. }, 16.667)
复制代码
currentIndex计算说明

       
    1. x / canvas2.width
    复制代码
    获取用户在Canvas上触摸的x坐标除以Canvas的宽度,得到用户在横向上的百分比。   
    1. x / canvas2.width * (240 - minTime)
    复制代码
    将用户在横向上的百分比乘以最大帧数和最小帧数之差,得到时间线上的位置(总共240帧,minTime为最小时间)。   
    1. Math.min(240, ...)
    复制代码
    将上一步计算出的时间线上的位置与240取最小值,确保时间线上的位置不会超过最大帧数。   
    1. Math.max(minTime, ...)
    复制代码
    将上一步计算出的时间线上的位置与最小时间取最大值,确保时间线上的位置不会低于最小帧数。   
    1. Math.floor(...)
    复制代码
    将上一步计算出的时间线上的位置向下取整,得到整数帧数。
总结

到此这篇关于HTML5 Canvas 绘制股市走势图的文章就介绍到这了,更多相关HTML5 Canvas股市走势图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

3

主题

47

回帖

159

积分

注册会员

积分
159
发表于 2024-4-28 17:03:39 | 显示全部楼层
这个话题很有趣,我想多了解一些

1

主题

56

回帖

136

积分

注册会员

积分
136
发表于 2024-5-4 22:15:19 | 显示全部楼层
我们一起努力,共同解决问题吧。

0

主题

57

回帖

115

积分

注册会员

积分
115
发表于 2024-6-8 10:01:34 | 显示全部楼层
同意你的观点,我们有共鸣。

2

主题

52

回帖

150

积分

注册会员

积分
150
发表于 2024-7-3 03:29:56 | 显示全部楼层
能给个链接吗?我想深入了解一下。

1

主题

55

回帖

133

积分

注册会员

积分
133
发表于 2024-8-2 12:02:13 | 显示全部楼层
说得太好了,完全同意!

0

主题

52

回帖

107

积分

注册会员

积分
107

热心会员付费会员

发表于 2024-8-5 20:50:36 | 显示全部楼层
同意!

1

主题

30

回帖

78

积分

注册会员

积分
78
发表于 2024-8-7 12:17:15 | 显示全部楼层
666666666666

0

主题

52

回帖

103

积分

注册会员

积分
103
发表于 2024-8-31 09:33:38 | 显示全部楼层
牛逼

0

主题

54

回帖

108

积分

注册会员

积分
108
发表于 2024-9-1 13:13:38 | 显示全部楼层
这个话题很有趣,我想多了解一些
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 11:07 , Processed in 0.105350 second(s), 28 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表