<!DOCTYPE html>
<html>
<head>
<title>Hello Qunee for HTML5</title>
<meta charset="utf-8">
</head>
<body>
<div style="height: 500px;" id="canvas"></div>
<script src="./qunee/qunee-min.js"></script>
<script type="text/javascript" src="./qunee/jquery.min.js"></script>
<!--<script src="http://demo.qunee.com/js/common/Overview.js"></script>-->
<script src="Overview.js"></script>
<script>
/**
* This file is part of Qunee for HTML5.
* Copyright (c) 2016 by qunee.com
**/
if (!window.getI18NString) {
getI18NString = function (s) {
return s;
}
} function FlowingSupport(graph) {
this.flowMap = {};
this.graph = graph;
} FlowingSupport.prototype = {
flowMap: null,
length: 0,
gap: 40,
graph: null,
addFlowing: function (edgeOrLine, count, byPercent) {
var flowList = this.flowMap[edgeOrLine.id];
if (!flowList) {
flowList = this.flowMap[edgeOrLine.id] = [];
this.length++;
}
count = count || 1;
while (--count >= 0) {
// 这里的图片可以自己设置flow.png
var ui = new Q.ImageUI("flow.png");
ui.layoutByPath = true;
ui.position = {x: 0, y: 0};
ui.size = {width: 20};
ui.renderColor = "#F00";
flowList.push(ui);
flowList.byPercent = byPercent;
edgeOrLine.addUI(ui);
}
},
removeFlowing: function (id) {
var flowList = this.flowMap[id];
if (!flowList) {
return;
}
var edgeOrLine = this.graph.getElement(id);
if (edgeOrLine) {
flowList.forEach(function (ui) {
edgeOrLine.removeUI(ui);
})
}
this._doRemove(id);
},
_doRemove: function (id) {
delete this.flowMap[id];
this.length--;
},
timer: null,
perStep: 10,
stop: function () {
clearTimeout(this.timer);
},
start: function () {
if (this.timer) {
clearTimeout(this.timer);
}
var offset = 0;
var scope = this;
scope.timer = setTimeout(function A() {
if (!scope.length) {
scope.timer = setTimeout(A, 2000);
offset = 0;
return;
}
offset += 1;
for (var id in scope.flowMap) {
var ui = scope.graph.getUI(id);
if (!ui) {
scope._doRemove(id);
continue;
}
var lineLength = ui.length;
if (!lineLength) {
continue;
}
var flowList = scope.flowMap[id];
if (flowList.byPercent) {
var x = offset * 2;
var gap = 15;
scope.flowMap[id].forEach(function (ui) {
ui.position = {x: (x % 100) / 100, y: 0};
x += gap;
});
} else {
var x = offset * scope.perStep;
scope.flowMap[id].forEach(function (ui) {
ui.position = {x: x % lineLength, y: 0};
x += scope.gap;
});
}
scope.graph.invalidateUI(ui); //dashed line
var data = ui.data;
if (data instanceof Q.Edge) {
if (data.getStyle(Q.Styles.EDGE_LINE_DASH)) {
data.setStyle(Q.Styles.EDGE_LINE_DASH_OFFSET, -offset);
}
} else if (data instanceof Q.ShapeNode) {
if (data.getStyle(Q.Styles.SHAPE_LINE_DASH)) {
data.setStyle(Q.Styles.SHAPE_LINE_DASH_OFFSET, -offset);
}
}
}
scope.timer = setTimeout(A, 200);
}, 200);
}
};
// 创建画布
var graph = new Q.Graph(canvas);
// 创建图元
var hello = graph.createNode("Hello", -100, -50);
var qunee = graph.createNode("Qunee", 100, 50);
// 创建关系
var edge = graph.createEdge("Hello\nQunee", hello, qunee);
// 指定关系线的颜色
edge.setStyle(Q.Styles.EDGE_COLOR, "#2898E0");
// 指定关系线是虚线,指定虚线的每一个线段的长度,和线段的数量,和虚线的距离等
edge.setStyle(Q.Styles.EDGE_LINE_DASH, [8, 4, 1, 4]);
// 指定虚线是90度的,而不是直线。
// edge.edgeType = Q.Consts.EDGE_TYPE_HORIZONTAL_VERTICAL; var flowingSupport = new FlowingSupport(graph);
// 下面的方式让关系线动起来
flowingSupport.addFlowing(edge, 3);
graph.callLater(function () {
flowingSupport.start();
}) function destroy() {
flowingSupport.stop();
} </script>
</body>
</html>

qunee 流动的关系的更多相关文章

  1. 美团客户端响应式框架EasyReact开源啦

    前言 EasyReact 是一款基于响应式编程范式的客户端开发框架,开发者可以使用此框架轻松地解决客户端的异步问题. 目前 EasyReact 已在美团和大众点评客户端的部分业务中进行了实践,并且持续 ...

  2. 互联网金融研究组:P2P借贷平台:性质、风险与监管(上)

    互联网金融研究组(): P2P借贷平台:性质.风险与监管(上) 目 录 一.性质与合法性 1.  P2P网络借贷 1.1  概念重新界定 1.2  发展概况与特点 2.  延伸模式及其合法性浅析 2. ...

  3. LGP7167题解

    考试的一道题,因为某些原因sb了常数翻了好几倍/px 首先我们发现,一个水池的水只会向它下边第一个直径比它大的水池流. 我们把这些流动的关系连边,很容易发现是一棵树. 问水最后会到哪个水池相当于在问最 ...

  4. java语言:Linux与JVM的内存关系分

    在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...

  5. 转: 关于Linux与JVM的内存关系分析

    转自: http://tech.meituan.com/linux-jvm-memory.html Linux与JVM的内存关系分析 葛吒2014-08-29 10:00 引言 在一些物理内存为8g的 ...

  6. 浅析ODS与EDW关系(转载)

    浅析ODS与EDW 关系 刘智琼 (中国电信集团广州研究院广州510630) 摘要 本文重点介绍了企业运营数据仓储(ODS)和企业数据仓库(EDW )的概念,并对ODS与EDW 之间的关系,包括两者相 ...

  7. Android 设计随便说说之简单实践(消息流动)

    在上面两篇分别说明了设计中较为简单也是很关键的实践点. 第一模块划分,它是根据每个模块所承载的业务,进行划分,是应用程序一个静态的描述. 第二合理组合,它是是将每个模块调动起来,共同实现业务,是一个准 ...

  8. Spark RDD概念学习系列之rdd的依赖关系彻底解密(十九)

    本期内容: 1.RDD依赖关系的本质内幕 2.依赖关系下的数据流视图 3.经典的RDD依赖关系解析 4.RDD依赖关系源码内幕 1.RDD依赖关系的本质内幕 由于RDD是粗粒度的操作数据集,每个Tra ...

  9. Linux与JVM的内存关系分析

    引言 在一些物理内存为8g的server上,主要执行一个Java服务,系统内存分配例如以下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m. 从表面 ...

随机推荐

  1. iptables基本命令到深入

    1.关闭firewalld,安装iptables-server并启动服务 systemctl stop firewalld systemctl disable firewalld yun -y ins ...

  2. ubuntu linux环境下安装配置jdk和tomcat

    关于linux搭建服务器,ubuntu中jdk和tomcat的安装和配置 一.jdk的安装配置 1:去官网下载好自己需要的版本,注意,linux压缩文件通常以tar.gz结尾,别下载错了.本次我下载安 ...

  3. Redis(1.1)linux下安装redis

    一.常见安装方式 [0]环境 OS:CentOS7.5 Redis:4.0.14 yum源:本地源 [1]检查安装 gcc 依赖环境 gcc -v#如果没安装会报错类似于 command not fi ...

  4. JS中的迭代

    for each...in 使用一个变量迭代一个对象的所有属性值.对于每一个属性值,有一个指定的语句块被执行. 作为ECMA-357(E4X)标准的一部分,for each...in语句已被废弃,E4 ...

  5. C++结构体、类和对象

    在C++中结构体(struct)和类(class)可以通用,[结构体是一种特殊的类] struct和class的区别:访问和控制. struct在缺省值的情况下可以是public在外部被访问到对于类来 ...

  6. Dijkstra(模板)

    #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...

  7. 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击

    题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...

  8. Java EE javax.servlet中的RequestDispatcher接口

    RequestDispatcher接口 public interface RequestDispatcher 一.介绍 定义一个对象,从客户端接收请求并将其发送到服务器上的任何资源(例如servlet ...

  9. charles 抓包 (一)

    在web.app开发中经常需要通过抓包来定位页面.接口返回数据的问题.在mac系统中,charles是一款功能丰富的抓包软件.可以实现app的数据抓包. 工具:charles 附送charles的破解 ...

  10. [转载]GridView中点击某行的任意位置就选中该行

    原文链接:http://www.cnblogs.com/Echo529/p/4521701.html GridView中点击某行的任意位置就选中该行 分类: 第一步:添加选择列 点击GridView右 ...