HTML5数据列分组,HTML5数据可视化第三弹:萌萌哒拓扑图分组

2023-11-23 00:10

本文主要是介绍HTML5数据列分组,HTML5数据可视化第三弹:萌萌哒拓扑图分组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近忙着给客户折腾一个复杂的多层嵌套关系。客户一句话“要好看!”,哥就忙白了头啊,还好最终搞定了。

需求描述

先简单描述下这次客户的需求。

现实应用中,网络拓扑图结构可能很简单,也可能非常复杂。

比如这种节点较多的单层拓扑:

a4c26d1e5885305701be709a3d33442f.png

稍复杂一些的:

a4c26d1e5885305701be709a3d33442f.png

再复杂一些的:

a4c26d1e5885305701be709a3d33442f.png

在这些拓扑图中常见的场景是,很多网络节点需要组成一组,这常被称为“网元组”。一般来说,网元组会有一个形状,双击可以展开/闭合。如下图:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

这次客户的需求中,最大的难点就是需要有五层网元组的嵌套,五层同时展开时,要求清晰美观。常规的分组形状有圆形、矩形、平行四边形等,无论哪种形状,分组多了后,就会产生审美疲劳。比如,我让设计师mm简单地把五层嵌套画个图,它看起来会是这样:

a4c26d1e5885305701be709a3d33442f.png

我把这个图给客户看了以后,客户表示希望“结构能够更加清晰”。那天,魔都大雨倾盆,我抓耳挠腮一个下午,终于有了一些灵感。

颜色

怎样才能使得结构效果更加清晰?我想到的是用颜色。颜色永远是图形设计里面的第一要素。如果分组颜色千篇一律,自然就看不太清楚包含关系。但是颜色太多五颜六色,显然也不符合电信UI系统的风格。那颜色要如何设置呢?层层嵌套的分组,层层……叮!你有没有想到一种蔬菜?

a4c26d1e5885305701be709a3d33442f.png

(此处哼唱“如果你可以一层一层一层地剥开我的心……”一百遍……)

这颗大洋葱看上去层次分明,是因为它的颜色从内到外有一定规律的变化:渐变。说到渐变,又想起最近GF推荐的一枚游戏,大概内容是按照颜色的渐变规律来排列一些方块。(很无聊有没有?)

a4c26d1e5885305701be709a3d33442f.png

不过,前端设计中,配色倒是很重要的一个环节。

总之,想好了用渐变的配色来使嵌套组更清晰后,就大胆地尝试一下:

var group=newtwaver.Group();

group.setStyle('group.fill.color', style[3]);

group.setStyle('group.deep',0);

group.setStyle('group.outline.width', style[1]);

group.setStyle('group.outline.color', style[0]);

group.setStyle('group.shape','roundrect'); group.setStyle('select.style','none');

group.setStyle('vector.outline.pattern', style[2]);

group.setStyle('label.font','14px "Microsoft Yahei"');

group.setStyle('whole.alpha',0.8);

group.setStyle('group.padding',-10);

group.setStyle('label.position','topright.topleft');

group.setName(name);

group.setLocation(100+150*level,300);

box.add(group);

数据量更大的时候,看看分组是不是会更加清晰?

a4c26d1e5885305701be709a3d33442f.png

更多颜色

这个图做出来之后,拿给周围几个同事看,大家纷纷表示不错,但是似乎有一些死板,不够生动。生动。。那就是要活灵活现的,于是我继续抓耳挠腮,又想到了一些瓜果蔬菜:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

果然还是配色不够明艳啊。我又让设计师mm给找了几个色值调整了一下:

a4c26d1e5885305701be709a3d33442f.png

折角

有了写花瓣层叠的感觉,是不是舒服多了?不过,方方正正的组的形状,还是太死板,缺乏立体感。看到桌子上的一张折了角的白纸,突然有了灵感。

给方形的组做一个折角效果,不知效果如何。要做这个效果,就要重写group的绘制,自己接管2d绘制了。Group的形状将不再是一个矩形,而是一个切角的矩形。

//draw round rect body.var roundRadius=10;

ctx.save();

ctx.beginPath();

ctx.moveTo(rect.x+roundRadius, rect.y);

ctx.lineTo(rect.x+rect.width-60, rect.y);

ctx.lineTo(rect.x+rect.width, rect.y+28);

ctx.lineTo(rect.x+rect.width, rect.y+rect.height-roundRadius);

ctx.quadraticCurveTo(rect.x+rect.width, rect.y+rect.height, rect.x+rect.width-roundRadius, rect.y+rect.height);

ctx.lineTo(rect.x+roundRadius, rect.y+rect.height);

ctx.quadraticCurveTo(rect.x, rect.y+rect.height, rect.x, rect.y+rect.height-roundRadius);

ctx.lineTo(rect.x, rect.y+roundRadius);

ctx.quadraticCurveTo(rect.x, rect.y, rect.x+roundRadius, rect.y);

ctx.save();

ctx.shadowOffsetX=4;

ctx.shadowOffsetY=4;

ctx.shadowBlur=4;

ctx.shadowColor="#555555";

ctx.fill();

ctx.restore();

ctx.lineWidth=node.getStyle('group.outline.width');

ctx.strokeStyle=node.getStyle('group.outline.color');

ctx.stroke(); ctx.restore();

通过绘制一个带圆角的矩形并切掉一个角,stroke到画布上。看看效果:

a4c26d1e5885305701be709a3d33442f.png

再通过增加圆角、切角、增加阴影、设置不同的边框线宽,让分组进一步产生“层层递进”的感觉。现在就剩下画折角的细节了。

折角这里,需要画一个被折下来的直角三角形。三角形的颜色,应该是“纸”的背面颜色。这里小心定义三角形的形状,并进行填充:

//draw corlor.ctx.fillStyle=node.getStyle('group.outline.color'); ctx.lineWidth=node.getStyle('group.outline.width');

ctx.lineJoin='bevel';

ctx.beginPath();

ctx.moveTo(rect.x+rect.width-60, rect.y);

ctx.lineTo(rect.x+rect.width-23-10, rect.y+47-10);

ctx.quadraticCurveTo(rect.x+rect.width-23, rect.y+46, rect.x+rect.width-23+10, rect.y+47-10);

ctx.lineTo(rect.x+rect.width, rect.y+28);

ctx.closePath();

ctx.save();

ctx.shadowOffsetX=4;

ctx.shadowOffsetY=4;

ctx.shadowBlur=4;

ctx.shadowColor="#777777";

ctx.fill(); ctx.restore();

ctx.strokeStyle=node.getStyle('group.outline.color');

ctx.stroke();

效果如下,立体感出来以后,是不是生动了很多?

a4c26d1e5885305701be709a3d33442f.png

这里要注意的是,折角的阴影也要设置,并且填充要使用和边框相同的颜色,增加“折纸”的立体感。

小细节

折纸效果有了,不过左侧上方略显空旷,于是利用canvas的2d来练练手,画个path看看:

ctx.save();

ctx.strokeStyle='#27A3DA';

ctx.lineWidth=2;

ctx.beginPath();

ctx.moveTo(rect.x+31, rect.y+5);

ctx.lineTo(rect.x+25, rect.y+20);

ctx.bezierCurveTo(rect.x+25, rect.y+26, rect.x+28, rect.y+28, rect.x+32, rect.y+23);

ctx.lineTo(rect.x+42, rect.y-2);

ctx.bezierCurveTo(rect.x+42, rect.y-12, rect.x+32, rect.y-10, rect.x+32, rect.y-5);

ctx.lineTo(rect.x+29, rect.y-1);

ctx.shadowOffsetX=1;

ctx.shadowOffsetY=1;

ctx.shadowBlur=1;

ctx.shadowColor="#aaaaaa";

ctx.stroke();

ctx.restore();

运行一下,你猜是神马?

a4c26d1e5885305701be709a3d33442f.png

哈哈,一个小回形针瞬间跃然纸上了,感觉萌萌哒!为了增加立体感,回形针也是要设置阴影的,不过偏移不要太大、颜色要淡一些,像这样:

a4c26d1e5885305701be709a3d33442f.png

适当明艳的色彩,加上折角、阴影和小回形针,这回这个层层嵌套总算是清晰又好看了吧?

运行一下,拖拖拽拽,因为之前已经做了不少图标、线条的样式,所以总体效果还是很不错的!

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

后记

之前也说,HTML5的canvas,虽然已经不是什么新鲜技术了,但当技术本身不再有壁垒,我们更应该注重的是实际业务中的应用,比如在画这种组织结构关系非常复杂的拓扑图时,如何让图形更加清晰、易懂,让技术真正落到实处。如果你有更加好的这类拓扑图的解决方案,也可以和我联系交流:tw-service@servasoft.com

这篇关于HTML5数据列分组,HTML5数据可视化第三弹:萌萌哒拓扑图分组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413909

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)