Adobe AIR and Flex - 实现堆栈容器
1.需求描述:
在对云平台的监控中,我们经常需要在一张图上可视化的描述集群下的物理机所虚拟的虚拟机使用情况,以及超卖情况。那么传统的chart图就不满足我们的需求了,那么要实现这样一个定制化的chart图,反向LIST容器(堆栈容器),可谓是我们的桥梁,如下图:
2、Demo实现
我们如何实现这样的效果呢?首先,大多数情况下需要一个反向list容器,那么FLEX提供的默认list容器又是从上往下的,很显然不满足我们的需求,
我们需要自定义一个这样的容器。步骤:
(1)继承BaseLayout类 (2)重写updateDisplayList()
3、具体实现
1 /** 2 * Created with IntelliJ IDEA. 3 * @author: DongYang 4 * Date: 13-7-24 5 * Time: 上午10:22 6 * Progress every day a little more. 7 */ 8 package component.charts.layout 9 { 10 import mx.core.ILayoutElement; 11 import mx.core.UIComponent; 12 13 import spark.layouts.BasicLayout; 14 15 public class StackLayout extends BasicLayout 16 { 17 public function StackLayout() 18 { 19 super(); 20 } 21 private var _gap:int = 6; 22 23 public function get gap():int 24 { 25 return _gap; 26 } 27 28 public function set gap(value:int):void 29 { 30 _gap = value; 31 if(!this.target) return; 32 target.invalidateDisplayList(); 33 target.invalidateSize(); 34 } 35 36 override public function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 37 { 38 super.updateDisplayList(unscaledWidth, unscaledHeight); 39 if(!this.target) 40 return; 41 42 var layoutElement:ILayoutElement; 43 var count:uint = target.numElements; 44 45 var h : Number = target.height; 46 var depth:Number=0; 47 48 for (var i:int = 0; i < count; i++) 49 { 50 layoutElement = target.getElementAt(i); 51 52 if (!layoutElement || !layoutElement.includeInLayout) 53 continue; 54 55 var _eh:Number=UIComponent(layoutElement).height; 56 var _y:Number=0; 57 if(i==0){ 58 depth=depth+_eh; 59 }else{ 60 depth=depth+_eh+gap; 61 } 62 _y=h-depth; 63 layoutElement.setLayoutBoundsPosition( 0, _y ); 64 } 65 } 66 67 } 68 }
4、使用方法
让容器的layout实例等于 new StackLayout();
如:
1 /** 2 * Created with IntelliJ IDEA. 3 * @author: DongYang 4 * Date: 13-7-25 5 * Time: 上午11:41 6 * Progress every day a little more. 7 */ 8 package component.charts.container { 9 import component.charts.layout.StackLayout; 10 11 import spark.components.Group; 12 13 public class StackGroup extends Group { 14 public function StackGroup() { 15 super(); 16 _lay=new StackLayout(); 17 this.layout=_lay; 18 } 19 private var _lay:StackLayout; 20 private var _gap:Number=6; 21 22 public function get gap():Number { 23 return _gap; 24 } 25 26 public function set gap(value:Number):void { 27 _gap = value; 28 _lay.gap=value; 29 } 30 } 31 }
其中gap是子元素之间的间隔距离
这样我们在StackGroup里放子元素的话,就可以看到子元素“入栈”了。
注:使用StackGroup容器的时候,必须指定它的高度。我们想想在日常生活中,我们要向一个桶里装水,肯定是提前知道它的容量的。