熟悉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);
5         if(child is Node){
6             var ui:twaver.network.ui.ElementUI = network.getElementUI(child);
7             if(ui != null){
8                 rects.addItem(new Rectangle(ui.x, ui.y, ui.measuredWidth, ui.measuredHeight));
9             }
10         }
11     }
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);
16             if(ui != null){
17                 rects.addItem(new Rectangle(ui.x, ui.y, ui.measuredWidth, ui.measuredHeight));
18             }
19         }
20     });
21     return rects;
22 };

然后看看实现效果


上下点击,貌似实现了,看来我们的思路是正确的,刚进入页面共享的网元是现实的,但选中Group后,共享网元被覆盖了,TWaver老用户知道了,我们该用Layer了,还有一个问题截图中我们看到上面的Group总是覆盖下面的Group,那如何解呢?好解,我们设置Group的透明度吧,见下面代码

1 var group:Group = new Group();
2 group.addChild(HAProxy1);
3 group.addChild(HAProxy2);
4 group.expanded = true;
5 group.setStyle(Styles.GROUP_SHAPE, Consts.SHAPE_OVAL);
6 group.setStyle(Styles.GROUP_FILL_ALPHA,0.5);
7 elementBox.add(group);
8  
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);
16  
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();
4     }
5 });

这下完成了,各位看官可以下载附近中Demo,拖拖拽拽试试效果,附件下载后放在TWaver Demo中,替换原来的文件可运行
LinkEditorDemo

Group共享网元的更多相关文章

  1. 多路径配置vlome group共享存储,VG的更新。

    1.  PV的概念: a)        一块物理磁盘一块物理硬盘在被LVM管理时被称为“物理卷”. b)        在LVM能对其进行管理之前需要在硬盘上产生一些特殊的数据结构,这个过程就是建立 ...

  2. iOS应用程序间共享数据

    我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等.虽然我们不能直接通过文件系统来 ...

  3. App Extension Today

     App Extensions 是iOS8新开放的扩展机制,之后不断增加功能.App Extension Programming Guide: Today   不喜欢废话,直接上干货!   一:重要概 ...

  4. WWDC2014之App Extensions学习笔记

    一.关于App Extensions extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制. extension的出现,为用户 ...

  5. iOS8中添加的extensions总结(四)——Action扩展

    Action扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutorials> 1.准备 本次教程利用网站bitly.com进行 bit ...

  6. RabbitMQ和Kafka到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...

  7. fork()相关的源码解析

    fork()的真正执行采用的是do_fork()函数,所以下文将从do_fork()函数对fork()进行源码解析.下图是do_fork()的源码函数设计: 从上图我们可以看到do_fork()涉及到 ...

  8. launch 文件的写法

    1. launch文件的写法 ❀标签          ☺<node> 启动一个节点          ☺ <param> 设置参数服务器的参数          ☺ < ...

  9. Git 的 WindowsXP安装

    文章1: http://blog.sina.com.cn/s/blog_5063e4c80100sqzq.html 一.安装必要客户端 1. TortoiseGit http://tortoisegi ...

随机推荐

  1. charset='utf8mb4'

    charset='utf8mb4' conn = pymysql.connect(host=h, port=pt, user=u, passwd=p, db=db, charset='utf8mb4' ...

  2. docker 基本指令

    sudo docker info 查看docker状态. jiqing@ThinkPad:~$ sudo docker info [sudo] password for jiqing: Contain ...

  3. 从Linux内核中获取真随机数

    内核随机数产生器 Linux内核实现了一个随机数产生器,从理论上说这个随机数产生器产生的是真随机数.与标准C库中的rand(),srand()产生的伪随机数不同,尽管伪随机数带有一定的随机特征,但这些 ...

  4. RDA 重现率

    文件目录: timing_info/AspectRatioOverscan&TimingTool/Aspect_Ratio_Overscan&Timing_Tool_330.xls 重 ...

  5. 如何在linux 32位机器编译64位程序

    编译64位程序,不一定要编译机器是64位的,但是32位机器默认安装的gcc编译环境还是不能用来编译64位程序. 编译64位程序,需要加上-m64编译器参数,默认安装的gcc已经支持该参数,但是缺少64 ...

  6. 基于Spark和Tensorflow构建DCN模型进行CTR预测

    实验介绍 数据采用Criteo Display Ads.这个数据一共11G,有13个integer features,26个categorical features. Spark 由于数据比较大,且只 ...

  7. 【js】JavaScript parser实现浅析

    最近笔者的团队迁移了webpack2,在迁移过程中,笔者发现webpack2中有相当多的兼容代码,虽然外界有很多声音一直在质疑作者为什么要破坏性更新,其实大家也都知道webpack1那种过于“灵活”的 ...

  8. [转]深入C语言内存区域分配(进程的各个段)详解

    一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text).数据段(data ...

  9. Oracle 参考脚本

    一.创建物化视图 --新建表空间 CREATE TABLESPACE MLOG_TBS LOGGING DATAFILE 'mlog_tbs.dbf' SIZE 32M AUTOEXTEND ON N ...

  10. 24 C#的类和对象

      类是C#面向对象编程的基本单元.一个类都可以包含2种成员:字段和方法. 1)类的字段代表类中被处理的数据(变量): 2)类的方法代表对这些数据的处理过程或用于实现某种特定的功能,方法中的代码往往需 ...