1.需求描述:

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

aaarticlea/png;base64,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" 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. 获取网页URL地址及参数等的两种方法(js和C#)

    转:获取网页URL地址及参数等的两种方法(js和C#) 一 js 先看一个示例 用javascript获取url网址信息 <script type="text/javascript&q ...

  2. [platform]linux platform device/driver(一)--Driver是如何找到对应的device

    1.platform device是怎么"自动"关联到platform driver上的? 转向linux driver有些时间了,前段时间碰到个问题,在Linux kernel ...

  3. Android三-AsyncTask

    基础介绍:http://blog.csdn.net/liuhe688/article/details/6532519 扩展知识:http://blog.csdn.net/pipisky2006/art ...

  4. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  5. C产品狗

    作者:郭琦链接:https://www.zhihu.com/question/29342383/answer/110823046来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  6. HDU 2176 取(m堆)石子游戏(Nim)

    取(m堆)石子游戏 题意: Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,1 ...

  7. mysql 正则

    mysql 正则学习 基本字符匹配 select desk from dealer_info where desk regexp "82107777"; . 表示匹配任意一个字符 ...

  8. 转--Android资源总结(环境搭建/ 反编译工具)

    在Android发展前景相当好的情况下,本人最近搜集了一些关于Android的相关资源,当然包含以前发布的博客内容,进行了一次大整合,希望对和我一样是Android的初学者管用,如在文章中有所错误,敬 ...

  9. 编译器错误消息: CS0234: 命名空间“Purple”中不存在类型或命名空间名称“Model”(是否缺少程序集引用?)

    编译错误 “/storeimg”应用程序中的服务器错误. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS023 ...

  10. linux下shell脚本学习

    在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.您可以通过使用shell使大量的任务自动化,shel ...