TWaver HTML5之树形布局
转眼间春节假期已经过完,作为一个职业的程序猿,不知道大家有没有这样的感觉,一天不碰电脑,总觉得生活少点什么。今天是春节后上班的第三天,给大家分享一下我们前段时间的一个需求,需求是这样的:界面中的网元分为不同的域,比如一级域,二级域,三级域,….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之树形布局的更多相关文章
- TWaver HTML5 (2D)----数据元素
概述 数据元素是数据模型的基本要素,用于描述图形网元,业务网元,或者纯数据.TWaver HTML5中所有数据元素都继承自twaver.Data.为不同功能的需求,预定义了三类数据类型:twaver. ...
- TWaver HTML5 (2D)--基本概念
基本概念 TWaver HTML5(以下简称TWaver)使用HTML5技术和javascript语言,可在支持HTML5的浏览器上进行绘图. 使用TWaver前,需熟悉几个基本概念:图元(Eleme ...
- web前端学习(二)html学习笔记部分(10)-- HTML5构建应用布局和页面
1.2.25 HTML5构建应用布局和页面 1.2.25.1 HTML5在移动开发中的准则 1.尽量使用单页面开发 2.慎重选择前端UI框架 3.动画.特效使用准则(60fps) 浏览器消耗最小的 ...
- 浅谈html5 响应式布局
一.什么是响应式布局? 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本. 这个概念是为解决移动互联 ...
- html5 响应式布局
一.什么是响应式布局? 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本. 这个概念是为 ...
- html5新标签布局应用指南
html5中为了便于设计者的网站布局新添加了一些标签,本文主要讲解这些标签的实际应用方法. 大多数前端的朋友在设计网站时主要应用<div>标签构造盒子进行布局,这是种非常高效的方法,可以将 ...
- html5 响应式布局(媒体查询)
响应式布局 响应式布局,简而言之,就是一个网站能够兼容多个终端--而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网浏览而诞生的. 响应式布局可以为不同终端的用户 ...
- HTML5+CSS3常见布局方式
1.等高布局 1.1 代码 等高布局是指子元素在父元素中高度相等的布局方式 <div class="father"> <div class="f1&qu ...
- 【浅谈html5 响应式布局之自动适应屏幕宽度】
允许网页宽度自动调整 “自适应网页设计”到底是怎么做到的?其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name=”viewport” content=”w ...
随机推荐
- RK3288][Android6.0] 调试笔记 --- 关闭按键音后无法录音问题【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/70052413 Platform: ROCKCHIPOS: Android 6.0Kernel ...
- MongoDB全文搜索——目前尚不支持针对特定field的搜索
> db.articles.createIndex( { subject: "text" } ) { "createdCollectionAutomatically ...
- 【BZOJ 3211&3038】 花神游历各国 & 上帝造题的七分钟2
[题目链接] [BZOJ 3211] 点击打开链接 [BZOJ 3038] 点击打开链接 [算法] 线段树 开根操作直接开到叶子节点,注意当区间中所有数都是0或1时,不需要开根 [代码] #inclu ...
- CentOS下网卡启动、配置等ifcfg-eth0教程
步骤1.配置/etc/sysconfig/network-scripts/ifcfg-eth0 里的文件. CentOS6.4 下的ifcfg-eth0的配置详情: [root@Jeffery]# v ...
- 07-11 Linux命令操作
1. 查看当做操作目录位置 > pwd 2. 查看(当前)目录里边的文件内容 > ls //list > ls -l 或ll ...
- 使用Advanced Installer14.3 简单打包windows窗体应用程序
1.新建项目工程(我使用的是企业版) 2.完善产品细节 3.应用程序文件夹 a.自动同步文件夹(也可以右键添加文件或文件夹) b.新建卸载快捷方式 c.卸载清理 4.安装参数 5.媒介配置 6.生成或 ...
- poj 2409 Let it Bead【polya定理+burnside引理】
两种置换 旋转:有n种,分别是旋转1个2个--n个,旋转i的循环节数位gcd(i,n) 翻转:分奇偶,对于奇数个,只有一个珠子对一条边的中点,循环节数为n/2+1:对于偶数个,有珠子对珠子和边对边,循 ...
- bzoj 4031: [HEOI2015]小Z的房间【矩阵树定理】
是板子题,因为mod不是质数所以需要辗转相除然而并不知道为啥 高斯消元部分还不知道原理呢--先无脑背过的 #include<iostream> #include<cstdio> ...
- 二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
题目传送门 /* 题意:问有几个区间最大值-最小值 < k 解法1:枚举左端点,二分右端点,用RMQ(或树状数组)求区间最值,O(nlog(n))复杂度 解法2:用单调队列维护最值,O(n)复杂 ...
- Java泛型Object和?区别
在写spark streamming读取kafka latest offset的时候,有一下语句: Map<TopicAndPartition, Object> latestOffsets ...