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、具体实现

 /**
* Created with IntelliJ IDEA.
* @author: DongYang
* Date: 13-7-24
* Time: 上午10:22
* Progress every day a little more.
*/
package component.charts.layout
{
import mx.core.ILayoutElement;
import mx.core.UIComponent; import spark.layouts.BasicLayout; public class StackLayout extends BasicLayout
{
public function StackLayout()
{
super();
}
private var _gap:int = 6; public function get gap():int
{
return _gap;
} public function set gap(value:int):void
{
_gap = value;
if(!this.target) return;
target.invalidateDisplayList();
target.invalidateSize();
} override public function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
if(!this.target)
return; var layoutElement:ILayoutElement;
var count:uint = target.numElements; var h : Number = target.height;
var depth:Number=0; for (var i:int = 0; i < count; i++)
{
layoutElement = target.getElementAt(i); if (!layoutElement || !layoutElement.includeInLayout)
continue; var _eh:Number=UIComponent(layoutElement).height;
var _y:Number=0;
if(i==0){
depth=depth+_eh;
}else{
depth=depth+_eh+gap;
}
_y=h-depth;
layoutElement.setLayoutBoundsPosition( 0, _y );
}
} }
}

4、使用方法

让容器的layout实例等于 new StackLayout();

如:

 /**
* Created with IntelliJ IDEA.
* @author: DongYang
* Date: 13-7-25
* Time: 上午11:41
* Progress every day a little more.
*/
package component.charts.container {
import component.charts.layout.StackLayout; import spark.components.Group; public class StackGroup extends Group {
public function StackGroup() {
super();
_lay=new StackLayout();
this.layout=_lay;
}
private var _lay:StackLayout;
private var _gap:Number=6; public function get gap():Number {
return _gap;
} public function set gap(value:Number):void {
_gap = value;
_lay.gap=value;
}
}
}

其中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. 【Properties文件】Java使用Properties来读取配置文件

    配置文件位置及内容 执行结果 程序代码 package Utils.ConfigFile;   import java.io.BufferedInputStream; import java.io.B ...

  2. Tortoise SVN Clean up失败的解决方法

    step1: 到 sqlite官网 (http://www.sqlite.org/download.html) 下载 sqlite3.exe (找到 Precompiled Binaries for ...

  3. Java的外部类和内部类+静态变量和非静态变量的组合关系

    看的李刚<疯狂java讲义>,里面讲内部类的地方感觉有点散而且不全,看完之后还是不十分清楚到底怎么用,于是自己写了个程序测试了一下.看如下代码,即可知道外部类和内部类+静态成员和非静态成员 ...

  4. Cygwin之SSH服务安装过程问题

    1.折磨了最长时间的一个问题 $ ssh localhostssh: connect to host localhost port 22: Connection refused 各种google,百度 ...

  5. [Java Web – 3A] – Spring MVC开发注意事项

    1.使用Maven构建项目 2.SpringMVC 绝对路径的问题 首先要明确一点,在html中,资源文件也是有自己的URL,即href中是支持绝对路径.如下代码: <link href=&qu ...

  6. SparkStreaming入门及例子

    看书大概了解了下Streaming的原理,但是木有动过手啊...万事开头难啊,一个wordcount 2小时怎么都运行不出结果.是我太蠢了,好了言归正传. SparkStreaming是一个批处理的流 ...

  7. ADF_Starting系列4_使用ADF开发富Web应用程序之维护User Interface(Part1)

    2014-05-04 Created By BaoXinjian

  8. C语言sizeof

    一.关于sizeof 1.它是C的关键字.是一个运算符,不是函数: 2.一般用法为sizeof 变量或sizeof(数据类型):后边这种写法会让人误认为是函数,但这种写法是为了防止和C中类型修饰符(s ...

  9. NSMutableAttributedString 设置不同颜色,不同字体的String

    UILabel *infoLabel = [[UILabel alloc]initWithFrame:CGRectMake(95, 20, 190, 70)]; infoLabel.backgroun ...

  10. 在ubuntu下安装phpmyadmin 出现404错误

    在ubuntu下安转phpmyadmin 只要一条命令: Sudo apt-get install phpmyadmin 安装完成后,在浏览器里输入http://localhost/phpmyadmi ...