- 浏览: 60747 次
- 来自: 北京
文章分类
最新评论
-
pengylfighting:
太感谢了
tomcat启动慢问题 -
shoushou2001:
很好很强大,
项目在tomcat中能运行,可是在WebLogic中部署就跑错的解决方案 -
java风:
严重错误 主要是程序的错误
WARN 为一般警告,比如ses ...
配置Log4j
理解itemRenderer
Flex中提供了大量用于数据呈现的组件,这其中,以List系列组件最为常见,使用也最频繁,比如ComBoBox、List、Tree、TileList、DataGrid等等。这些组件有一个共同的特性,那就是支持自定义itemRenderer,这个功能非常强大,能够帮助我们实现很多实用的功能.
项目渲染器(ItemRenderer)是ListBase类列表控件的重要属性,我们在平常工作中会经常自定义项目渲染器以实现该类控件的特殊显示效果。
默认的项目渲染器取决于组件类。TileList 和 HorizontalList 类使用 TileListItemRenderer;List 类使用 ListItemRenderer。DataGrid 类使用 DataGridColumn 中的 DataGridItemRenderer。
什么是itemRenderer?
itemRenderer,可以理解为数据的表现方式,具体地说,是指显示每一条数据时采用的形式。在使用数据处理类组件时,我们只需要把数据按照一定的格式组织好,然后赋予给组件,剩下的事就不用费心了。
每一个组件都有默认的itemRenderer,比如List组件:
List组件默认的itemRenderer类似Label组件,只简单显示一行文本。如右图所示,红色方框选中的是一个itemRenderer。
本质上,itemRenderer和其它容器类组件没有区别,里面可以包括任意的可视化元素,包括文本、图片、视频等,只要是Flex支持的视觉元素,都可以。
自定义itemRenderer
组件默认的itemRenderer都过于简单,如果想加强表现力,就必须创建个性化的itemRenderer。
自定义itemRenderer有两种方式:一种是嵌入式,直接写在组件的标签中,所有的代码都集中在一个MXML文件中;另一种是把itemRenderer独立出来,形成一个MXML组件或ActionScript类。
看下面图片,我用TileList控件的自定义ItemRenderer实现的效果:
代码下载:
http://files.cnblogs.com/aierong/Air_TestWin.rar
- <?xml version="1.0" encoding="utf-8"?>
- <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="145" height="41"
- horizontalScrollPolicy="off" verticalScrollPolicy="off">
- <mx:VBox width="40" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off">
- <mx:Image click="this.parentDocument.imgclick(event)"
- data="{data.label}" source="assets\tx.JPG" width="40"/>
- </mx:VBox>
- <mx:VBox width="95" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off">
- <mx:Label text="{data.label}" toolTip="{data.label}" />
- <mx:Image toolTip="点我查看视频" buttonMode="true"
- source="assets\camera.JPG" width="16" height="20" />
- </mx:VBox>
- </mx:HBox>
<?xml version="1.0" encoding="utf-8"?> <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="145" height="41" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:VBox width="40" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:Image click="this.parentDocument.imgclick(event)" data="{data.label}" source="assets\tx.JPG" width="40"/> </mx:VBox> <mx:VBox width="95" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:Label text="{data.label}" toolTip="{data.label}" /> <mx:Image toolTip="点我查看视频" buttonMode="true" source="assets\camera.JPG" width="16" height="20" /> </mx:VBox> </mx:HBox>
- <mx:ArrayCollection id="arrColl_keySetup">
- <mx:source>
- <mx:Array id="arr_keysetup">
- <mx:Object data="00" sel="false" label="aaa"/>
- <mx:Object data="11" sel="false" label="bbb"/>
- <mx:Object data="22" sel="true" label="ccc"/>
- </mx:Array>
- </mx:source>
- </mx:ArrayCollection>
- <mx:TileList id="tlist" maxColumns="1"
- dataProvider="{arrColl_keySetup}"
- itemRenderer="itemh"
- x="34" y="10" width="148">
- </mx:TileList>
<mx:ArrayCollection id="arrColl_keySetup"> <mx:source> <mx:Array id="arr_keysetup"> <mx:Object data="00" sel="false" label="aaa"/> <mx:Object data="11" sel="false" label="bbb"/> <mx:Object data="22" sel="true" label="ccc"/> </mx:Array> </mx:source> </mx:ArrayCollection> <mx:TileList id="tlist" maxColumns="1" dataProvider="{arrColl_keySetup}" itemRenderer="itemh" x="34" y="10" width="148"> </mx:TileList>
给TileList的itemRenderer属性赋值itemh,并绑定数组集合类就可以了。
动态指定itemRenderer
利用ClassFactory类可以动态指定itemRenderer
- private function initTileList():void
- {
- this.tlist.dataProvider=this.arrColl_keySetup;
- this.tlist.itemRenderer = new ClassFactory(itemh);
- }
- <mx:TileList id="tlist" maxColumns="1" x="34" y="10" width="148"
- creationComplete="initTileList()">
- </mx:TileList>
private function initTileList():void { this.tlist.dataProvider=this.arrColl_keySetup; this.tlist.itemRenderer = new ClassFactory(itemh); } <mx:TileList id="tlist" maxColumns="1" x="34" y="10" width="148" creationComplete="initTileList()"> </mx:TileList>
至于怎样在项目渲染器访问主调用应用中的成员,可用parentDocument来引用;
反过来,主调用应用要访问项目渲染器中的成员,一般都是通过在项目渲染器先派发事件,然后在主调用应用中注册事件侦听器来实现。
例如:在项目渲染器中点击图片事件,然后通知主调用应用
<mx:Image click="this.parentDocument.imgclick(event)"
data="{data.label}" source="assets\tx.JPG" width="40"/>
在主调用应用中定义:
public function imgclick(evt:MouseEvent):void
{
var img:Image=evt.currentTarget as Image;
Alert.show(img.data.toString());
}
记住得是public的,不同类之间是无法访问私有方法的
图片点击后效果图片:
其实上面的功能也可以用dispatchEvent来实现
先定义一个事件类
- package
- {
- import flash.events.Event;
- public class myEvent extends Event
- {
- public var data:String;
- public function myEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false,data:String="")
- {
- super(type, bubbles, cancelable);
- this.data=data;
- }
- }
- }
package { import flash.events.Event; public class myEvent extends Event { public var data:String; public function myEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false,data:String="") { super(type, bubbles, cancelable); this.data=data; } } }
然后在itemh中将事件调度到事件流中
- <mx:Image click="clickHandler(event)"
- data="{data.label}" source="assets\tx.JPG" width="40"/>
- private function clickHandler(evt:MouseEvent):void
- {
- var img:Image=evt.currentTarget as Image;
- dispatchEvent(new myEvent("img_click",true,true,img.data.toString()));
- }
<mx:Image click="clickHandler(event)" data="{data.label}" source="assets\tx.JPG" width="40"/> private function clickHandler(evt:MouseEvent):void { var img:Image=evt.currentTarget as Image; dispatchEvent(new myEvent("img_click",true,true,img.data.toString())); }
最后在主调应用中监听事件
- private function initTileList():void
- {
- this.tlist.addEventListener("img_click",onItemimg_click);
- }
- private function onItemimg_click(evt:myEvent):void
- {
- Alert.show(evt.data);
- }
- <mx:TileList id="tlist" maxColumns="1" x="34" y="10" width="148"
- dataProvider="{arrColl_keySetup}" itemRenderer="itemh"
- creationComplete="initTileList()">
- </mx:TileList>
private function initTileList():void { this.tlist.addEventListener("img_click",onItemimg_click); } private function onItemimg_click(evt:myEvent):void { Alert.show(evt.data); } <mx:TileList id="tlist" maxColumns="1" x="34" y="10" width="148" dataProvider="{arrColl_keySetup}" itemRenderer="itemh" creationComplete="initTileList()"> </mx:TileList>
其实也可以用<mx:itemRenderer>和<mx:Component>标签来声明itemRenderer
例如以上代码可以改为:
- <mx:Script>
- <![CDATA[
- import mx.controls.Image;
- import mx.controls.Alert;
- public function imgclick(evt:MouseEvent):void
- {
- var img:Image=evt.currentTarget as Image;
- Alert.show(img.data.toString());
- }
- ]]>
- </mx:Script>
- <mx:ArrayCollection id="arrColl_keySetup">
- <mx:source>
- <mx:Array id="arr_keysetup">
- <mx:Object data="00" sel="false" label="aaa"/>
- <mx:Object data="11" sel="false" label="bbb"/>
- <mx:Object data="22" sel="true" label="ccc"/>
- </mx:Array>
- </mx:source>
- </mx:ArrayCollection>
- <mx:TileList id="tlist" maxColumns="1"
- dataProvider="{arrColl_keySetup}"
- x="34" y="10" width="148">
- <mx:itemRenderer>
- <mx:Component>
- <mx:HBox width="145" height="41" horizontalScrollPolicy="off" verticalScrollPolicy="off">
- <mx:VBox width="40" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off">
- <mx:Image click="this.parentDocument.imgclick(event)"
- data="{data.label}" buttonMode="true" source="assets\tx.JPG" width="40"/>
- </mx:VBox>
- <mx:VBox width="95" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off">
- <mx:Label text="{data.label}" toolTip="{data.label}"/>
- <mx:Image toolTip="点我查看视频" buttonMode="true"
- source="assets\camera.JPG" width="16" height="20"/>
- </mx:VBox>
- </mx:HBox>
- </mx:Component>
- </mx:itemRenderer>
- </mx:TileList>
<mx:Script> <![CDATA[ import mx.controls.Image; import mx.controls.Alert; public function imgclick(evt:MouseEvent):void { var img:Image=evt.currentTarget as Image; Alert.show(img.data.toString()); } ]]> </mx:Script> <mx:ArrayCollection id="arrColl_keySetup"> <mx:source> <mx:Array id="arr_keysetup"> <mx:Object data="00" sel="false" label="aaa"/> <mx:Object data="11" sel="false" label="bbb"/> <mx:Object data="22" sel="true" label="ccc"/> </mx:Array> </mx:source> </mx:ArrayCollection> <mx:TileList id="tlist" maxColumns="1" dataProvider="{arrColl_keySetup}" x="34" y="10" width="148"> <mx:itemRenderer> <mx:Component> <mx:HBox width="145" height="41" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:VBox width="40" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:Image click="this.parentDocument.imgclick(event)" data="{data.label}" buttonMode="true" source="assets\tx.JPG" width="40"/> </mx:VBox> <mx:VBox width="95" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:Label text="{data.label}" toolTip="{data.label}"/> <mx:Image toolTip="点我查看视频" buttonMode="true" source="assets\camera.JPG" width="16" height="20"/> </mx:VBox> </mx:HBox> </mx:Component> </mx:itemRenderer> </mx:TileList>
(http://www.cnblogs.com/aierong/archive/2009/02/11/ItemRenderer.html )
itemRenderer的实现原理
itemRenderer的实现依赖于 AS3的一个重要特性:反射。反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式,比如实现动态创建类实例、方法等。示例如下:
- import flash.utils.getQualifiedClassName;var cls:Class = flash.display.MovieClip;var mc:MovieClip = new cls();
- trace(getQualifiedClassName(mc));
- //输出:flash.display::MovieClip
import flash.utils.getQualifiedClassName;var cls:Class = flash.display.MovieClip;var mc:MovieClip = new cls(); trace(getQualifiedClassName(mc)); //输出:flash.display::MovieClip
itemRenderer的本质是Class类型,组件获取数据后,动态生成itemRenderer的实例。
itemRenderer 的特点
可以被当作 itemRenderer的组件,都实现了mx.core.IDataRenderer接口或mx.controls.listClasses.IListItemRenderer接口,还有mx.core.listClasses.IDropInListItemRenderer接口,用来实现有下拉框组件的itemRenderer。不管怎样,组件都有data属性,这是一个存取器性质的函数。
itemRenderer的工作方式
首先要明白一点,组件并不是很简单地把数据一次显示。为了提高运行效率,组件在处理数据时,只是创建了适当数量的itemRenderer,来完成显示区域的数据显示,这样,当数据源的数据量很大时,也不会耗费系统的资源。而且,itemRenderer是根据需要创建,创建后又是反复使用,很绿色,很环保。当显示区域发生变化或者拉动滚动条时,组件只是更新itemRenderer的数据。
比如,TileList、List组件,如果数据源只有一条数据,显示区域可以同时显示十条,则开始时只创建一个itemRenderer,添加一条数据,再创建一个新的itemRenderer。当数据量超过显示区域的最大值10时,就不再创建新的itemRenderer,而是回收利用现有资源。
另外,TileList、List还会创建一个多余的 itemRenderer,用来检测itemRenderer的尺寸等,方便定位。
虽然itemRenderer是真正的环保战士,但如果我们使用不当,就会出现很多奇怪的现象,比如内存泄露就是一个很常见的问题。在Adobe官方的论坛上,就经常见到这类讨论。其实,理解了itemRenderer的动作原理,这些问题就不难找到解决方法。
itemRenderer性能提高
对大批量数据的时候 DataGrid 中采用很多 itemRenderer ,性能将是一个大问题。于是寻找有关权威文章,期望能有所收获。在 Peter Ent 的 blog 上还是得到了不少帮助,原文是英文,也有人做过翻译,我这里就简单提取一部分仅供参考。需要详细,建议查看原文。
当我们在用 itemRenderer 显示大量数据的时候,无论是在 DataGrid 或者是 AdvanceDataGrid ( Flex3 ),如果我们的 itemRenderer 效率低下,那么整个系统的性能将大受影响。这里列出几个比较好的建议:
不用 setStyle 方法的替代法
这里有个很好的例子,就是根据所在列的数据来变更具体要显示的控件,以此来达到变换背景色的目的。
<mx:Canvas>
<mx:Script><![CDATA
private function lessThanZero() : Boolean {
return data.price < 0;
}
]]></mx:Script>
<mx:Label text="{data.price}" color="#FF0000" visible="{lessThanZero()}" />
<mx:Label text="{data.price}" color="#00FF00" visible="{!lessThanZero()}" />
</mx:Canvas>
这种方法可比 setStyle 来得快多了,但是在程序设计上稍显麻烦。
这里还需要注意的几点:
-
避免把风格和数据进行绑定,数据随时在变, style 也随时在变的话可以想想它的性能。
-
采用 Canvas 或者继承 ListItemRenderer 来作为 itemRenderer 的主容器,这样便于你自己对各个空间进行控制
好例子:
http://blog.minidx.com/2008/10/03/1457.html
http://blog.minidx.com/2008/03/09/559.html
这里说的更好:
http://www.adobe.com/cn/devnet/flex/articles/itemrenderers_pt1.html
http://www.adobe.com/cn/devnet/flex/articles/itemrenderers_pt2.html
另外如何采用 UIComponent 作为 itemRenderer 的容器基类,有兴趣的朋友可以参考原文 ,这里不做翻译和解释,原文其实讲的很明白了。(http://wmcai.blog.163.com/blog/static/48024200831833343734/ )
- 尽量少用 itemRenderer ,能不用的尽量别用。
- 不要频繁的更改 itemRenderer 的风格 change style 。也就是很多人喜欢的 setStyle(‘’,’’) ,比如更具数据变化背景颜色之类的,其实这个是很要命的,数据量小没什么感觉,数据量大了,效果就出来了。
- 尽量不要用容器 Cantainer 作为 itemRenderer 的基类。也就是我们常用的 HBox 和 VBox ,我的建议是宁愿用 Canvas 也不要用前者。至于原因讲起来就复杂一些。如果对高级 flex 开发人员来讲,我们应该尽量用 UIComponent ,作为基类,也就是所有界面元素的父类。
***
这种方法可比setStyle来得快多了,但是在程序设计上稍显麻烦。 这里还需要注意的几点: 另外如何采用UIComponent作为itemRenderer的容器基类,有兴趣的朋友可以参考原文,这里不做翻译和解释,原文其实讲的很明白了。
不用setStyle方法的替代法
这里有个很好的例子,就是根据所在列的数据来变更具体要显示的控件,以此来达到变换背景色的目的。
<mx:Canvas>
<mx:Script><![CDATA
private function lessThanZero() : Boolean {
return data.price < 0;
}
]]></mx:Script>
<mx:Label text="{data.price}" color="#FF0000" visible="{lessThanZero()}" />
<mx:Label text="{data.price}" color="#00FF00" visible="{!lessThanZero()}" />
</mx:Canvas>
发表评论
-
Flex事件效果与渲染
2011-11-28 15:38 857触发器名称 对 ... -
SystemManager: Every Flex application’s best friend
2011-11-16 09:54 635SystemManager: Every Flex appli ... -
preloader
2011-11-14 15:55 466Flex 的默认的 Preloader, 平心而论,不是很 ... -
xml小心障眼
2011-11-11 18:13 0test.xml: <?xml version=& ... -
Flex的注释
2011-11-11 15:28 595一.在<mx:script>标签中写注释 1.用 ... -
flex与js交互
2011-11-09 16:47 522一、在JavaScript中调用Flex方法在Flex中可以用 ... -
Flex Data Binding详解
2011-11-09 15:33 536转载-- Data BindIng简单的说就是当绑定源 ... -
callLater解析
2011-11-09 11:10 712转载-- Flash的fl组件和Flex的mx组件 ... -
在Flex中让Tree绑定数据后自动展开树节点
2011-11-09 11:00 659转载-- 用Flex/Flash做开发的同志们应该会 ... -
flex百条常用知识
2011-11-07 11:12 0flex百条常用知识 【 ... -
Flex 自定义事件
2011-11-07 11:09 568Flex 自定义事件 public static co ... -
AS3 数据类型转换 (转)
2011-11-07 10:22 1194AS3 数据类型转换 (转) ... -
AS3中遍历xml
2011-11-07 10:16 643AS3中遍历xml ... -
flex 数据基础-使用XML和XMLList
2011-11-07 10:08 629flex 数据基础-使用XML和XMLList ... -
flex 数据基础-使用XML和XMLList
2011-11-07 10:07 860flex 数据基础-使用XML和XMLList ... -
Flex自定义事件用法指南
2011-11-06 11:09 630Flex自定义事件用法指南 本文向大家介绍一下Fle ... -
Flex的Array和ArrayCollection
2011-11-06 10:39 5081.array作为控件使用 FLEX3写法: ... -
flex命名空间
2011-11-04 11:17 0Flex 4带给我们的,是全新的命名空间。了解这些命名空间必 ... -
沙箱安全
2011-11-04 11:08 0Flex的最重要两个文件:MXML文件与AS文件。 M ... -
Module通信的几个方法
2011-11-04 11:02 0推荐:启网 - 专业的主机、服务器合租提供商 17hz.ne ...
相关推荐
### Flex ItemRenderer 的详细教程 #### 一、ItemRenderer 概述 在 Flex 开发中,ItemRenderer 是一种非常强大的工具,它允许开发者自定义列表(List)、数据网格(DataGrid)等控件中每一项的外观和行为。通过 ...
Flex中的itemRenderer有两种类型:内联itemRenderer和外部itemRenderer。内联itemRenderer直接嵌入在MXML文件中,而外部itemRenderer则是定义在独立的MXML或ActionScript类中。内联itemRenderer通常用于简单的定制...
内渲染器(ItemRenderer)是Flex、Flash Builder或者ActionScript等富互联网应用程序开发中的一个重要概念,主要用于自定义组件列表项的显示方式。在基于Adobe Flex的项目中,它允许开发者根据需要为数据列表(如...
在Flex4中,ItemRenderer是一种强大的工具,用于自定义数据Grid、List或其他数据绑定组件中的项显示方式。本文将深入探讨如何使用Flex4创建一个ItemRenderer,以实现类似雅虎聊天界面的效果,并介绍相关的核心概念和...
在Flex手机项目开发中,创建自定义的List组件ItemRenderer是一项常见的需求,目的是为了提供更加丰富和个性化的显示效果。本文将深入探讨如何利用IconItemRenderer来实现这一目标,同时结合具体的实例,介绍两种不同...
flex中经常会使用到渲染器,这里简要介绍一下渲染器的一些知识
### 理解 Flex_itemRenderer #### 一、Flex_itemRenderer 概述 Flex_itemRenderer 是 Flex 框架中的一个重要概念,它主要用于定义列表、数据网格等控件中的每一项是如何呈现的。通过自定义 itemRenderer,开发者...
在Flex编程中,ItemRenderer是一种关键的组件,用于在数据列表或树等容器中自定义显示数据项的方式。本文将深入探讨Flex项呈示器(ItemRenderer)的概念、使用方法,以及如何根据需求定制它来展示用户信息,如头像和...
Flex中的itemRenderer是一种关键的组件渲染机制,它允许开发者自定义列表或数据集项的显示方式。在Flex应用中,特别是在处理数据集如ArrayCollection时,我们常常需要以不同的方式展示每个项目,例如图片、文本或者...
在本话题中,我们将深入探讨如何使用`checkbox`和`combobox`作为`DataGrid`的`itemRenderer`和`headerRenderer`,以及实现全选、多选等功能。 首先,`itemRenderer`是`DataGrid`中用于自定义每一行数据项显示方式的...
在IT行业中,"itemRenderer提前加载问题"是一个与数据可视化和UI组件相关的技术挑战,尤其在使用Flex或ActionScript开发富互联网应用程序时。这个标题暗示了开发者可能遇到的一个常见问题,即ItemRenderer(项渲染器...
在Flex开发中,ItemRenderer是一种非常关键的组件,它允许我们自定义MX或者Spark列表类(如List、DataGrid等)中的数据项显示方式。ItemRenderer使得开发者能够以更个性化的方式展示数据,提升用户界面的视觉效果和...
在Flex开发中,ItemRenderer是一种非常关键的组件,它允许我们自定义数据项在列表或网格等容器中的显示方式。本篇文章将深入探讨如何利用ItemRenderer实现一个灵活且功能丰富的相册示例,同时也会涉及Flex中的一些...
默认的ItemRenderer可能无法满足所有需求,因此开发者通常需要创建自定义的ItemRenderer来改变单元格的外观和行为,比如在本例中可能是为了呈现更丰富的播表信息。 4. **背景色设置**: DataGrid的背景色可以通过...
在Flex4中,动态生成DataGrid以及应用客户化itemRenderer是一项关键技能,它允许开发者根据运行时的数据结构灵活地创建用户界面。以下是对这个主题的详细解释: 首先,`DataGrid`组件是Flex中用于展示表格数据的...
### Flex中的ItemRenderer详解 #### 一、ItemRenderer概述 在Flex中,为了展示大量数据,提供了多种控制组件,如List、DataGrid、Tree以及包括图表在内的可视化类(如AdvancedDataGrid)。默认情况下,这些列表...
Flex内联itemRenderer是Adobe Flex框架中的一种技术,用于自定义列表或数据网格组件中项的显示方式。在Flex开发中,我们经常会遇到需要个性化显示数据的情况,比如在一个列表中,我们希望每条数据不仅仅是一个简单的...
在ActionScript中,ItemRenderer是一种关键的组件,用于在数据驱动的UI组件中自定义数据项的显示方式。本教程将深入探讨如何创建和使用ActionScript自定义ItemRenderer,以及如何实现与上一个示例相同的效果。 首先...
Flex ItemRenderer 是Adobe Flex框架中的一个重要概念,它主要用于自定义MX和Spark组件列表视图(如List、DataGrid等)中的每一项显示样式。ItemRenderer允许开发者根据数据项的内容个性化呈现,提供更丰富的用户...
在ActionScript和Flex开发中,`ItemRenderer`是一种关键组件,用于自定义MX或Spark数据控件(如List、ComboBox等)中项呈现的方式。它允许开发者为数据集中的每一项提供独特的视觉表现,增强用户体验并提升应用的...