熟悉TWaver的用户都知道Group的概念,如果是Group,那必然会出现一个网元在多组的情况,最近有客户遇到这个问题,给写了Demo,这些也跟大家分享一下如何实现,先让我们看看共享网元的效果。

熟悉TWaver的用户知道添加到Group中的网元,这些网元的父亲都是这个Group,既然称之为父亲,那当然一个网元只能有一个父亲,那么实现Group共享网元的效果就不能用Parent的属性来实现了。我们来分析一下在TWaver里体现一个网元属于某个Group,就是这个网元画在Group内,而Group的范围是由它的children的位置决定的,上面说了实现Group共享网元的效果是不能通过父子关系来实现的,那么我们就要从计算Group范围的地方入手,只要让Group不仅仅考虑它children的位置,也考虑需要共享的网元位置,就可以了,那么这个思路是否可行,让我们试试。
在TWaver中network在获取Group范围的方法是调用groupChildrenRectsFunction方法,这个方法默认只计算Group的children,那么根据上面的分析我们就重写这个方法,也添加上需要共享的网元。DataBox中网元很多,那么哪些网元需要共享呢,我们就给需要共享的网元添加一个自定义属性shared,如果需要共享值为TRUE,参考下面代码
1 |
network.groupChildrenRectsFunction = function(group:Group, network:twaver.network.Network):ICollection { |
2 |
var rects:ICollection = new Collection(); |
3 |
for(var i:int = 0; i < group.childrenCount; i++){ |
4 |
var child:IElement = group.children.getItemAt(i); |
6 |
var ui:twaver.network.ui.ElementUI = network.getElementUI(child); |
8 |
rects.addItem(new Rectangle(ui.x, ui.y, ui.measuredWidth, ui.measuredHeight)); |
12 |
var box:ElementBox = network.elementBox; |
13 |
box.forEach(function(e:Element){ |
14 |
if(e.getClient('shared')){ |
15 |
var ui:twaver.network.ui.ElementUI = network.getElementUI(e); |
17 |
rects.addItem(new Rectangle(ui.x, ui.y, ui.measuredWidth, ui.measuredHeight)); |
然后看看实现效果


上下点击,貌似实现了,看来我们的思路是正确的,刚进入页面共享的网元是现实的,但选中Group后,共享网元被覆盖了,TWaver老用户知道了,我们该用Layer了,还有一个问题截图中我们看到上面的Group总是覆盖下面的Group,那如何解呢?好解,我们设置Group的透明度吧,见下面代码
1 |
var group:Group = new Group(); |
2 |
group.addChild(HAProxy1); |
3 |
group.addChild(HAProxy2); |
5 |
group.setStyle(Styles.GROUP_SHAPE, Consts.SHAPE_OVAL); |
6 |
group.setStyle(Styles.GROUP_FILL_ALPHA,0.5); |
9 |
var group1:Group = new Group(); |
10 |
group1.addChild(HAProxy3); |
11 |
group1.addChild(HAProxy4); |
12 |
group1.expanded = true; |
13 |
group1.setStyle(Styles.GROUP_SHAPE, Consts.SHAPE_OVAL); |
14 |
group1.setStyle(Styles.GROUP_FILL_ALPHA,0.5); |
15 |
elementBox.add(group1); |
17 |
var layer:Layer = new Layer(100); |
18 |
var HAProxy5:Node = createNode("HAProxy5", "HAProxyIcon", new Point(180,280), Consts.POSITION_BOTTOMLEFT); |
19 |
HAProxy5.setClient('shared', true); |
20 |
HAProxy5.layerID = layer.id; |
21 |
var HAProxy6:Node = createNode("HAProxy6", "HAProxyIcon", new Point(400,280), Consts.POSITION_BOTTOMRIGHT); |
22 |
HAProxy6.setClient('shared', true); |
23 |
HAProxy6.layerID = layer.id; |
24 |
elementBox.layerBox.add(layer); |
再看看效果:

暮然回首,效果实现了,但是不要高兴太早,如果移动网元,你会发现移动Group的孩子Group的大小会随之改变,但是移动共享的网元,只有选择了Group后,Group才回改变,如果你有需求的话,那就要添加上监听当网元的location变化后重绘network,参考代码
1 |
elementBox.addDataPropertyChangeListener(function(e:PropertyChangeEvent):void{ |
2 |
if(e.property == "location"){ |
3 |
network.invalidateElementUIs(); |
这下完成了,各位看官可以下载附近中Demo,拖拖拽拽试试效果,附件下载后放在TWaver Demo中,替换原来的文件可运行
LinkEditorDemo
- 多路径配置vlome group共享存储,VG的更新。
1. PV的概念: a) 一块物理磁盘一块物理硬盘在被LVM管理时被称为“物理卷”. b) 在LVM能对其进行管理之前需要在硬盘上产生一些特殊的数据结构,这个过程就是建立 ...
- iOS应用程序间共享数据
我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等.虽然我们不能直接通过文件系统来 ...
- App Extension Today
App Extensions 是iOS8新开放的扩展机制,之后不断增加功能.App Extension Programming Guide: Today 不喜欢废话,直接上干货! 一:重要概 ...
- WWDC2014之App Extensions学习笔记
一.关于App Extensions extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制. extension的出现,为用户 ...
- iOS8中添加的extensions总结(四)——Action扩展
Action扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutorials> 1.准备 本次教程利用网站bitly.com进行 bit ...
- RabbitMQ和Kafka到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...
- fork()相关的源码解析
fork()的真正执行采用的是do_fork()函数,所以下文将从do_fork()函数对fork()进行源码解析.下图是do_fork()的源码函数设计: 从上图我们可以看到do_fork()涉及到 ...
- launch 文件的写法
1. launch文件的写法 ❀标签 ☺<node> 启动一个节点 ☺ <param> 设置参数服务器的参数 ☺ < ...
- Git 的 WindowsXP安装
文章1: http://blog.sina.com.cn/s/blog_5063e4c80100sqzq.html 一.安装必要客户端 1. TortoiseGit http://tortoisegi ...
随机推荐
- HDU 5428 分解质因数
The F ...
- 【OI】简单的分块
介绍下简单的分块: 当我们遇到区间类问题的时候,如何保证我们快速而高效地完成操作? 答案是线段树分块. 所谓分块,就是把一个序列分成许多块分别维护.是不是想起了树状数组 这样能大大提高效率: 例如,我 ...
- HDU 5763Another Meaning
Another Meaning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 从service启动activity startActivity慢 的解决方案
Intent intent = new Intent(context, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Pendin ...
- jQuery.uploadify文件上传组件实例讲解
1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...
- 并不对劲的bjwc d4t1
先膜一波宽神Orz%%%%% 拿到这题的第一反应就是:暴力啊!感觉神奇的钟点并没有什么性质,可能卡常能过吧……所以就写了一个O(22^3*59^3)的暴力.本来想打表,但是发现代码长度有限制,写不下. ...
- vue商品详情页添加动画(eg)
<template> <div class="food" transition="move"></div> </tem ...
- git stash 切换分支以后 恢复
场景: 我在A分支开发 突然要去B分支改东西 但是A分支还没开发完 B又比较着急 又不想提交A 但是不提交又切换不到B 于是就发现有个git stash 将当前修改(未提交的代码)存入缓存区,切换分支 ...
- 关于mfc添加热键
对于mfc的添加热键的文章已经有很多了,我这里就简单的说一下并且说一些可能出的错误 首先在资源文件中添加ACCELERATOR然后在资源文件下的RC中找到ACCELERATOR的节点,打开后可以发现一 ...
- python2行代码调用程序
import win32api win32api.ShellExecute(0, 'open', r'C:\Users\TOPFEEL\AppData\Local\Postman\app-5.5.0\ ...