使用canvas实现动态更新的折线图

最近正在做一个uniapp项目,其中需要画一个两根折线的折线图,但是要求刷新速度快,差不多2ms要刷新一次数据,折线图也需要及时更新。一开始我使用echarts去做,根本刷新不过来,摁暂停按钮时,也卡的一批,后面我又尝试uchart,chart.js,anychart,但是他们都渲染不过来,抽样也想过,但业务不允许。最后没办法,只能自己用canvas自己写一个。

rendjs

rendjs是一种运行在试图层的js,具体是什么我也不清楚,可以去官网看看。我主要是看重他可以在视图层操作dom,可以提高视图性能。

renderjs | uni-app官网 (dcloud.net.cn)icon-default.png?t=N2N8https://uniapp.dcloud.net.cn/tutorial/renderjs.html

 初始化

            //初始化
			initLine(){
				//主要是为了拿到HTMLCanvasElement 和 CanvasRenderingContext2D用来操作我们的画布
				//之所以这样写,是因为如果直接getElementById,无法拿到它的上下文,也就是说getContext将失效
				const content = document.getElementById('LineChart')
				canvasEle = document.createElement('canvas')
				content.appendChild(canvasEle)
				context = canvasEle.getContext('2d');
				console.log(canvasEle);
				console.log(context);
				
				//设置线宽
				context.lineWidth = 10;
				//将两条初始化的折线画出来
				this.drawLine(pointArr1);
				this.drawLine(pointArr2);
			},

绘画函数

drawLine(pointArr){
				//将画笔的起点移到初始点
				context.moveTo(0,canvasEle.height - pointArr[0]);
				for (var i = 1; i < pointArr.length; i++) {
					//从上一个点连线至目标点
					context.lineTo(50*i,canvasEle.height - pointArr[i]);
					
				}
				//开始画图
				context.stroke();
			}

接口函数

Lineupdate(num){
				// console.log("3")
				//防止server初始化时,context不存在
				if(typeof(context) == "undefined"){
					return ;
				}
				//数组更新数值
				pointArr1.shift();
				pointArr1.push(num[0]);
				pointArr2.shift();
				pointArr2.push(num[1]);
				//更新画布
				canvasEle.height = 200;
				canvasEle.width = 200;
				// console.log("4")
				//画出这更新后的线
				this.drawLine(pointArr1);
				this.drawLine(pointArr2);
			}

完整代码

<template>
	<view>
		<canvas id="LineChart" width="400px" height="400px" :prop="num" :change:prop="LineChart.Lineupdate(num)"></canvas>
	</view>
	
</template>

<script>
	export default {
		data(){
			return {
				num: [50,80]
			}
		},onLoad() {
			this.test();
		},
		methods: {
			test(){
				setInterval(()=>{
					this.$data.num[0] = Math.random()*100;
					this.$data.num[1] = Math.random()*100;
				},2)
			}
		}
	}
</script>

<script module = "LineChart" lang="renderjs">
	let context;
	let canvasEle;
	let pointArr1 = [80,90,100,90,120];
	let pointArr2 = [60,70,120,100,150];
	export default {
		data(){
			return{
				
			}
		},
		mounted(){
			this.initLine();
		},
		methods:{
			//初始化
			initLine(){
				//主要是为了拿到HTMLCanvasElement 和 CanvasRenderingContext2D用来操作我们的画布
				//之所以这样写,是因为如果直接getElementById,无法拿到它的上下文,也就是说getContext将失效
				const content = document.getElementById('LineChart')
				canvasEle = document.createElement('canvas')
				content.appendChild(canvasEle)
				context = canvasEle.getContext('2d');
				console.log(canvasEle);
				console.log(context);
				
				//设置线宽
				context.lineWidth = 10;
				//将两条初始化的折线画出来
				this.drawLine(pointArr1);
				this.drawLine(pointArr2);
			},
			Lineupdate(num){
				if(typeof(context) == "undefined"){
					return ;
				}
				pointArr1.shift();
				pointArr1.push(num[0]);
				pointArr2.shift();
				pointArr2.push(num[1]);
				canvasEle.height = 200;
				canvasEle.width = 200;
				this.drawLine(pointArr1);
				this.drawLine(pointArr2);
			},
			drawLine(pointArr){
				
				//将画笔的起点移到初始点
				context.moveTo(0,canvasEle.height - pointArr[0]);
				for (var i = 1; i < pointArr.length; i++) {
					//从上一个点连线至目标点
					context.lineTo(50*i,canvasEle.height - pointArr[i]);
					
				}
				//开始画图
				context.stroke();
			}
		}
	}
</script>

<style>
</style>

 

 效果真的很好!!

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Canvas 游戏开发是一种使用 HTML5 Canvas 元素来创建和呈现游戏的方法。Canvas 是一个 HTML5 元素,允许开发者通过 JavaScript 进行绘图操作。通过使用 Canvas,你可以创建各种类型的游戏,包括 2D 和 3D 游戏。 Canvas 游戏开发的优势在于它具有跨平台的能力,可以在不同的设备上运行,包括桌面电脑、移动设备和平板电脑。相比之前的 Flash 技术,Canvas 游戏开发更加灵活和友好,同时也提供了更多的细节和流畅度。 在 Canvas 游戏开发中,你可以利用 JavaScript 和 HTML5 的功能来实现各种功能,包括图形绘制、动画效果、用户交互和游戏逻辑等。你可以编写自定义的代码来控制游戏的行为和展示效果。 一些常见的 Canvas 游戏开发应用包括: 1. 2D 游戏:Canvas 可以被用来制作各种类型的 2D 游戏,包括像素风格游戏、平台游戏、射击游戏等。 2. 可视化数据图表:Canvas 可以用于绘制各种数据图表,比如柱状图、折线图、饼图等,这在数据分析和可视化方面非常有用。 3. 广告制作:Canvas 可以实现动态广告制作,用于网页 banner 广告的展示和交互。 4. 未来走向预测:Canvas 还可以用于模拟器开发、远程计算机、图形编辑器和纯 Canvas 移动应用的开发。 如果你对 Canvas 游戏开发感兴趣,你可以学习相关的技术和工具,例如 JavaScript、HTML5、CSS 和 Canvas API 等。通过学习这些技术,你可以逐步掌握 Canvas 游戏开发的基本原理和操作方法。参考中提到的游戏《保卫家园》和中的数独游戏实例,可以帮助你更好地理解 Canvas 游戏开发的过程和实际应用。 希望你能在学习 Canvas 游戏开发的过程中享受乐趣,并不断提升自己的技能和创造力。祝你好运!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值