转眼间春节假期已经过完,作为一个职业的程序猿,不知道大家有没有这样的感觉,一天不碰电脑,总觉得生活少点什么。今天是春节后上班的第三天,给大家分享一下我们前段时间的一个需求,需求是这样的:界面中的网元分为不同的域,比如一级域,二级域,三级域,….N级域,而且不同域之间会有连线。对于这个需求,按照常规的想法,使用group岂不是很简单,一级域是一个group,二级域也是一个group,二级域的group是一级域的父亲,以此类推。但是这样有个问题,如果域比较多,会造成group的过度嵌套,界面中group多了之后,不仅用户体验下降,而且会严重影响性能,所以倒不如直接用树,可以很直观的体现各个域之间的层级关系。

下面是布局的代码,代码很简单,相信熟悉twaver的人很容易看懂。

function layoutRing(){
//setup all group rings.
var groups={};
box.forEach(function(data){
if(data instanceof twaver.Node){
var node=data;
node.setClient('x', node.getLocation().x);
node.setClient('y', node.getLocation().y);
var groupName=data.getClient('group');
if(!groups[groupName]){
groups[groupName]=[];
}
var rings=groups[groupName];
var level=parseInt(node.getClient('level'));
if(rings.length<=level){
rings.push([]);
}
var ring=rings[level];
ring.push(node);
}
}); cleanConnections();
layouter.doLayout('topbottom'); for(var groupName in groups){
//get this group bounds.
var x1=undefined, y1=undefined, x2=undefined, y2=undefined;
var rings=groups[groupName];
for(var level=0;level<rings.length; level++){
var ring=rings[level];
for(var index=0;index<ring.length;index++){
var node=ring[index];
x1=x1 ? Math.min(x1, node.getLocation().x) : node.getLocation().x;
y1=y1 ? Math.min(y1, node.getLocation().y) : node.getLocation().y;
x2=x2 ? Math.max(x2, node.getLocation().x) : node.getLocation().x;
y2=y2 ? Math.max(y2, node.getLocation().y) : node.getLocation().y; var target=box.getDatas().get(Math.floor(Math.random()*box.size()));
if(target instanceof twaver.Node && target!==node){
var connection=new twaver.Link(node, target);
connection.setStyle('link.width',0.2);
connection.setStyle('link.color', '#aaaaaa');
connection.setClient('connection',true);
connection.setClient('angle', (target.getClient('angle')+node.getClient('angle'))/2);
box.add(connection);
}
}
}
var width=x2-x1;
var height=y2-y1; //layout each ring for this group.
for(var level=0;level<rings.length; level++){
var ring=rings[level];
for(var index=0;index<ring.length;index++){
var node=ring[index];
var radius=node.getLocation().y-y1;
var range=Math.PI*2;
var angle=(node.getLocation().x-x1)/width * range;
if(level>1 && (level==rings.length-1 || rings.length<4)){
angle=node.getParent().getClient('angle')+(angle-node.getParent().getClient('angle'))/3;
}
var x=radius*Math.cos(angle);
var y=radius*Math.sin(angle); node.setLocation(node.getClient('x'),node.getClient('y'));
node.setClient('angle', angle);
move(node, x, y);
}
}
}
}

  

布局中的可以加入动画效果,提升用户体验,关于动画的相关文档可以参考文档:

function move(node, x, y){
var x0=node.getClient('x');
var y0=node.getClient('y');
new twaver.Animate({
from: { x: x0, y: y0 },
to: { x: x, y: y },
type: 'point',
delay: 100,
dur: 1000,
easing: 'easeNone',
onUpdate: function (value) {
node.setLocation(value.x, value.y);
}
}).play();
}

如果有对这个示例感兴趣的朋友,可以发邮件索取相关代码,邮箱地址:jack.shangguan@servasoft.com

TWaver HTML5之树形布局的更多相关文章

  1. TWaver HTML5 (2D)----数据元素

    概述 数据元素是数据模型的基本要素,用于描述图形网元,业务网元,或者纯数据.TWaver HTML5中所有数据元素都继承自twaver.Data.为不同功能的需求,预定义了三类数据类型:twaver. ...

  2. TWaver HTML5 (2D)--基本概念

    基本概念 TWaver HTML5(以下简称TWaver)使用HTML5技术和javascript语言,可在支持HTML5的浏览器上进行绘图. 使用TWaver前,需熟悉几个基本概念:图元(Eleme ...

  3. web前端学习(二)html学习笔记部分(10)-- HTML5构建应用布局和页面

    1.2.25  HTML5构建应用布局和页面 1.2.25.1  HTML5在移动开发中的准则 1.尽量使用单页面开发 2.慎重选择前端UI框架 3.动画.特效使用准则(60fps) 浏览器消耗最小的 ...

  4. 浅谈html5 响应式布局

    一.什么是响应式布局? 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本. 这个概念是为解决移动互联 ...

  5. html5 响应式布局

    一.什么是响应式布局?       响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本. 这个概念是为 ...

  6. html5新标签布局应用指南

    html5中为了便于设计者的网站布局新添加了一些标签,本文主要讲解这些标签的实际应用方法. 大多数前端的朋友在设计网站时主要应用<div>标签构造盒子进行布局,这是种非常高效的方法,可以将 ...

  7. html5 响应式布局(媒体查询)

    响应式布局        响应式布局,简而言之,就是一个网站能够兼容多个终端--而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网浏览而诞生的.        响应式布局可以为不同终端的用户 ...

  8. HTML5+CSS3常见布局方式

    1.等高布局 1.1 代码 等高布局是指子元素在父元素中高度相等的布局方式 <div class="father"> <div class="f1&qu ...

  9. 【浅谈html5 响应式布局之自动适应屏幕宽度】

    允许网页宽度自动调整 “自适应网页设计”到底是怎么做到的?其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name=”viewport” content=”w ...

随机推荐

  1. MVC4中给TextBoxFor设置默认值和属性(同时设置js事件)

    例如:(特别注意在设置初始值的时候 Value 中的V要大写) @Html.TextBoxFor(model => model.CustomerCode, new { Value="  ...

  2. Ubuntu 16.04 + github page + hexo 搭建博客

    1. 安装nodejs:  sudo apt-get install nodejs-legacy 2.安装nvm :  wget -qO- https://raw.github.com/creatio ...

  3. POJ 1060:Modular multiplication of polynomials

    Modular multiplication of polynomials Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4 ...

  4. 洛谷 P2577 [ ZJOI 2005 ] 午餐 —— DP + 贪心

    题目:https://www.luogu.org/problemnew/show/P2577 首先,想一想可以发现贪心策略是把吃饭时间长的人放在前面: 设 f[i][j] 表示考虑到第 i 个人,目前 ...

  5. AIZU AOJ 2309 Vector Compression 最小树形图(朱—刘算法)

    题意简述:给定若干个相同维度的向量,寻找一种排序方法,使得所有向量的表示长度总和最低. 所谓表示长度为(Aj-r*Ai)^2,其中i<j  数据范围:向量总数和维度均小于100 思路:(1)首先 ...

  6. E20170527-ts

    asset   n. 资产,财产; 有价值的人或物; 有用的东西; 优点; serializer  [词典] 串行(化)器(把并行数据变成串行数据的寄存器); 编程语言中,可被序列化的; inflec ...

  7. Akka源码分析-Cluster-Metrics

    一个应用软件维护的后期一定是要做监控,akka也不例外,它提供了集群模式下的度量扩展插件. 其实如果读者读过前面的系列文章的话,应该是能够自己写一个这样的监控工具的.简单来说就是创建一个actor,它 ...

  8. 自动生成 html5 小页面

    StringBuilder htmltext = new StringBuilder();            try            {                //var readP ...

  9. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛-K-Matrix Multiplication(矩阵乘法)

    题目描述 In mathematics, matrix multiplication or matrix product is a binary operation that produces a m ...

  10. 编写UI自动化测试用例原则

    1.一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器.2.一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统3.尽量只做功能中正向逻辑的验证,不要考虑 ...