如上图,我们要实现中间两个飞机之间连线以及上面点的功能, 点如果采用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; } } } }*/ } } }
如上是实现可以解决放大缩小等一些列问题
相关推荐
**Twave Flex API 英文版详解** Twave Flex API 是一套专为开发基于Adobe Flex技术的交互式应用程序而设计的软件开发工具包(SDK)。2010年10月发布的版本,针对的是Flex开发者,它提供了丰富的功能和接口,帮助...
Twave 组件,可以使用,但是不是注册版得
duration of p q R S Twave in ECG beat
筛选搜索-在“Pokémon搜索”选项卡中,键入“ prankster,twave”,然后按Enter键以获取可以学习Thunder Wave的带有Prankster的Pokémon列表。 面板用户界面-单击任何内容都会将其加载到右侧的新面板中,以便于...
基于改进YOLOv5s的森林烟火检测算法.pdf
人力资源管理工具绩效考核excel模板01
施工班组长绩效考核表
57 -营业部经理绩效考核表1
XX公司行政部绩效考核指标
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)
11-6-质检员绩效考核表(含自动计算、等级评价及任意设置等级)
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成为了许多公共项目、研究机构和商业公司的重要数据来源。
部门绩效考核评分表
12-11-运输车队长绩效考核表(含自动计算、等级评价)
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方法
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个月以内的入境游客抽样调查资料,由综合分析报告和调查分类数据两部分组成,分类数据包括:入境游客的主要特征,入境外国人、港澳台同胞的花费水平和花费构成、在境内的停留时间以及入境次数、流向和对住宿单位的选择等。 下篇为国内旅游抽样调查资料,汇集了对城镇居民和农村居民的国内旅游抽样调查结果,共分为四个部分:第一部分为综合分析报告;第二部分为国内旅游出游及花费情况;第三部分为城镇居民国内旅游抽样调查分类数据;第四部分为农村居民国内旅游抽样调查分类数据。
1、表单界面,身份证信息保存在dbf表中,供vfp应用使用,可导出为xls电子表格。 2、提供了身份证过期校验和查询功能。