`
jklliang
  • 浏览: 40821 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Twave Flex实现自定义连线及附件

    博客分类:
  • flex
 
阅读更多


 

 

如上图,我们要实现中间两个飞机之间连线以及上面点的功能, 点如果采用twave的节点那么无法跟,线绑定所以方法是不可取的。

根据Twaver API有两种实现方式:

1.添加图标附加,图标附件可以添加多个,但是仅仅是一个图标没有其他更多的功能,比如图标上添加Label,以及添加tooltip,以及其他一些列鼠标事件。所以仅仅附件功能并不可取。

2.自定义Link和LinkUI.以及自定义更强大的附件。

我们现在采用第二种方式:

首先重写Link:

package com.zznode.iss.topo.gummonitor.components.common
{
	import twaver.Link;
	import twaver.Node;
	
	public class CLink extends Link
	{
		public function CLink(id:Object=null, fromNode:Node=null, toNode:Node=null)
		{
			//TODO: implement function
			super(id, fromNode, toNode);
		}
		
		override public function get elementUIClass():Class
		{
			return ClinkUI;
			
		}
		 
	}
}

 

自定义Link中关键的是引入了自定义的CLinkUI它是负责线呈现的,简单说Link是个数据人那么CLinkUI是人的外表具体什么样的外表需要ClinkUI来实现

2.重写LinkUI

package com.zznode.iss.topo.gummonitor.components.common
{
	import com.zznode.iss.common.components.topo.common.TopUtils;
	
	import flash.display.GradientType;
	import flash.display.Graphics;
	import flash.display.SpreadMethod;
	import flash.geom.Matrix;
	import flash.geom.Point;
	
	import mx.collections.ArrayCollection;
	
	import spark.components.Image;
	import spark.components.Label;
	
	import twaver.ICollection;
	import twaver.IData;
	import twaver.Link;
	import twaver.Node;
	import twaver.network.Network;
	import twaver.network.ui.LinkUI;
	
	public class ClinkUI extends LinkUI
	{
	
		public var attachmentDatas:ArrayCollection=new ArrayCollection();
		
		public var airattachments:ArrayCollection=new ArrayCollection();
		
		private var center:Point;
		
		private var contentCenter:Point;
		
		
		public function ClinkUI(network:Network, link:Link)
		{
			var serviceType:String=link.getClient(TopUtils.SERVICE_TYPE);
			var pArr:Array=serviceType.split("||");
			for each(var pdata:String in pArr){
				var pointStrArr:Array=pdata.split(",");
				var attachmenetData:Object=new Object();
				for each(var attribute:String in pointStrArr){
					var attS:Array=attribute.split(":");
					attachmenetData[attS[0]]=attS[1];
				}
				attachmentDatas.addItem(attachmenetData);
				var ariAttachment:AirAttachmentUI=new AirAttachmentUI();
				ariAttachment.data=attachmenetData;
				ariAttachment.width=200;
				ariAttachment.height=60;
				airattachments.addItem(ariAttachment);
			}
			super(network, link);
			
		}
		
		override public function checkAttachments():void
		{			
			super.checkAttachments();
			super.checkLinkHandlerAttachment();
			//this.checkLinkBundleAttachment();
		}
		public var fp:Point;
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
			super.updateDisplayList(unscaledWidth,unscaledHeight);
			//将fromPoint和toPoint转为本地坐标
			fp=this.contentToGlobal(new Point(0,0));
			for each(var att:AirAttachmentUI in airattachments){
				att.xRelativeValue=att.data.Xlocation-this.fromPoint.x;
				att.x=this.fromPoint.x-fp.x-att.width/2+att.xRelativeValue+this.link.fromNode.width/2;
				att.y=this.fromPoint.y-fp.y-(att.height-att.icon.height/2);
			}
			
		}
		override protected function drawBody(g:Graphics):void{
			
			var g:Graphics = this.graphics;  
			
			g.clear();  
			//边框 可以有
			g.lineStyle(1, 0xC0C0C0,0.5);  
			g.drawRect( this.fromPoint.x,this.fromPoint.y-2.5, this.toPoint.x-this.fromPoint.x, 5);   
			//画填充
			var fillType:String = GradientType.LINEAR;  
			var colors:Array = [0x8FCA39, 0xC0C0C0,0x5AC2FD];  
			var alphas:Array = [1, 0,1];  
			var ratios:Array = [0x32, 0x89, 0xFF]; 
			var matr:Matrix = new Matrix();  
			
			//matr.createGradientBox(50, 50, Math.PI / 4, 0, 0);
			matr.createGradientBox(50, 50, 0, 0, 0);
			
			var spreadMethod:String = SpreadMethod.PAD;  
			this.graphics.beginGradientFill(fillType, colors, alphas, ratios, matr, spreadMethod);    
			g.drawRect( this.fromPoint.x,this.fromPoint.y-2.5, this.toPoint.x-this.fromPoint.x, 5);  
			g.endFill();  
			/*var myMatrix:Matrix = new Matrix();
			myMatrix.createGradientBox(200, 200, 1.6, 50, 50);
			var myColors:Array = [0xFF3300,0x666666];
			var myAlphaS:Array = [100, 100];
			var myRalphaS:Array = [0, 225];
			
			graphics.beginGradientFill(GradientType.LINEAR, myColors, myAlphaS,myRalphaS, myMatrix);
			graphics.drawRoundRectComplex(this.fromPoint.x,this.fromPoint.y-20,70,70,5,5,5,5);*/
		}
		
		override protected  function createChildren():void{
			super.createChildren();
			fp=this.contentToGlobal(new Point(0,0));
			for each(var att:AirAttachmentUI in airattachments){
				this.addChild(att);
			}
		}
		protected function checkLinkBundleAttachment():void
		{
			
		//	this._linkBundleAttachment = new LinkBundleAttachment(this);
			//this.addAttachment(this._linkBundleAttachment);
		}
	}
}

 
 updateDisplayList中我们控制了图标点的移动,呈现的UI,AirAttachmentUI

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/mx" width="200" height="60" creationComplete="vgroup1_creationCompleteHandler(event)" >
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;


private var _data:Object;



[Bindable]
/**
* 附件数据项
* Xlocation
* Ylocation
* */
public function get data():Object
{
return _data;
city.setStyle("color",data.citypicturecolor);
}

/**
* @private
*/
public function set data(value:Object):void
{
_data = value;
}

private var _xRelativeValue:Number;

public function get xRelativeValue():Number
{
return _xRelativeValue;
}

public function set xRelativeValue(value:Number):void
{
if(isNaN(_xRelativeValue)){
_xRelativeValue = value;
}
}
protected function vgroup1_creationCompleteHandler(event:FlexEvent):void
{
// TODO Auto-generated method stubdata.citypicturecolor

}

]]>
</fx:Script>
<s:Label id="city" width="100%" textAlign="center" y="{data.cityLabelY}" text="{data.cityname}" color="{data.citypicturecolor}"/>
<s:VGroup width="100%"  height="100%" horizontalAlign="center" verticalAlign="bottom">
<s:Image id="icon" source="{data.citypicture}" width="16" height="16"  />
</s:VGroup>
<!--<s:Label id="city"  y="{data.cityLabelY}" text="{data.cityname}" color="{data.citypicturecolor}"/>
<s:Image id="icon" source="{data.citypicture}" width="16" height="16"  />-->
</s:Group>

再看附件LinkBundleAttachment (CLinkUI中添加附件的代码因为不需要所以被注释了):

package com.zznode.iss.topo.gummonitor.components.common
{
	import flash.display.DisplayObject;
	import flash.display.Graphics;
	import flash.geom.Matrix;
	import flash.geom.Point;
	
	import mx.controls.ColorPicker;
	import mx.utils.ColorUtil;
	
	import spark.components.Image;
	import spark.components.Label;
	
	import twaver.Collection;
	import twaver.ICollection;
	import twaver.IData;
	import twaver.Link;
	import twaver.Node;
	import twaver.Utils;
	import twaver.network.ui.Attachment;
	import twaver.network.ui.ElementUI;
	import twaver.network.ui.LinkUI;
	
	public class LinkBundleAttachment extends Attachment
	{
		var _linkBundleWidth:*;
		var _linkBundleHeight:*;
		var _linkBundleColor:*;
		var _linkBundleAlpha:*;
		
		private var center:Point;
		
		private var contentCenter:Point;
		
		[Embed(source="/resources/images/topo/red.png")]
		/**2G普通基站红**/
		public var BTS_OTH_1:Class;
		
		private var img:Image;
		
		public function LinkBundleAttachment(elementUI:ElementUI, showOnTop:Boolean = false)
		{
		
			super(elementUI, showOnTop);
		}
		
		override public function draw(graphics:Graphics):void
		{		
			var link:Link = Link(element);
			//var fromP:Node=link.fromNode;
			
			//var toP:Node=link.toNode;
			center=new Point((LinkUI(elementUI).toPoint.x+LinkUI(elementUI).fromPoint.x)/2,(LinkUI(elementUI).toPoint.y+LinkUI(elementUI).fromPoint.y)/2);
			contentCenter=LinkUI(elementUI).network.localToContent(center);
			var g:Graphics=graphics;
			g.lineStyle(1, 0x01f0e, 1);
			g.beginFill(0x091231, 0.5);
			g.drawCircle(LinkUI(elementUI).fromPoint.x,LinkUI(elementUI).fromPoint.y,30);
			//g.moveTo(LinkUI(elementUI).fromPoint.x,LinkUI(elementUI).fromPoint.y);
			//g.lineTo(center.x,center.y);
			
			g.drawCircle(center.x,center.y,10);
			//g.lineTo(LinkUI(elementUI).toPoint.x,LinkUI(elementUI).toPoint.y);
			//g.endFill();#EE2E35
			g.drawCircle(LinkUI(elementUI).toPoint.x,LinkUI(elementUI).toPoint.y,30);
			//ClinkUI(elementUI).img.x=contentCenter.x-ClinkUI(elementUI).img.width/2;//-LinkUI(elementUI).x;
			//ClinkUI(elementUI).img.y=contentCenter.y-ClinkUI(elementUI).img.height/2;//-LinkUI(elementUI).y;
			
			var p:Point=ClinkUI(elementUI).contentToLocal(new Point(0,0));
			var p2:Point=ClinkUI(elementUI).contentToGlobal(new Point(0,0));
			for each(var att:AirAttachmentUI in ClinkUI(elementUI).airattachments){
				att.x=-70;//LinkUI(elementUI).fromPoint.x-ClinkUI(elementUI).fp.x;//-att.xRelativeValue-att.width/2
				
				att.y=-20;LinkUI(elementUI).fromPoint.y-ClinkUI(elementUI).fp.y;//-(att.height-att.icon.height/2);
			}
			/*for each(var attachment:AirAttachmentUI in ClinkUI(elementUI).airattachments){
				//attachment.xRelativeValue=contentCenter.x-attachment.data.Xlocation;
				//attachment.x=contentCenter.x-attachment.width/2-attachment.xRelativeValue;
				//attachment.x=contentCenter.x-attachment.xRelativeValue;
				attachment.y=contentCenter.y-(attachment.height-attachment.icon.height/2);
			}*/
			/*for each(var att:AirAttachmentUI in ClinkUI(elementUI).airattachments){
				var iData:ICollection = network.elementBox.datas;
				
				for(var i:Number=0;i<iData.count;i++){
					var data:IData = iData.getItemAt(i) as IData;
					if(data is Node){
						var node:Node=Node(data);
						if(node.id==att.data.enodebid){
							att.x=node.x;
						}
					}
					
				}
			}*/
		
		}
		
		
	}
}

 

 

如上是实现可以解决放大缩小等一些列问题

  • 大小: 32.8 KB
分享到:
评论

相关推荐

    twave flex api 英文版

    **Twave Flex API 英文版详解** Twave Flex API 是一套专为开发基于Adobe Flex技术的交互式应用程序而设计的软件开发工具包(SDK)。2010年10月发布的版本,针对的是Flex开发者,它提供了丰富的功能和接口,帮助...

    TWave.swc组件

    Twave 组件,可以使用,但是不是注册版得

    finalMAINNew.rar_ECG duration_ecg beat_ecg q r t matlab_p-wave e

    duration of p q R S Twave in ECG beat

    Pokemon-Showdown-Dex:神奇宝贝对决的神奇宝贝

    筛选搜索-在“Pokémon搜索”选项卡中,键入“ prankster,twave”,然后按Enter键以获取可以学习Thunder Wave的带有Prankster的Pokémon列表。 面板用户界面-单击任何内容都会将其加载到右侧的新面板中,以便于...

    基于改进YOLOv5s的森林烟火检测算法.pdf

    基于改进YOLOv5s的森林烟火检测算法.pdf

    人力资源管理工具绩效考核excel模板01.xlsx

    人力资源管理工具绩效考核excel模板01

    施工班组长绩效考核表.xls

    施工班组长绩效考核表

    57 -营业部经理绩效考核表1.xlsx

    57 -营业部经理绩效考核表1

    XX公司行政部绩效考核指标.xls

    XX公司行政部绩效考核指标

    ant-apache-xalan2-1.9.4-2.el7.x64-86.rpm.tar.gz

    1、文件内容:ant-apache-xalan2-1.9.4-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ant-apache-xalan2-1.9.4-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    部门绩效考核表模板(基于KPI以月度为例2).xlsx

    部门绩效考核表模板(基于KPI以月度为例2)

    11-6-质检员绩效考核表(含自动计算、等级评价及任意设置等级).xlsx

    11-6-质检员绩效考核表(含自动计算、等级评价及任意设置等级)

    2024年最新全国河流、湖泊矢量数据(数据权威)

    2024最新全国河流湖泊矢量数据 【数据介绍】 2024年中国河流湖泊数据 一份包含中国境内所有主要河流和湖泊的地理信息数据。 数据格式:Shapefile:广泛使用的GIS数据格式,方便在各类GIS软件中使用。 数据获取:访问OpenStreetMap官网,通过导出工具选择中国区域并下载所需的数据。 使用Geofabrik等第三方网站,可以下载预处理好的中国区域的OSM数据。 数据使用:GIS软件:如QGIS、ArcGIS等,用户可以在这些软件中导入OSM数据进行可视化、分析和编辑。 数据应用: 环境研究:分析河流湖泊的水质变化,研究水资源分布及其环境影响。 城市规划:用于规划城市水系、洪水防控、水资源管理等。 导航和旅游:为河流湖泊的导航和旅游路线规划提供数据支持。 科研:为水文地理研究、生态保护、气候变化等领域提供基础数据。 数据特点: 实时更新:OSM数据由全球用户贡献,具有较高的实时性和更新频率。 开放性:所有数据都在开放许可下发布,允许用户自由使用、修改和分发。 详细性:由于全球志愿者的不断努力,数据细节较为丰富,涵盖了从主要河流湖泊到小型水体的广泛范围。 数据时间2024年5月,shp格式,数据来源OpenStreetMap。 OpenStreetMap(OSM)介绍: 一个开放的、免费的、全球性的地图项目,由全球的志愿者和地图爱好者们共同创建和维护。 OSM的数据包括道路、建筑、公园、河流、湖泊等各类地理信息。由于是由众多志愿者共同编辑,OSM的数据具有很高的实时性和详细程度,特别是在一些活跃的区域,地图数据的更新速度和精度往往超过商业地图服务。 用户可以直接在OSM官网下载地图数据,数据格式主要有OSM XML和PBF等。此外,还有一些第三方网站和工具提供更加便捷的数据下载和处理服务,如Geofabrik、Overpass API等。 OSM的数据可以在各种GIS软件中使用,如QGIS、ArcGIS等。此外,还可以使用Python的OSMnx、GeoPandas等库进行编程处理,或者通过Leaflet、Mapbox等JavaScript库将OSM数据集成到web地图应用中。 OSM的所有数据都在开放许可下发布,允许用户自由使用、修改和分发。这使得OSM成为了许多公共项目、研究机构和商业公司的重要数据来源。

    部门绩效考核评分表.xlsx

    部门绩效考核评分表

    12-11-运输车队长绩效考核表(含自动计算、等级评价).xlsx

    12-11-运输车队长绩效考核表(含自动计算、等级评价)

    ant-javadoc-1.9.4-2.el7.x64-86.rpm.tar.gz

    1、文件内容:ant-javadoc-1.9.4-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ant-javadoc-1.9.4-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    springboot整合 freemarker方法

    springboot整合 freemarker方法

    apache-commons-codec-1.8-7.el7.x64-86.rpm.tar.gz

    1、文件内容:apache-commons-codec-1.8-7.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-commons-codec-1.8-7.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    (数据权威)全国旅游抽样调查数据

    《旅游抽样调查资料》是反映入境游客在华(内地)花费和国内居民国内旅游情况的资料性年刊,分为上下两篇。 上篇为在华(内地)停留时间在3个月以内的入境游客抽样调查资料,由综合分析报告和调查分类数据两部分组成,分类数据包括:入境游客的主要特征,入境外国人、港澳台同胞的花费水平和花费构成、在境内的停留时间以及入境次数、流向和对住宿单位的选择等。 下篇为国内旅游抽样调查资料,汇集了对城镇居民和农村居民的国内旅游抽样调查结果,共分为四个部分:第一部分为综合分析报告;第二部分为国内旅游出游及花费情况;第三部分为城镇居民国内旅游抽样调查分类数据;第四部分为农村居民国内旅游抽样调查分类数据。

    二代身份证信息读取(vfp8.0)

    1、表单界面,身份证信息保存在dbf表中,供vfp应用使用,可导出为xls电子表格。 2、提供了身份证过期校验和查询功能。

Global site tag (gtag.js) - Google Analytics