SpringGraph是Adobe的Flex 2.0的开源组件,它可以显示一套有相互联系的节点关系。该组件允许用户拖动和/或交互的个别节点。数据可以是XML或ActionScript对象。
本文使用xml数据来做演示.
网上搜下可以搜到几个非常不错的实例..SpringGraph 的文档还是比较少的.
先来看下本文做出来的效果图.
图形是自定义的,这里你可以使用任意图形来连接节点.
首先引入组件这个不用说,将SpringGraph.swc 组件引入到工程.
添加头部信息: xmlns:flex="http://www.adobe.com/2006/fc"
<flex:SpringGraph id="springgraph" bottom="0" top="0" right="0" left="0" backgroundColor="#ffffff"
motionThreshold="1.5" repulsionFactor="0.60" dataProvider="{graph}" itemRenderer="AtomView">
</flex:SpringGraph>几个属性的介绍:
motionThreshold--布局计算停止的时间,有意义的值的范围是从0.001到2.0左右。低的数字意味着布局需要更长的时间定下来。高数量意味着布局将更快停止,这个值适中即可.
repulsionFactor--原子之间的关系间距,默认是0.75
dataProvider--不用说,就是你的数据来源.
itemRenderer--定义一个项目渲染UIComponent类,这个类可以绘制每个节点的样式以及形状大小.
lineColor --线的颜色.
autoFit--自动调整,保证该图形不跑出界面
这几个属性是我所用到的.可能用自己的语言组织出来不是很明白.大家试试就可以了。
之后需要一个符合格式的xml
复制代码1var strXML:String = "<molecule convention="MDLMol" id="dataSmall" title="NICOTINE">" +
"<graph>" +
"<Node id="1" prop="节点文章" color="0xaf3a42" />" +
"<Node id="1.1" prop="文章第一篇" color="0xfa7730" />" +
"<Node id="1.2" prop="文章第二篇" color="0x33CC99"/>" +
"<Node id="1.3" prop="文章第三篇" color="0x6b4c8f" />" +
"<Node id="1.4" prop="文章第四篇" color="0x585fee" />" +
"<Node id="1.1.1" prop="关键字一" color="0xaf3a42" />" +
"<Node id="1.1.2" prop="关键字二" color="0x6b4c8f" />" +
"<Node id="1.1.3" prop="关键字三" color="0xfa7730" />" +
"<Node id="1.1.4" prop="关键字四" color="0x585fee" />" +
"<Edge fromID="1" toID="1.1" order="1" number="10"/>" +
"<Edge fromID="1" toID="1.2" order="3" number="15"/>" +
"<Edge fromID="1" toID="1.3" order="4" number="3"/>" +
"<Edge fromID="1" toID="1.4" order="2" number="8"/>" +
"<Edge fromID="1.1" toID="1.1.1" order="5" number="7"/>" +
"<Edge fromID="1.1" toID="1.1.2" order="1" number="4"/>" +
"<Edge fromID="1.1" toID="1.1.3" order="3" number="12"/>" +
"<Edge fromID="1.1" toID="1.1.4" order="2" number="9"/>" +
"<Edge fromID="1.2" toID="1.1.1" order="5" number="100"/>" +
"
</graph>
</molecule>";
注意关键的属性 fromID 和toID
Node节点就是原子,Edge是他们之间的关系. prop 是名称 ,color就是圆的颜色了,order是线的粗细,number 的线上显示的文字.
Mian.mxml代码
复制代码1<flex:SpringGraph id="springgraph" bottom="0" top="0" right="0" left="0" backgroundColor="#ffffff"复制代码1motionThreshold="1.5" repulsionFactor="0.60" dataProvider="{graph}" autoFit="true" itemRenderer="AtomView">复制代码1<fx:Script>复制代码1[Bindable]复制代码1public var graph: Graph = new Graph();复制代码1复制代码1//strXML就是上文写的到那段xml复制代码1private function gotData(strXml:String): void {复制代码1//ShowLoding();复制代码1graph.empty();复制代码1// 获得xml数据复制代码1var x:XML = new XML(strXml);复制代码1loadCML(x, graph);复制代码1}复制代码1复制代码1// This namespace is used in some, but not all, CML files复制代码1public static var cmlns:Namespace = new Namespace("x-schema:cml_schema_ie_02.xml");复制代码1复制代码1private static function loadCML(cml: XML, g: Graph): void {复制代码1var gid: String = cml.@id;复制代码1var item: Item;复制代码1for each (var node: XML in cml..Node) {复制代码1item = new Item(gid + node.@id);复制代码1item.data = node;复制代码1g.add(item);复制代码1}复制代码1复制代码1for each (node in cml..cmlns::Node) {复制代码1item = new Item(gid + node.@id);复制代码1item.data = node;复制代码1g.add(item);复制代码1}复制代码1复制代码1for each (var bond: XML in cml..Edge) {复制代码1loadBond(bond, g, gid);复制代码1}复制代码1复制代码1for each (bond in cml..cmlns::Edge) {复制代码1loadBond(bond, g, gid);复制代码1}复制代码1}复制代码1复制代码1private static function loadBond(bond: XML, g: Graph, gid: String): void {复制代码1var fromID: String;复制代码1var toID: String;复制代码1var orderString: String;复制代码1var infoString:String;复制代码1var colorString:String;复制代码1复制代码1try {复制代码1fromID = bond.@fromID;复制代码1toID = bond.@toID;复制代码1orderString = bond.@order;复制代码1infoString = bond.@number;复制代码1colorString = bond.@color;复制代码1} catch (e: Error) {复制代码1}复制代码1复制代码1var fromItem: Item = g.find(gid + fromID);复制代码1var toItem: Item = g.find(gid + toID);复制代码1复制代码1if((fromItem != null) && (toItem != null)) {复制代码1var order: int = int(orderString.toString());复制代码1var data: Object = {settings: {alpha: 0.2 , color: colorString, tooltip: "测试数据",info:infoString, thickness: order}};复制代码1g.link(fromItem, toItem, data);复制代码1}复制代码1复制代码1}复制代码1</fx:Script>
itemRenderer="AtomView"
AtomView 是一个mxml组件 用来呈现图形化UI
AtomView.mxml代码:
复制代码1<Circle id="circle" doubleClick="createPopUp(data.data.@pid)"/>复制代码1<mx:Label id="lab" doubleClick="createPopUp(data.data.@pid)"/>复制代码1<mx:Style source="index.css"/>复制代码1scaleX="{Main.getInstance().scaleFactor}"复制代码1scaleY="{Main.getInstance().scaleFactor}" -->复制代码1<mx:Script>复制代码1<![CDATA[复制代码1import com.adobe.flex.extras.controls.springgraph.Item;复制代码1复制代码1import mx.containers.ControlBar;复制代码1import mx.containers.Panel;复制代码1import mx.containers.VBox;复制代码1import mx.controls.Alert;复制代码1import mx.controls.Button;复制代码1import mx.controls.Label;复制代码1import mx.controls.List;复制代码1import mx.controls.Spacer;复制代码1import mx.controls.TextInput;复制代码1import mx.graphics.SolidColor;复制代码1import mx.graphics.SolidColorStroke;复制代码1import mx.graphics.Stroke;复制代码1import mx.managers.PopUpManager;复制代码1复制代码1复制代码1/** 项数据 **/复制代码1private var _data: Item;复制代码1复制代码1/** 是否创建完成 */复制代码1private var created: Boolean = false;复制代码1复制代码1override public function set data(d: Object): void {复制代码1super.data = d;复制代码1_data = d as Item;复制代码1复制代码1if(created)复制代码1applyData();复制代码1}复制代码1复制代码1/** called when this component and its child components are fully created. */复制代码1private function creationComplete(): void {复制代码1created = true;复制代码1if(_data != null)复制代码1applyData();复制代码1}复制代码1复制代码1/** updates our view to represent the current Item, which is some kind of atom. */复制代码1private function applyData(): void {复制代码1var name: String = getAtomName(_data.data as XML);复制代码1var _color: int;复制代码1var dataXML:XML = _data.data as XML复制代码1var colorInt:int = int(dataXML.@color);复制代码1// this atom type is not in the 'atomColors' table. use a default.复制代码1_color = colorInt;复制代码1// determine the size. To a first approximation, all atoms are roughly the复制代码1// same size. See http://www.historyoftheuniverse.com/atomsize.html.复制代码1var labelX: int = 30;复制代码1var labelY: int = 50; // TODO: figure out how to do vertical centering automatically复制代码1var size: int = 60;复制代码1复制代码1this.width = 62;复制代码1this.height = 62;复制代码1circle.color = _color;复制代码1circle.width = size;复制代码1circle.height = size;复制代码1circle.cx = 30;复制代码1circle.cy = 30;复制代码1circle.doubleClickEnabled = true;复制代码1复制代码1var order:int = int(dataXML.@order);复制代码1复制代码1lab.width = 120;复制代码1lab.x = 5;//labelX;复制代码1lab.y = 20;//labelY;复制代码1lab.text = name;复制代码1lab.doubleClickEnabled = true;复制代码1lab.toolTip = lab.text + "n" + dataXML.@number;复制代码1复制代码1size = 60+order*5;复制代码1circle.cx = 30+order*5;复制代码1circle.cy = 30+order*5;复制代码1this.width = 62+order*10;复制代码1this.height = 62+order*10;复制代码1circle.width = size+order*5;复制代码1circle.height = size+order*5;复制代码1复制代码1lab.y = 20+order*5;复制代码1复制代码1复制代码1}复制代码1复制代码1/** 获得元素名称 */复制代码1private function getAtomName(atomXML: XML): String {复制代码1var name: String = String(atomXML.@prop);复制代码1if((name == null) || (name.length == 0)) {复制代码1// We didn't' find a name. Try again using a namespace.复制代码1var ns: Namespace = Main.cmlns;复制代码1name = atomXML.ns::string; // .(@builtin == "elementType");复制代码1// TODO: the above XML expression works, but isn't the right expression. fix it.复制代码1}复制代码1return name;复制代码1}复制代码1</mx:Script>
Circle是一个自定义圆的UIComponent
Circle代码
复制代码1复制代码1package复制代码1{复制代码1import flash.display.GradientType;复制代码1import flash.display.InterpolationMethod;复制代码1import flash.display.SpreadMethod;复制代码1import flash.geom.Matrix;复制代码1复制代码1import mx.core.UIComponent;复制代码1import mx.effects.Rotate;复制代码1复制代码1/** A UIComponent that is simply a colored circle.复制代码1*复制代码1* @author Mark Shepherd复制代码1*/复制代码1public class Circle extends UIComponent复制代码1{复制代码1private var _cx:int;复制代码1private var _cy:int;复制代码1public function set cx(i: int): void {复制代码1_cx = i;复制代码1}复制代码1public function set cy(i: int): void {复制代码1_cy = i;复制代码1}复制代码1/** the color that this circle will be */复制代码1public function set color(i: int): void {复制代码1_color = i;复制代码1invalidateDisplayList();复制代码1}复制代码1复制代码1/** our current color setting. */复制代码1private var _color: int;复制代码1复制代码1override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {复制代码1graphics.clear();复制代码1graphics.beginFill(_color,0.4);复制代码1graphics.lineStyle(1,0x000000,1,true,"nomal","none");复制代码1graphics.drawCircle(_cx, _cy, unscaledWidth/2);复制代码1graphics.endFill();复制代码1}复制代码1}复制代码1}
多形状展示图形:
SpringGraph里面有一个Roamer分支
Roamer可以分层次展示,并且可以展示历史节点.功能依然强大,有兴趣的朋友可以试试.
谁有好的制作拓扑的组件可以推荐下,最近正在制作一个流程图,灰常给力..
更多内容请访问:小刚的博客
----------------------
天要下雨...
转载于:https://www.cnblogs.com/xiaogangqq123/archive/2011/04/22/2025068.html
最后
以上就是光亮柚子最近收集整理的关于用SpringGraph制作拓扑图和关系图的全部内容,更多相关用SpringGraph制作拓扑图和关系图内容请搜索靠谱客的其他文章。
发表评论 取消回复