`
全能骑士
  • 浏览: 68879 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

flex itemRenderer使用(五):效率

    博客分类:
  • FLEX
阅读更多
如果您要显示大量 itemRenderer-无论在 DataGrid 还是在 AdvancedDataGrid 中-如果无法有效编写这些 itemRenderer, 您的应用程序性能可能受到负面影响。以下是一些可能有所帮助的提示:

•限制使用 itemRenderer 的列数。是否真的需要将每个列作为自定 itemRenderer?有时需要这样, 光芒太强是否会令用户头晕眼花?
•尝试不要过于频繁地更改 itemRenderer 中元素的样式。如果需要切换样式 (例如, 绿色用于正值, 红色用于负值) , 可考虑为这些样式创建两个控制预设并使其中一个可见。更改样式 Flex 中比较费时的任务之一。
•不要将 Containers 用作 itemRenderer 的基础。容器会占用大量资源。少量使用它们, 效果还不错; 但是根据 UIComponent 编写 itemRenderer 效率更高。

以下 itemRenderer 根据数据字段的值切换组件。
<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>


这比设置样式要快。要注意的其他事项包括:

•避免数据绑定到样式。更改样式不仅比大多数操作要慢, 而且在它上面添加数据绑定代码只会使它更糟。
•使用 Canvas 或扩展 ListItemRenderer 或作为 itemRenderer 的根。这允许您将控制放在各自上方。

扩展 UIComponent

目前编写 itemRenderer 最有效的方式是使用 ActionScript 类扩展 UIComponent。您可以全面控制代码, 并且渲染器也可以尽可能高效。

从上例切换样式开始, 编写一个扩展 UIComponent 的简单 itemRenderer。
package renderers
{
      import mx.controls.listClasses.IListItemRenderer;
      import mx.core.UIComponent;
 
      public class PriceItemRenderer extends UIComponent implements IListItemRenderer
      {
           public function PriceItemRenderer()
           {
                 super();
           }
      }
}


您会发现我不仅编写这个类来扩展 UIComponent, 还由它实施 IListItemRenderer 接口。这样做是有必要的, 因为 List 控制将需要任何渲染器实施该接口, 否则您会收到运行时错误, 因为列表尝试将渲染器转换为该接口。

如果阅读 IListItemRenderer 的相关文档, 您会发现这是一个许多其他接口的集合, UIComponent 会为您实施其中的大多数。但有一个 IListItemRenderer 扩展的接口是 UIComponent 不实施的:IDataRenderer。这需要您添加代码, 为 itemRenderer 类提供您一直使用的 data 属性。

如果您尝试不实施 IDataRenderer 就使用这个类, 则编译代码时会收到以下错误:

•1044:类 renderers:PriceItemRenderer 未实施名称空间 mx.core:IDataRenderer 中的接口方法 get data。
编辑这个类并将它更改为以下内容:

package renderers
{
      import mx.controls.listClasses.IListItemRenderer;
      import mx.core.UIComponent;
      import mx.events.FlexEvent;
 

      public class PriceItemRenderer extends UIComponent implements IListItemRenderer
      {
           public function PriceItemRenderer()
           {
                 super();
           }
           
    // Internal variable for the property value.

    private var _data:Object;
    // Make the data property bindable.

    [Bindable("dataChange")]
    // Define the getter method.

    public function get data():Object {

        return _data;

    }
    // Define the setter method, and dispatch an event when the property

    // changes to support data binding.

    public function set data(value:Object):void {

        _data = value;

        dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));

    }
   }
}


我直接使用 IDataRenderer 的 Flex 文档中的代码, 这样您都不用自己键入它。

移除它后, 您可以加入两个标签。

1.添加变量用于存放这两个标签。

private var posLabel:Label; private var negLabel:Label;
2.将 set data 函数修改为调用 invalidateProperties()。这很重要, 因为更改数据必须更改标签中的文本以及它们的可视性。

public function set data(value:Object):void {
         _data = value;
         invalidateProperties();
         dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
     }


调用 invalidateProperties() 会告知 Flex 框架在适当的时间调用 commitProperties() 函数。

3.覆盖 createChildren() 并创建标签, 添加它们以显示组件列表。注意, 除了创建标签外, 还会设置它们的样式和 visible 属性。
override protected function createChildren() : void        
{                
     super.createChildren();
     posLabel = new Label();           
     posLabel.visible = false;      
     posLabel.setStyle("color", 0×00FF00);       
     addChild(posLabel);               
     negLabel = new Label();           
     negLabel.visible = false;             
     negLabel.setStyle("color", 0xFF0000);           
     addChild(negLabel);       
}


4.覆盖 commitProperties() 以设置标签的文本和可视性。过去, 您一直通过覆盖 set data 进行这类更改, 如果您喜欢, 也可以在这个类中那样做。

override protected
function commitProperties():void           
{                
     super.commitProperties();
     posLabel.text = data.price;
     negLabel.text = data.price;    
     posLabel.visible = Number(data.price) > 0;     
     negLabel.visible = Number(data.price) < 0;           
}


5.覆盖 updateDisplayList() 以设置标签大小并进行定位。您必须设置标签大小, 因为它们的默认大小为 0×0。这是 Container 类将为您做的另一件事。由于这个 itemRenderer 十分简单, 您只需将标签大小设置为与 itemRenderer 大小匹配即可。

override protected function updateDisplayList(
unscaledWidth:Number, unscaledHeight:Number ) : void
{        
     super.updateDisplayList(unscaledWidth, unscaledHeight);         
     posLabel.move(0,0);   
     posLabel.setActualSize(unscaledWidth,unscaledHeight);     
     negLabel.move(0,0);       
     negLabel.setActualSize(unscaledWidth, unscaledHeight);   
}


所有这些只能做到这点似乎有点复杂, 但是请记住一点, 使用容器增加的代码要比这多得多。


UIComponent 类是所有可视 Flex 组件 (控制和容器) 的基础。以下是将 UIComponent 用作 itemRenderer 的一些相关提示。

•UIComponent 对其子代 (如 Container) 没有版面限制。您必须自己进行子代定位并调整大小。
•还可以超出 updateDisplayList() 中指定的大小绘制图形和位置子代。
•如果准备在列表中使用 variableRowHeight, 您还应覆盖 measure() 函数, 告知列表 itemRenderer 有多大。
•要将 UIComponent 用作 itemRenderer, 您必须实施 IDataRenderer。
•要使用 listData 属性, 您必须实施 IDropInListItemRenderer; 本系列之前的文章中讨论过这个操作。
分享到:
评论

相关推荐

    理解 Flex_itemRenderer

    Flex 框架为了提高性能和资源利用效率,采用了一种称为 “Renderer 复用” 的机制。这意味着并不是每一个数据项都会对应一个全新的 renderer 实例,而是通过重用已有的 renderer 实例来减少内存消耗。 ##### 示例:...

    Flex4.x 构建可编辑的List【带序号排列】

    在Flex4.x中,List通过数据提供者(dataProvider)来获取要显示的数据,并使用ItemRenderer来决定每个数据项如何显示。 2. **数据绑定**:在Flex中,数据绑定是一种将UI组件的属性与应用程序数据模型关联起来的方法...

    Flex高级组件详细介绍

    - **组件构建**:在Flex中引用素材并构建组件,例如使用`Image`组件作为`ItemRenderer`。 示例代码: ```xml &lt;mx:DataGridColumn headerText="满意度" dataField="sat"&gt; &lt;mx:itemRenderer&gt; &lt;mx:Component&gt; ...

    Flex中DataGrid和其它控件使用

    本篇文章将深入探讨Flex中的DataGrid及其与其他控件的协同使用。 首先,DataGrid的核心功能是显示数据集合。它可以绑定到ArrayCollection或XMLListCollection等数据源,通过数据提供程序(DataProvider)动态更新...

    flex面试题

    Flex面试题涵盖了许多关键知识点,包括Flex容器的滚动条控制、项目类型、RSL(Runtime Shared Libraries)的使用、SWC文件的制作、文件优化、数据类型比较、事件处理、MVC模式应用以及自定义组件的创建。下面将对...

    DataGrid的itemRenderer and HeaderRenderer

    在本话题中,我们将深入探讨如何使用`checkbox`和`combobox`作为`DataGrid`的`itemRenderer`和`headerRenderer`,以及实现全选、多选等功能。 首先,`itemRenderer`是`DataGrid`中用于自定义每一行数据项显示方式的...

    FLEX中DATAgird的学习

    总结起来,理解并熟练使用 `editorDataField`、`itemEditor` 和 `itemRenderer` 是在 Flex 中有效利用 `DataGrid` 编辑功能的关键。通过它们,你可以定制单元格的编辑行为,同时确保数据的正确保存和管理。通过绑定...

    Flex面试题及答案

    RSL(Runtime Shared Libraries)是一种在运行时动态加载的共享库,它能够提高应用程序的性能和内存使用效率。相比于静态链接库(SWC文件),RSL的优势在于减少应用程序的初始下载时间和文件大小,因为它只需要在...

    Flex试题 .txt

    Flex Builder 3是Adobe为Flex开发者提供的集成开发环境(IDE),旨在提高开发效率。其主要目标包括:提供代码编辑、调试、性能优化工具,以及与Flex SDK的无缝集成,支持多种项目类型如Flex项目、ActionScript项目和...

    Flex itemEditor详解

    本文旨在详细介绍`itemEditor`的使用方法及其在Flex项目中的实际应用。 #### 二、理解Flex ItemEditor ##### 2.1 ItemEditor与ItemRenderer的区别 在深入探讨`itemEditor`之前,我们需要先了解它与`itemRenderer`...

    flex 第一步的bug

    - **ID名称规范**:在Flex中,ID名称遵循一定的命名规则,通常建议使用小写字母,以便于阅读和统一。 **6. P66页,List组件功能增强** - **原错误**:在描述List组件功能时,原书中表述不清晰。 - **修正内容**:...

    Flex拓扑图精品文档

    - **自定义组件**:开发者可以使用自定义组件来扩展`itemRenderer`的功能。需要注意的是,对于`edgeRenderer`,所使用的组件必须继承自`IEdgeRenderer`接口。 #### 三、Birdeye(RaVis)的特点及应用场景 - **简介...

    flex 数据绑定 dataGrid.rar

    Flex数据绑定是Adobe Flex开发中的核心特性之一,它允许开发者将UI组件的属性与应用程序的数据模型直接关联。在本示例中,我们关注的是如何在Flex...了解并熟练运用这些知识点,能够提升Flex应用的用户体验和开发效率。

    flex中dataGrid全选和全不选功能

    在Flex框架中,DataGrid是用于展示数据列表的常用组件之一。它提供了丰富的特性来处理数据,包括排序、过滤和...通过以上步骤,我们可以在Flex的DataGrid中成功实现全选和全不选功能,提升数据操作的效率和便利性。

    Flex基础培训-3-组件和布局

    3. **实现ValueObject类**:ValueObject类通常作为数据模型在Flex应用中使用。它是一种轻量级的数据容器,仅存储数据和访问这些数据的简单方法。ValueObject类的对象可以映射到DataGrid中的行,每个对象的属性可以...

    Flex Tree XML

    "Flex Tree XML"这个主题,就是关于如何使用XML数据源来填充和操作Flex中的Tree组件。在这个小例子中,我们将深入探讨如何将XML数据转换为可交互的树形结构。 一、XML数据源与Flex Tree组件 在Flex中,Tree组件...

    DataGridCombox下拉列

    要将自定义的`DataGridCombox` 显示在`DataGrid` 的特定列中,我们通常会使用`CellFactory` 或自定义的`ItemRenderer`。`CellFactory` 是一个函数,返回一个组件实例,而`ItemRenderer` 是一个类,负责渲染`...

    从头开发Flex树遇到的问题

    Flex是Adobe开发的一种开源框架,用于构建富互联网应用(RIA),它使用ActionScript编程语言和MXML标记语言。在从头开发Flex树的过程中,开发者可能会面临各种问题,包括但不限于数据绑定、组件设计、事件处理以及...

    SingleClickCellEditor

    综上所述,`SingleClickCellEditor`是Flex 4.5中提高数据网格编辑效率的一个实例,它利用`itemRenderer`、`DateForm`和`ColorPicker`等组件,提供了直观且高效的用户交互。这个例子展示了如何通过自定义渲染器和组件...

Global site tag (gtag.js) - Google Analytics