echarts:graph图表拖拽节点

需求:实现一个可视化编辑器,用户可以添加节点,并对节点进行拖拽编辑等

在这里插入图片描述
实现期间碰到很多问题,特意记录下来,留待将来碰到这些问题的同学,省去些解决问题的时间

问题1:节点的data如下,不使用直角坐标系一切正常,但使用直角坐标系时,节点怎么不见了?

series: [{type: 'graph',data: [{ name: '1', x: 0, y: 0}, { name: '2', x: 10, y: 10 }]
}]
解决方法:开启坐标系后,坐标要以数组的方式存到value中
series: [{type: 'graph',coordinateSystem: 'cartesian2d',data: [{ name: '1', value: [0, 0] }, { name: '2', value: [10, 10] }]
}]

问题2:怎么拖拽节点?并且获得节点拖拽的偏移量呢?

1、在配置项中允许节点拖拽:draggable: true

series: [{type: 'graph',draggable: true,
}]

2、监听鼠标按下和松开的事件,按下时获得拖拽动作的初始坐标,松开时获得拖拽动作的结束坐标,比较后获得节点的偏移量

let dragCoords = null
myChart.on('mousedown', (e) =>{dragCoords = [e.event?.offsetX, e.event?.offsetY]
});
myChart.on('mouseup', (e) =>{const { offsetX, offsetY } =  e.eventconsole.log('初始坐标:': dragCoords , '结束坐标:', [offsetX, offsetY] )
});

问题3:直接将坐标与偏移量进行加减,计算出来的坐标再赋值给节点,重新渲染后的节点位置与拖拽结束的位置不一样

原因: 出现这个问题,是因为坐标的数值与px的数值,它们只是一个正比例关系。

解决方法:
计算坐标轴的长度与屏幕可视区域宽高的比例,根据比例将节点在屏幕的偏移量转为在坐标系的偏移量。

举例: x轴刻度为1000,渲染在屏幕是500px,那么拖拽节点向右移动100px,节点的x坐标应该增加200

option: {xAxis: { show: true, type: 'value', min: -500, max: 500 },yAxis: { show: true, type: 'value', min: -1000, max: 0, },grid: {left: 0, right: 0, top: 50, bottom: 50,},
}

根据以上配置。可以得到:
x轴长度 = document.body.clientWidth
y轴长度 = document.body.clientHeight-50-50

当然,如果需求允许,设置grid.width=1000; grid.height=1000; 这样是最方便的,直接将坐标的数值与偏移量相加减,就可以得到新的坐标

  function updatePosition ( e: any) {if(!e.data.name || !dragCoords) returnconst [startX, startY] = dragCoords // 拖拽动作的初始位置const { offsetX, offsetY } =  e.event // 拖拽动作的结束位置const [ x, y ] = clip.value // 节点在坐标系内的坐标const { clientWidth, clientHeight } = document.body // 屏幕宽高。// x轴、y轴的刻度都1000// 根据option.grid的配置,x轴长度=clientWidth; y轴长度 = clientHeight - 50 - 50;// 将屏幕的偏移量数值,转为在坐标系中的偏移量数值const xCoord = x + (offsetX - startX) * 1000 / clientWidthconst yCoord = y - (offsetY - startY) * 1000 / (clientHeight-100)console.log('节点的新坐标:', [xCoord , yCoord ]);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177907.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的智能考勤机(论文+源码)

1.系统设计 本课题为基于单片机的智能考勤机,其整个系统由STC89C52单片机,RC522 RFID模块,LCD液晶,按键等构成,在功能上,本系统智能考勤机主要应用在校园生活中,用户可以通过按键注销/注销相应的…

ATECLOUD-POWER电源测试系统有什么特点?如何用它测试电源模块?

ATECLOUD-POWER电源测试系统 ATECLOUD-POWER是检测电源性能的自动化测试系统,针对电源模块各类测试项目提供定制方案,指导电源模块的设计和生产,保证电源的质量、稳定性和可靠性。该方案包括软件定制开发以及硬件设备选择两方面,根…

多种格式图片可用的二维码生成技巧,快来学习一下

将图片存入二维码是现在很常见的一种图片展现方式,有效的节省了图片占用内容空间以及获取图片内容的速度,所以现在会有很多人将不同的图片、照片生成二维码展示。如何使用图片二维码生成器来快速生成二维码呢?下面就让小编来给大家分享一下图…

【算法】最短路径——迪杰斯特拉 (Dijkstra) 算法

目录 1.概述2.代码实现2.1.节点类2.2.邻接矩阵存储图2.3.邻接表存储图2.4.测试 3.扩展3.1.只计算一对顶点之间的最短路径3.2.获取起点到其它节点具体经过的节点 4.应用 本文参考: LABULADONG 的算法网站 1.概述 (1)在图论中,最短…

应用架构的演进 I 使用无服务器保证数据一致性

在微服务架构中,一个业务操作往往需要跨多个服务协作完成,包含了读取数据和更新多个服务的数据同时进行。在数据读取和写入的过程中,有一个服务失败了,势必会造成同进程其他服务数据不一致的问题。 亚马逊云科技开发者社区为开发者…

2024年软件测试知识应运趋势

每一年,IT互联网技术都在变,那2024年,需要具备哪些知识,才能让我们在软件测试行业里混得风生水起呢? 我认为有以下十点: 1、Linux必备知识 Linux作为现在最流行的软件环境系统,一定需要掌握&am…

联邦学习研究综述笔记

联邦学习 联邦学习的定义:联邦学习是一种分布式机器学习架构,包含多个客户端(参与者)和一个聚合服务器。客服端(参与方):在本地使用自己的私有数据训练模型,训练完成之后将模型的参…

局域网监控软件哪个好丨真实测评反馈整理

局域网监控软件是一种专门用于监控局域网内电脑使用情况的软件,它可以帮助企业管理者更好地了解员工的工作状态和行为,提高工作效率和管理水平。 那么局域网监控软件哪个好呢?今天整理一下真实的测评。 以域之盾软件为例讲解: 域…

山西电力市场日前价格预测【2023-11-16】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-16)山西电力市场全天平均日前电价为29.16元/MWh。其中,最高日前电价为264.83元/MWh,预计出现在18: 00。最低日前电价为0.00元/MWh,预计出…

【功能栏】基于session的模拟短信注册功能

框架: spring boot mybatis-plus 目录 1.创建user表 ​编辑2. mybatis-plus插件 3.导入相关依赖 4.配置文件 5.前端代码 register.html style.css 6.后端代码 entity层 mapper层 sevice层 业务层接口 业务层实现类 controller层 7.调试 1. 未输…

uniapp Android如何打开常用系统设置页面?

uniapp Android 如何打开常用系统设置页面? 在使用App过程时,有时候会对一些权限获取,比如打开蓝牙、打开通知栏通知等设置,我们如何快速跳转到需要的设置页面? 文章目录 uniapp Android 如何打开常用系统设置页面&…

开发程序员的宝藏工具/网站

博主在这里收录各式各样的工具/网站,都是一些能够帮助开发、提高效率的好东西 博主会不断更新,更加欢迎大家把自己觉得好用的分享在评论区 记得收藏起来,免得以后找不到了 1.文本对比 在线文本差异对比,文本比对、文本比较工具 能够将两边的…