在Java版本中提供的iconAttachment机制可以在网元的任意位置放置n个图标或文字,如下图所示
在Flex版本中,用于也可以通过以下方式实现在网元上显示icon的功能
1
server1.setStyle(Styles.ICONS_NAMES, ["att5","att6", "att7","att8"]);
2
server1.setStyle(Styles.ICONS_POSITION, Consts.POSITION_BOTTOMRIGHT_TOPRIGHT);
3
server1.setStyle(Styles.ICONS_ORIENTATION, Consts.ORIENTATION_TOP);
4
server1.setStyle(Styles.ICONS_XOFFSET, 5);
Flex版本的默认实现并没有提供在多个postion添加icon的功能
但是借助FlexMVC设计非常好的灵活性,可以很容易的扩展出这个功能,如下图所示
主要借助了TWaver中的Attachment机制,可以创建多个iconAttachment用来显示不同位置的图标
代码下载
attachment
有兴趣的同学也可以实现下不同位置不同方向的attachment
主要修改CustomIconAttachment的以下两个方法即可
private function getIconsSize(names:Array, orientation:String, xgap:Number, ygap:Number):Size
override public function draw(graphics:Graphics):void
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="init();"
layout="absolute"
width="100%"
height="100%"
xmlns:tw="http://www.servasoftware.com/2009/twaver/flex">
<mx:Script>
<![CDATA[
import attachment.CustomNode;
import twaver.Consts;
import twaver.Node;
import twaver.Styles;
import twaver.Utils;
[Embed(source="images/1.png")]
public static const image1:Class;
[Embed(source="images/2.png")]
public static const image2:Class;
[Embed(source="images/3.png")]
public static const image3:Class;
[Embed(source="images/4.png")]
public static const image4:Class;
[Embed(source="images/5.png")]
public static const image5:Class;
[Embed(source="images/6.png")]
public static const image6:Class;
[Embed(source="images/7.png")]
public static const image7:Class;
private function init():void {
Utils.registerImageByClass("image1", image1);
Utils.registerImageByClass("image2", image2);
Utils.registerImageByClass("image3", image3);
Utils.registerImageByClass("image4", image4);
Utils.registerImageByClass("image5", image5);
Utils.registerImageByClass("image6", image6);
Utils.registerImageByClass("image7", image7);
var n:CustomNode=new CustomNode();
n.width=100;
n.height=100;
createAttachment(n, Consts.POSITION_BOTTOM);
createAttachment(n, Consts.POSITION_TOP);
createAttachment(n, Consts.POSITION_LEFT);
createAttachment(n, Consts.POSITION_RIGHT);
network.elementBox.add(n);
}
private function createAttachment(n:CustomNode, p:String):void {
var c:int=int(Math.random() * 4 + 3);
for (var i:int=1; i < c; i++) {
n.addIconAttachment("image" + i, p);
}
}
]]>
</mx:Script>
<tw:Network id="network"
backgroundColor="0xFFFFFF"
width="100%"
height="100%"/>
</mx:Application>
package attachment {
import flash.display.Graphics;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import twaver.*;
import twaver.network.ui.Attachment;
import twaver.network.ui.ElementUI;
public class CustomIconAttachment extends Attachment {
private var _icons:ICollection;
private var _postion:String;
public function CustomIconAttachment(elementUI:ElementUI, showInAttachmentCanvas:Boolean=false) {
super(elementUI, showInAttachmentCanvas);
}
public function get postion():String {
return _postion;
}
public function set postion(value:String):void {
_postion=value;
}
public function get icons():ICollection {
return _icons;
}
public function set icons(value:ICollection):void {
_icons=value;
}
private function getIconsSize(names:Array, orientation:String, xgap:Number, ygap:Number):Size {
var x:Number=0;
var y:Number=0;
var rect:Rectangle=null;
var imageAsset:IImageAsset=null;
var unionRect:Rectangle=null;
for each (var name:String in names) {
imageAsset=Utils.getImageAsset(name, false);
if (imageAsset == null) {
continue;
}
if (orientation == Consts.ORIENTATION_RIGHT) {
rect=new Rectangle(x, y, imageAsset.width, imageAsset.height);
x+=rect.width + xgap;
} else if (orientation == Consts.ORIENTATION_LEFT) {
rect=new Rectangle(x - imageAsset.width, y, imageAsset.width, imageAsset.height);
x-=rect.width + xgap;
} else if (orientation == Consts.ORIENTATION_TOP) {
rect=new Rectangle(x, y - imageAsset.height, imageAsset.width, imageAsset.height);
y-=rect.height + ygap;
} else if (orientation == Consts.ORIENTATION_BOTTOM) {
rect=new Rectangle(x, y, imageAsset.width, imageAsset.height);
y+=rect.height + ygap;
} else {
throw new Error("Can not resolve '" + orientation + "' orientation");
}
if (unionRect == null) {
unionRect=rect;
} else {
unionRect=unionRect.union(rect);
}
}
if (unionRect != null) {
return new Size(Math.abs(unionRect.width), Math.abs(unionRect.height));
}
return null;
}
/**
* @inheritDoc
*
*/
override public function draw(graphics:Graphics):void {
super.draw(graphics);
if (icons == null || icons.count == 0) {
return;
}
var orientation:String=element.getStyle(Styles.ICONS_ORIENTATION);
var xoffset:Number=element.getStyle(Styles.ICONS_XOFFSET);
var yoffset:Number=element.getStyle(Styles.ICONS_YOFFSET);
var xgap:Number=5;
var ygap:Number=5;
var iconsSize:Size=getIconsSize(icons.toArray(), orientation, xgap, ygap);
var location:Point=this.network.getPosition(this.postion, this.elementUI, iconsSize, xoffset, yoffset);
if (orientation == Consts.ORIENTATION_TOP) {
location.y+=iconsSize.height;
} else if (orientation == Consts.ORIENTATION_LEFT) {
location.x+=iconsSize.width;
}
var x:Number=0;
var y:Number=0;
var index:int=0;
for each (var name:String in icons.toArray()) {
var rect:Rectangle=null;
var imageAsset:IImageAsset=Utils.getImageAsset(name, false);
if (imageAsset == null) {
continue;
}
if (orientation == Consts.ORIENTATION_RIGHT) {
rect=new Rectangle(x, y, imageAsset.width, imageAsset.height);
x+=rect.width + xgap;
} else if (orientation == Consts.ORIENTATION_LEFT) {
rect=new Rectangle(x - imageAsset.width, y, imageAsset.width, imageAsset.height);
x-=rect.width + xgap;
} else if (orientation == Consts.ORIENTATION_TOP) {
rect=new Rectangle(x, y - imageAsset.height, imageAsset.width, imageAsset.height);
y-=rect.height + ygap;
} else if (orientation == Consts.ORIENTATION_BOTTOM) {
rect=new Rectangle(x, y, imageAsset.width, imageAsset.height);
y+=rect.height + ygap;
} else {
throw new Error("Can not resolve '" + orientation + "' orientation");
}
rect.x+=location.x;
rect.y+=location.y;
var matrix:Matrix=new Matrix();
matrix.translate(rect.x, rect.y);
graphics.lineStyle();
graphics.beginBitmapFill(imageAsset.getBitmapData(), matrix, false);
graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
graphics.endFill();
}
}
}
}
package attachment {
import flash.utils.Dictionary;
import twaver.Collection;
import twaver.Consts;
import twaver.ICollection;
import twaver.Node;
public class CustomNode extends Node {
private var attMap:Dictionary=new Dictionary();
public function CustomNode(id:Object=null) {
super(id);
}
public function addIconAttachment(icon:String, position:String):void {
var list:ICollection=attMap[position] as Collection;
if (list == null) {
list=new Collection();
attMap[position]=list;
}
list.addItem(icon);
this.dispatchPropertyChangeEvent("iconAttachment", true, false);
}
public function removeIconAttachment(icon:String, position:String):void {
var list:ICollection=attMap[position] as Collection;
if (list == null) {
return;
}
if (list.contains(icon)) {
list.removeItem(icon);
this.dispatchPropertyChangeEvent("iconAttachment", true, false);
}
}
public function get iconAttachments():Dictionary {
return attMap;
}
override public function get elementUIClass():Class {
return CustomNodeUI;
}
}
}
package attachment {
import flash.utils.Dictionary;
import twaver.Collection;
import twaver.ICollection;
import twaver.Node;
import twaver.network.Network;
import twaver.network.ui.NodeUI;
public class CustomNodeUI extends NodeUI {
public function CustomNodeUI(network:Network, node:Node) {
super(network, node);
}
override public function checkAttachments():void {
super.checkAttachments();
checkIconAttachment();
}
private var attMap:Dictionary=new Dictionary();
private function checkIconAttachment():void {
var cNode:CustomNode=node as CustomNode;
var atts:Dictionary=cNode.iconAttachments;
var key:Object;
for (key in atts) {
var attList:ICollection=atts[key] as Collection;
createAttachment(attList, key.toString());
}
for (key in attMap) {
if (atts[key] == null) {
var att:CustomIconAttachment=attMap[key];
this.removeAttachment(att);
}
}
}
private function createAttachment(icons:ICollection, position:String):CustomIconAttachment {
var iconAtt:CustomIconAttachment
if (attMap[position] != null) {
iconAtt=attMap[position];
iconAtt.icons=icons;
iconAtt.postion=position;
} else {
iconAtt=new CustomIconAttachment(this);
iconAtt.icons=icons;
iconAtt.postion=position;
attMap[position]=iconAtt;
this.addAttachment(iconAtt);
}
return iconAtt;
}
}
}