1.需求描述:

在对云平台的监控中,我们经常需要在一张图上可视化的描述集群下的物理机所虚拟的虚拟机使用情况,以及超卖情况。那么传统的chart图就不满足我们的需求了,那么要实现这样一个定制化的chart图,反向LIST容器(堆栈容器),可谓是我们的桥梁,如下图:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJoAAAFECAIAAABQ3rCrAAATaklEQVR4nO2dbXdT15XH92ex+AjzwqadjmjMkBlhMmtl0ocgy9M0mU6GgKdt0rywgfZFDX6iJQ0YbMxDmyzANNOQhYxnxZj4ga6CebRkY8kGG0ty7ca1AiaJktBqXpybe8/d9+jqyrJ0fTf7v/4v7HvO2Xff/TvnWmS12vDyy//gZ3lcW7ZsyWaz2WwW/H7/3/8ObE/b7/czTjr2+/2xWGxmZgb8fv/f/gZsT1vgjMVijJOCTTifPAG2p804SdmE86uvgO1pM05SNuH88ktge9qMk5RNOL/4AtieNuMkZcZJyoyTlE04Mxlge9qMk5QZJymbcH7+ObA9bcZJyiacn30GbE+7rDj7+uDOnZKE7etb5dorV0r4vCUNrrQJ56efQkn9858DAGzbBouL+Sffu1dY2I0bHYVF3rAB6urW7AHr6mBkxPh148ZVZrVqu4Czvt64cvs2jIwo3NNTQKGtYT/9FLq7HW2I7m5tK1hjHjhgutLXh2+BfO8ebNgAGzZAT48RxBq5fDgfP4aSeu9eAIC9e+HxY5iehsePYXgYfD6oqgKfDwCgqsqw+BVFuH0b9u7F3rZNO/T6lfp69XKlfT7w+bSfh4fh2DEjVTEkLCRGla6r09KQs/X5tCctj0uOc3ERhoc1iyrX18PZs+DzQX29MU3wGx42yqqDR962zURd3wpiWyDX1eHl09OK5fpa8fPwsGnniacQcxYX1Y85Pa2lcfEi3ivWHMqEc2UF1txTU0a9rHUfGtKmiTlTU9qv7e1aNZ3cQi+9cnRhAV/p6tJOsHzE6+uhqkr7ub0dx+zqAgDo6sqZQyik7VRrbvJzldolx+mk7gJ5VRWe2d5uXLl1C4aG1NYPvXWovR18PmPTyNHkzbSyAr29AAA1NRp+lGpNDfh8OZ/r1i2cv2ybodLifPQISuo9ewAA9uxRX+/qMq6IzT40ZFwZGjK9FR1afx9YkwmFwOeDM2dMdwyF1Kn6fIq0dYu/FOGwerStTdsopS7vo0fu4Wxr0/jF4xqkR4+gq8v0NywezxkqFIJQyDShqgpCIVNN9cjKQofD2sclHZj+M0q1q0u9IYR37QIAaGuze3CxV6qq4ObNMuJ8+BDW1vPzOT+ziB/CYe16LKYt6ezUpoVCeYKLhXv2GL+iVQK5TQSfD2pqjJuKHAYHobPTwPnwIdTUGHdB7ux0lGooZDxyKAQ3bqxxnXWXFufDh3D6NLS1weCgViYA2LVL+zUc1tDqLIXD4ZzlQ9NEgWSccqU6O/NvL+WHW/Fu1HH6fHD6tB3Lmpr8L3zx8tBVVeVNnKLu+sbXa/TwIYRCsGePtvcFYN1iOys3Ryhk4BelFD8LJHmTEScvr2WcYtsNDuI4OmY5cwGvs9O4It7Gu3Zp+ctvlNLi/OQTKIV37wafD7ZuhQsXAAB279aup1LaKPoHu/5v9tpaRbTKSvD5oLUVXxcLHaZ04YL6+unTRs5yqrW14PNpCYvMa2thclIRwZqGCHX0aElqi1wmnACwcyd89JHxg2A8OamNfvSRgpkyWiql8UZLfD6orHSakohfWWmyCCvqjnBOToLPp95essUDojR27lRkWw6c6TSUwqI0ly/D5cv4IG7dqj3t5cumJaK4uQIePQoAMDpqXBGRt27FMy9fhspKHFzEFxtr927DIiUxWcfpMCVh8SytrYp7WXMohcuBs7ZWq74oulwjGbYNztFRU91374atW02/ijqii4KQ2EDW+NabCpxyVghnXioiwuTk+sC5vAylsGCTSMDAAABAY6NptLERAGBgQLFEvhIMQmNjTos62kw4cgTHt95UBJGzklNVLpH9wQcAAMGg4vHFbi5ReWWXA6f+XhUPrMRp/SiEcNr4yBFtfmOjXblXgVP8fQ0GIRjMn5LYgnfvqh+/DCwxzr/+FdbcExNQUQEtLdDRARUVGk55gn465YuVlVBR4Sh+R4f26ePaNQgGoaICKiogEICODrtVAudrr5lOsFgrZ9XYaKQNYBdTn28dksOW2iXH2dJiPIwojaB77Zp2MRCAYBCv+uCD/JHn5rRDU1mJKysACK76jaw40SdbscSKZ2AAAgG7lMSWkp9C350tLYoMy4RzaQnW3JWV0NBg/Hr1KgQC2mavqNDquGMHNDSoHQgoYl69ahxEObjshgYDqjIrALh0yXRRBNSXA+QMLltk0txsXBkf194u8rEuRW2tLi3O8+ehslLNo6EBP7NVFRWmQpw/Dzt2mF6n9ncfH9eOL8ImcAYC8OABBnP+fAE4xdMFAjA+rhhtbtaeIhgsE0uM8+OPYW19+DD09+ef1t+vef9+09H805+MOYEABALQ0OAoIMphdhZftF5BbmiAHTsgGs05IRqF7dvh/fftguzYkWfCmru0ONlltgnnX/4CbE+bcZIy4yRlxknKJpyLi8D2tBknKTNOUjbhXFgAtqfNOEnZhPPPfwa2p804SdmEc34e2J424yRlE85UCtieNuMkZRPOZBLYnjbjJGUTzkQC2J424yRlxknKJpxzc8D2tE04WV5XdXW1gfPJkydJlpfV1NRkwjk/P+92SqzVS+CcmprScLI8Lb/fPz8/Py/+6+1XLI+LcZIS4yQlxklKjJOUGCcpMU5SYpykxDhJiXGSEuMkJcZJSoyTlBgnKTFOUmKcpMQ4SYlxkhLjJCXGSUomnF+yPC7GSUqMk5QYJykxTlJinKTEOEmJcZIS4yQlxklKjJOUGCcpMU5SYpykxDhJiXGSEuMkJcZJSoyTlBgnKTFOUjLh/ILlcTFOUmKcpMQ4SYlxkhLjJCXGSUqMk5QYJykxTlJinKTEOEmJcZIS4yQlxklKjJOUGCcpMU5SYpykxDhJyYQzw/K4GCcpMU5SYpykxDhJiXGSEuMkJcZJSoyTlBgnKTFOUmKcpMQ4SYlxkhLjJCXGSUqMk5QYJykxTlJinKTEOEmJcZIS4yQlxklKjJOUGCcpMU5SYpykxDhJiXGSEuMkJcZJSoyTlBgnKTFOUmKcpMQ4SYlxkhLjJCXGSUomnJ+zPC7GSUqMk5QYJykxTlJinKTEOEmJcZIS4yQlxklKjJOUGCcpMU5SYpykxDhJiXGSEuMkJcZJSoyTlBgnKZlwfsbyuBgnKTFOUmKcpMQ4SYlxkhLjJCXGSUqMk5QYJykxTlJinKTEOEmJcZIS4yQlxklKjJOUDJzPbX/Gz/K+jNN58PZzbE+bcZKy3++PxWLT09OMk4IFzlgsJnBuY3vaJpy/vrWN7WkjnDVsT5txkjLCuZXtaTNOUmacpIxwBtietgnnr24F2J42wvmvbE/bTZwnJ155N7arMxpcxSrXC4fyeTe26+TEK64n4w7OkxOvpDOpbDabzWbTmVQ6k3KyaiBxWF41kDisD6UeR0Uc3anH0fP3f+Ewn+uL76Hl6Uzq4myr/arOaHDqkz9mJbm+z0w4D9z8l/L4aGS7Dkbo4mxr3lXJlaipdpM7xfVLiUPZHOqJv5k37MXZVuXadCZls2okdRI9gpySW3YHp5XNVPpKQTtArvVI6mQunJGlvkIzyYvzxPjLuZasN5zPls3oSKUzyYLmR5b69CEbnHnDnhj/YUFrR1In05lkriXvTu4sZw2tNuFsv/ls2Xwk8uKyuS69sy0289GB6In/TB9CONFM+7CRpT595nImKae0nEmiye9M7kT80CO8M7mznDW0GuHcUk6jukeW+mwmWwptDI2kTshxRhfPyZOn0lcchkUL0V3ab255Z/I1OWxP/A30CO9MvlbmGiK7ifNS4m2003PN7J1ttgGPcI6kTkylr8hhj0S+nzfsciZ5fPwlJziTK9H37+1tV+3Ipxrnkcj30cuqJ/6GcqaMJ5vNHh9/yR4nwn8p8XbesMmVaLvtO0AnKv+6rnG23fjnMju5EpHLMbZ0UTkNVRmNDptxDqdOoCXJlYg1ZsfY9+Q5/XNv571R3vx/d3dH+Wso22Wc/XP4fWudczb+ujxndOGcE5zx9Ih8sTv6ks2q5UyyY+x7jLNYoyOirPvY0kXnYHSc4RnT+9a6CeT7xtMj1ouMczVGFbGvu7LESpz2C9GJD880k8S5ufzun/uNXJHlTFIe7Y7+wAy7xxphOHXcjPO4uI6O9dn46/oSeUi+owVnnuQtOP/blRrqdh9nx9h3Le/bH+ijows9uYby4kRHcGzpohJbrusEcFa7YlSU/rm39CFLfRXLh1PdZpzd9svDM/vk+WfjPy3odjaZ/+7uq27VUNiEs/VGtSvun3tLLkpyJSKuHx77jlzfaws9yuVDZpxDqW59aGypVx4Kz+xrvVEtf+hdziTlUAhn3swRzt/efdWtGgojnM+44sNjL6A6Hh57ofXGMwjzsWidcrkKpzZ0Jv4TeSieHkb3GlvqlUNZcObJXIXTnRoKrwucrTeeiaeH5br0z72FimVTXBucVkLovJ6J/4Rxrr3R37PkSgQdo2sLZ1eHE/GTZQVGCmfL9W+7aFTKDx8clCvVFQ3lWjiUPGbCmTwmj56O/TgXzmsLZ+1zyJtzwozz1MR/uVvDdYQTvW+dV9YeJ4Jkv0UY55r5wv0m58eoIJzXFs5aYyZWItZQeXHG08OJlYhutFHkoXh62HWcm9z1ciaR4xjV2qxS4TRN6IrWWmN++OCgfQLLmQQaPTXxo1wbbhVpl8ImnM3XN7lr9L7Vy2q/atCMczB5zDoHbZTlTOLQnX+3n2a9b6E4T038qMwFRDhd9oX7v7QWZTDZZb9qMNklz79w/5d558TTQ8pQFpym0a5o0DlL6/IyeH3hFCU7NfGfsp2scjLfyZxDd57X5xy687yT9HK5Kxp0Gef+6//E9rQZJykzTlJGOL/F9rRNOPeNfovtaSOc/8j2tBknKTNOUkY4v8n2tBknKSOc32B72iacTde+wfa0Ec6NbE+bcZIy4yRlA+emb/tZXld1dbVxOt+6/W9/uHmA7V03NTUZOA/efu69Wy2u58RetZuamiKRyPj4uIaT7Wn7uY8KJZtwut4GhF2kEU73W0ewizHjJGXGScoIp/utI9jFmHGSMuMkZYTT/cYu7GJswul6Vxd2kUY43WwawS7eruG8Mn9q6pM/ph5Ho0v/J3dEsfHJiVf0VVfmT8ltaM7f/8WV+VOy83ZBkd0ZDQ4kDqMINvPPTb15ffE9uXmLeJBzU2+uI5xl6w/xruU78k+Mv5x3lfw1/Fmp9UpP/E3l/2E2uRJ1koy1qYuQsheIsn0KuqmTZylP443y3RgV5fri7wtaks6kjka26yXOVdxLiUOF7hL5Fmgm+g7zXJJze1pwoiLatxQ6YDmC8smzwenkgOY6bdaU7M+lrLxdfsqDs3wNXHriP0MlODH+Q5v5CP+lxKFcbXFQ2xr7sBdnW3IhsbbF0SOnM8nkSlRY2SUnnUkejbz4FLXFab/5LPpSnpHUSYeTlzPJI5EXc7XFQeBHF3/vsNvOVPqKfVsc0TcnstQn373dstWEXGmRg3CWtUsEqoJofaH08fGXbGZaG2/k7Z+h7PzRO9tsv/BS4m3U80O39YvFRlInXG68UeZ798TfkJ/fpn/N6OI5eWbvbLM9TjQ/V3sWeZqA53AfWG1tMoeSpI+z3bKpc/WvkYtlrbIVJzrNudphyXcXc9YQpystckw4y99ZAH37vpP+NXqTDPtODXl7LqBvij8bf30VnRp0o31Z0NrSdWoo9+1RTZVVQK1z9CYZ9jhHF87Zr0JfIW6l4hwJegrlnnsqcLZZ9rW17ug7p60RlDi7o6b3rbW+pt6AXzdvWR1O1FEp+/VZdx2nC70i0Ps2nh5BEyxvWqeNN9A+6Bj7rr4ENW/R+3kU2nij7cbmP0zvQSzlTh7uNt5wIQPV+9YYDc/sl0fDM/ud40TM+ud+oy+RSSdXIsqt4wSntQnMciZ58Na2pxcnKmLW3I7I8hdOsTwXTlRrHRvqnCRjLrItDkredZzuNHNB374/ttSr7FMTT48U2hYHlbs7+h9tN6rlzknLmWTH2HdW1xbHyjI8s4/b4lSfif9ULorejwZdF01tCmqLgzqxiMY66Miuri2O9ePP2FKvuz1x1ktbHNTxIvt1exP51K6uj4q14c7/Tu+WJ4uGLYU23rA280DtddZF4w0X80Dfvi+qY37TDq8CZ6ul1Yk9MCc41y3LdYTzWLQOFf23d1+Vr4Rn9q0OJ3rfyrJukbw41zNLjNPdxhvofSt/zX+J+qhcuN9UUOMN1Kknm82OfdzrbtHsG2+4mYqy24mOthicORpAKLaIDc5Dd15YtvwTcyh5LJc/fHDQdZxuNlFRdjuRjtHq+6goG+6MfRwuqI8KuosTnY79+Knuo6Jsi1OKPiqi1gX1URksHKcyk6eoj8rVhTPWouTqeaIb9UhR9l2Jp4csW0QRyqaPCrqLE3344NduNt5wHeehO8/H00OJlTHZeRuSnI79jzw/V/8TeY6ydU7zdf/VhTP6nKsLZ/LmZm9lJk8RTnaRNuF0vW8Eu0gzTlJmnKSMcLrf2IVdjE04Xe/qwi7SCKf7rSPYxZhxkjLC6X7rCHYxZpykzDhJGeF0v7ELuxibcLre1YVdpBFO91tHsIsx4yRlxknKBs5Nmzb5WR7X5s2bNZzifw8RY5GQhnN6etrtTFjFanp6+v8BfupZxiYzVHQAAAAASUVORK5CYII=" alt="" />

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容器的时候,必须指定它的高度。我们想想在日常生活中,我们要向一个桶里装水,肯定是提前知道它的容量的。

Adobe AIR and Flex - 实现堆栈容器的更多相关文章

  1. Adobe AIR and Flex - 保存序列化对象文件(译)

    创建任何桌面应用程序几乎总是需要在本地存储数据,通过Adobe AIR我们有几下面几个选择,一个是我们能够使用内置的 SQLite 数据库支持,对于少量的数据这是大材小用了.另外一个选择是我们通过把数 ...

  2. Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

    系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe ...

  3. 转:昨天去参加adobe AIR发布会

    昨天去参加adobe AIR发布会 2008-03-05 12:23 12547人阅读 评论(33) 收藏 举报 adobeairsliverlightwpf微软互联网 首先申明:我不是adobe雇佣 ...

  4. 【Adobe Air程序开发】用Adobe Flex3开发AIR应用程序–入门指南

    1 安装Adobe AIR 运行时,和java的JVM类似.Adobe AIR 运行时允许在桌面运行AIR应用程序,脱离游览器的束缚.下载安装文件http://labs.adobe.com/downl ...

  5. [转]Flash Player、AIR、Flex SDK 大全

    平时不断看到有朋友在各种论坛.空间.知道.群里求 Flash 平台各种版本的运行时(Flash Player)和SDK(Flex.AIR).今天就看到不下10次!所以决定把 Macromedia.Ad ...

  6. 解决adobe air sdk打包 apk后自动在包名前面加上air. (有个点)前缀的问题

    早就找到了这个方法,但是一直忙没心思写博客. 默认情况下,所有 AIR Android 应用程序的包名称都带 air 前缀.若不想使用此默认行为,可将计算机环境变量 AIR_NOANDROIDFLAI ...

  7. adobe air类app 接入腾讯开放平台移动游戏使用带tencent包名前缀的问题

    作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/4209159.html 原创文章,转载请注明作者和出处,未经允许不可用于商业营利活动 ------ ...

  8. Adobe AIR 中为不同尺寸和分辨率屏幕适配

    在 Adobe AIR 中为不同屏幕尺寸的多种设备提供支持 http://www.adobe.com/cn/devnet/air/articles/multiple-screen-sizes.html ...

  9. 开发Adobe AIR移动应用程序的考虑事项

    http://www.adobe.com/cn/devnet/air/articles/considerations-air-apps-mobile.html Adobe AIR 经过发展演进,已经超 ...

随机推荐

  1. tespeed-测试网速的Python工具

    1.安装(环境CentOS7) #pip install lxml #wget wget http://sourceforge.net/projects/socksipy/files/socksipy ...

  2. Spring MVC 教程,快速入门,深入分析

    http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: ...

  3. .NET简谈构件系统开发模式

    转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...

  4. MySQL类型转换

    mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过? BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [IN ...

  5. PLSQL_Oracle PLSQL内置函数大全(概念)

     2014-06-20 Created By BaoXinjian

  6. Codeforces Round #367 (Div. 2) Hard problem

    Hard problem 题意: 有n个字符串,对第i个字符串进行反转操作代价为ci. 要使n个字符串按照字典序从小到大排列,最小的代价是多少. 题解: 反转就是reverse操作,比如说45873反 ...

  7. mvc无法找到资源

    昨天装了vs2015,但是第二步没有完成.今天急急忙忙的用13打开一个mvc的项目,但是添加的控制器怎么都不能访问. 无法找到资源. 说明: HTTP 404.您正在查找的资源(或者它的一个依赖项)可 ...

  8. DataGridView操作

    C# DataGridView控件动态添加新行 DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如 ...

  9. 版本控制、SVN、VSS

    ylbtech-Miscellaneos: 版本控制.SVN.VSS 1.A,版本控制返回顶部 1, 版本控制(Revision control)是一种软体工程技巧,籍以在开发的过程中,确保由不同人所 ...

  10. this web application instance has been stopped already解决办法

    重启tomcat的时候出错 Illegal access: this web application instance has been stopped already.  Could not loa ...