可视化布局模块开发分享

在历经两年多的迭代后,Odeon大数据平台在底层能力建设上已经相当丰满。最近大半年来在数据可视化方面也投入了很大的精力,目前自助 BI 产品也已经成功上线并稳定运行了一段时间,今天小剧就来分享下我们在数据可视化中的一些经验。

今天的分享主要围绕 可视化布局模块 的一些工作,布局模块是承载可视化图表的一块画布,是用户用来组织业务逻辑的重要手段之一。先来体验下 在线demo 或者看下面的效果图:

图一:可视化布局模块效果图

效果图

一、为什么要开发可视化布局组件 ?

其实不管是在数据可视化,还是在一些自助发布的运营平台,自助布局一直是一个难以跳过的问题。在项目开始之初这个问题也同样在困扰着我们,是我们开发几套预置模版让用户挑选,还是开发一套让用户可拖拽配置的布局模块?

前者实现上非常简单,也很容易设计的非常精美,但是缺少了很多灵活性,很容易千篇一律。后者用户在使用上自由度非常高,可以拖拽出更符合自己预期的界面,但是开发成本相对较高,并且想要达到稳定、易用、高辅助性却比较难。

综合考虑上面的这些问题,我们对制定的几套方案均不满意,最终还是决定自己动手实现一个可以辅助用户进行拖拽布局的组件。

二、我们是怎么做的 ?

经过设计,我们对交互模型做了梳理,设计了卡片、图表两层结构。在此基础上对数据模型做了整体设计,结合上面效果图和 在线 demo 可以更加容易理解下面的划分。

首先是局部范围内单例的 Map 类,用来描述整个 dashboard 布局,以及其他数据存储。

其次是 Widget 类,用来定义卡片信息,包含卡片的尺寸、位置信息,以及更详细的卡片标题、卡片类型、脚注、图表ID 等信息。

最后是 Chart 类,用来定义图表信息。为了布局与图表模型分离,这里的图表信息放置较少,仅仅存储了必要的 id 等字段,图表本身实现由外部 slot 插槽来完成。

图二:数据模型

数据模型

三、交互如何处理 ?

数据模型构建好了,接下来就是着手设计拖拽交互了。

出于响应式考虑,同时为了减少用户操作的随意性,在布局设计上我们放弃了像素单位,而是针对节点尺寸设计了虚拟的 12 栅格切分,在初始化、缩放、移动时都严格参照此栅格布局。

为了保障用户拖拽体验的顺畅,使布局保持整齐,我们在遵循卡片自动调整逻辑的基础上,设计了卡片的重绘流程,这一点在后面会有详细的介绍。

为了提供更好的拖拽体验,我们额外设计了虚拟卡片用来辅助用户进行布局,用户随时可以预览松开鼠标后卡片处在的位置及大小,效果如下图阴影处所示。

图三:拖拽预览效果图

辅助布局

四、有哪些困难点 ?

有上面的数据模型设计,其实一大半的困难已经被解决了。难点主要体现在辅助布局过程中易用性上的一些处理,总结下来有以下几点。

1、碰撞检测如何处理

其实单纯的碰撞检测是很容易解决的,毕竟所有卡片只是二维矩形而已,这一点并不是难事,困难的是碰撞后被接触的卡片需要腾出位置进行让位,我们需要找到所有被碰撞到的卡片,以及受此卡片影响的所有后续卡片,这是一个较为困难的点。

图四:碰撞检测布局重绘过程

拖拽碰撞检测

2、自动吸顶效果如何实现

在设计布局的过程中,用户可能会把卡片拖得七零八落,而且在上面提到的碰撞检测的处理过程中,也会导致相邻卡片受影响。初期的交互在体验后发现,拖拽过程中用户需要花很长时间来重新整理布局,因此为了保证布局排列紧密,必须要有一个方法,能够将所有处于悬空状态的卡片依序吸顶处理。

图五:自动吸顶布局重绘过程

拖拽碰撞检测

五、如何处理这两个问题 ?

上面提到的这两个困难点,在移动、缩放这两个拖拽交互中都存在,并且逻辑上是一致的,因此在拖拽布局过程中我们抽象出了一套重绘逻辑,按顺序整理如下:

  • 1、碰撞检测,找出拖拽过程中与当前卡片相重叠的卡片,可能会多个卡片与之接触;
  • 2、圈选影响范围,也就是图四左侧所示,递归找到受碰撞的卡片影响的所有卡片,去重处理;
  • 3、临时让位,如图四右侧所示,所有将受影响的卡片做相同幅度向下移位处理,用来容纳被拖拽的卡片;
  • 4、自动吸顶,图五部分所示,需要自动处理所有卡片,逻辑是卡片上方如有可用空间,则自动吸附上去。

因为拖拽需要实时预览效果,上面这四步重绘逻辑会被频繁触发。为了避免在布局过程中反复污染真实的位置数据,我们为卡片位置我们引入了 previewOffset 字段,用来存放预览效果时的垂直偏移量。

可能会有同学会产生一个疑问:这里是业务上的重绘逻辑,如此高密度的修改数据会不会在性能上表现比较差 ?

其实这个问题的解决得益于 Widget 类 的数据模型设计,在从碰撞检测到自动吸顶等一系列处理过程中,被频繁计算、修改的仅仅为相对单位的 position 对象,而界面布局使用的是绝对单位的 screenPosition 对象。数据与表现是分离的,仅当一个重绘流程结束之后才去触发 screenPosition 的更新,如此设计使得界面更新节奏更可控,界面更稳定,避免了视觉上卡片位置的闪烁的问题。

按照此重绘逻辑,既避免了 dom 层冗余的重绘开销,提高了整体性能,又在界面布局的易用性上得到大大提升,操作体验上也更加稳定、流畅。


本文主要从可视化布局模块的交互逻辑的设计上展开,并未涉及到具体代码实现,作为 Odeon 大数据平台在可视化布局模块的一些思路,相信通过本文您已经有了初步的了解。

如果您对文中提到的碰撞检测、让位处理、吸顶效果以及辅助布局中等具体实现细节感兴趣,欢迎私下进行探讨,可能的话我会另开一篇文章详细展开来聊。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • 被别人指责、否定、批评、评判,是一件让人很不爽的事情。很多鸡汤学家在教人"修行",如何修得不愤怒。 我认为这是一个...
    nickyong阅读 3,635评论 0 5
  • 十一假期已经过去五天了,自己的拖延,真的一点都没变。本来计划的满满当当的假期,都在电视剧、食物的一次次诱惑下亮出了...
    沙砾_Grit阅读 243评论 0 0
  • 速写究竟如何练习? 用什么素材练习? 何老师用旅行青蛙示范给大家看! 快来看视频吧! 今天的主题是:速写旅行青蛙 ...
    何天衢绘画老师阅读 579评论 0 2