`
yunzhongxia
  • 浏览: 650452 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内联渲染器上

    博客分类:
  • flex
阅读更多

       Flex 提供许多控制, 它们可以按不同方式显示大量数据。List 控制自己、DataGrid、Tree 以及包括图表和 AdvancedDataGrid 在内的可视类。默认情况下, Flex 列表控制将提供的数据显示为简单文本。但 Flex 的能耐远不止此, 列表控制提供了一种使用 itemRenderer 对其内容进行自定的方式。通过允许您使用 itemRenderer 完全控制列表每行 (或单元格) 的内容, Flex 使您能够编写出更引人注目、更具创意、更实用的应用程序。

本系列讨论 Flex itemRenderer 以及如何高效、有效地使用它们。本系列的第一部分侧重于内联 itemRenderer, 它们写入描述 List 控制的 MXML 标记中。之后的文章讨论使用 MXML 和 ActionScript 且更为复杂的 itemRenderer。

循环使用渲染器

人们经常尝试从列表外访问 itemRenderer。例如, 由于您刚从服务器那里收到新数据, 您可能要将 DataGrid 中第五行的第四列变为绿色。获取那个 itemRenderer 实例并在外部修改它对于 Flex 框架和组件模型而言是一个大工程。

要理解 itemRenderer, 您必须理解它们为何变成现在这样以及我们当初设计它们时的目的。在此, 当我用到“我们”时, 我指的是 Adobe Flex 设计小组。我与它没有关系。言归正传, 假设您要显示 1,000 条记录。如果您认为列表控制会创建 1,000 个 itemRenderer, 您就错了。如果列表只显示 10 行, 它会创建约 12 个 itemRenderer-这些足以显示各个可见行, 多出的几个则用于缓冲和性能。列表最初显示行 1–10。当用户滚动这个列表时, 它现在可能显示行 3-12。但那 12 个 itemRenderer 仍在那里: 及时滚动列表后, 也不会新建任何 itemRenderer。

以下是 Flex 执行的操作。滚动列表时, 那些依然显示相同数据 (行 3-10) 的 itemRenderer 将向上移动。它们并未发生任何变化, 只是移到了新位置。之前显示行 1 和 行 2 数据的 itemRenderer 现在移到行 10 的 itemRendere 下。然后, 为那些 itemRenderer 提供行 11 和 行 12 的数据。换言之, 除非您调整列表大小, 否则将重用/循环使用那些相同的 itemRenderer-它们只是移到新位置并且现在显示新数据。

Flex 的这一行为在特定编程环境中使情况变得更复杂。例如, 如果要更改第五行的第四列中某个单元格的背景色, 请注意如果用户滚动了该列表, 则该单元格的 itemRenderer 现在可能显示第二十一行的内容。

那么怎样进行这类更改呢?

itemRenderer 必须根据给它们显示的数据更改自己。如果列表的 itemRenderer 要根据数据值更改其颜色, 它必须查看获得的数据并更改自己。

内联 itemRenderer

我在本文中使用内联 itemRenderer 说明如何解决这个问题。内联 itemRenderer 直接写入 MXML 文件中列表控制出现的位置。我在下一篇文章中将说明如何编写外部 itemRenderer。内联 itemRenderer 最简单, 一般用于十分简单的渲染器或用于为较大的应用程序构建原型。内联 itemRenderer 本身并没有问题, 但随着代码变得复杂, 最好将它提取到自己的类中。

我将在所有示例中使用相同的数据: 一组书籍相关信息-作者、书名、出版日期和缩览图图像等。每个记录是一段 XML 代码, 如下:

<book>
    <author>Peter F. Hamilton</author>
    <title>Pandora's Star</title>
    <image>assets/pandoras_star_.jpg</image>
    <date>Dec 3, 2004</date>
</book>

我将从使用 <mx:List> 控制的一个简单 itemRenderer 开始。这里将列出作者, 后跟书名。

<mx:List x="29" y="67" dataProvider="{testData.book}"    width="286" height="190">
    <mx:itemRenderer>
        <mx:Component>
            <mx:Label text="{data.author}: {data.title}" />
        </mx:Component>
    </mx:itemRenderer>
</mx:List>

 

这个 itemRenderer 太简单了, 可能使用 labelFunction 会更好, 但它至少允许您专注于重要部分。首先, 内联 itemRenderer 使用 <mx:itemRenderer> 标记定义它。这个标记包含 <mx:Component> 标记。这个标记必须放在这里, 因为它会告诉 Flex 编译器您正在定义一个组件内联。我马上会说明这到底是什么意思。

您在 <mx:Component> 标记中定义 itemRenderer。对于本例, 它是一个 <mx:Label> 并且文本字段设置为一个数据绑定表达式: {data.author}: {data.title}这点很重要。List 控制通过设置 itemRenderer 的 data 属性, 为每个 itemRenderer 实例提供 dataProvider 的记录。对于上述代码, 它意味着对于任何给定列表行, 内联 itemRenderer 实例将自己的 data 属性设置为 <book> XML 节点 (如以上节点)。当您滚动列表时, data 属性也会更改, 因为 itemRenderer 被循环用于新行。

换言之, 行 1 的 itemRenderer 实例现在可能将其 data.author 设置为“Peter F. Hamilton”, 但当它滚出视图时, itemRenderer 被循环使用并且 (该 itemRenderer) 的data 属性现在可能将其 data.author 设置为“J.K. Rowling”。滚动列表时, 所有这一切都会自动进行-您不必操心。

以下是复杂一些的内联 itemRenderer, 它还是使用 <mx:List> 控制:

<mx:List x="372" y="67" width="351" height="190" variableRowHeight="true" dataProvider="{testData.book}">
   <mx:itemRenderer>
       <mx:Component>
           <mx:HBox >
               <mx:Image source="{data.image}" width="50" height="50" scaleContent="true" />
               <mx:Label text="{data.author}" width="125" />
               <mx:Text  text="{data.title}" width="100%" />
           </mx:HBox>
       </mx:Component>
   </mx:itemRenderer>
</mx:List>

 

确实区别不大。这次不是 <mx:Label>, itemRenderer 是一个 <mx:HBox> 并包含 <mx:Image><mx:Label><mx:Text> 控制。数据绑定依然将可视与记录关联在一起。

分享到:
评论
1 楼 nianshi 2010-12-07  
好。。。 

相关推荐

    flex中渲染器简介

    比如,如果你有一个包含1000条记录的列表,但只有10行在屏幕上可见,那么Flex只会创建足够的渲染器来展示当前和未来可能需要的可视行,通常会额外创建一些作为缓冲。这意味着,当用户滚动列表时,原有的渲染器会被...

    生成漂亮的和准确的印刷电路板SVG渲染器

    8. **响应式设计**:为了让SVG渲染器适应不同的屏幕尺寸,需要考虑响应式设计,确保在不同设备上都能正确显示。 9. **测试与调试**:在开发过程中,需要对各种PCB布局进行测试,确保渲染器的准确性和兼容性。可以...

    Swift-SwiftMark一个采用Swift编写的MarkdowntoHTML渲染器

    SwiftMark是基于Swift编程语言开发的一个Markdown到HTML的渲染器,它的主要功能是将Markdown格式的文本转换成HTML,使得内容可以以丰富的网页形式展示。Markdown是一种轻量级的标记语言,广泛用于编写文档、博客文章...

    Flex内联itemRenderer

    内联itemRenderer则意味着我们可以在不影响整个应用结构的情况下,直接在MXML代码中定义和使用这些渲染器,而不是将其作为一个独立的类文件。 在Flex中,我们可以使用MX或Spark组件库来创建itemRenderer。MX组件库...

    flutter_markdown:Flutter的Markdown渲染器

    Flutter的Markdown渲染器。 它支持,但不支持内联HTML。 概述 包将轻量级标记语言Markdown渲染到包含富文本表示形式的Flutter小部件中。 flutter_markdown建立在Dart 包的顶部,该包将Markdown解析为抽象语法树...

    django-improved-inlines:django 的内联对象渲染,基于 django-basic-apps + 过滤器 + 模板

    内联是一个模板过滤器,可与内联标记结合使用以将内容对象插入到其他内容片段中。 一个例子是将照片插入到博客文章正文中。 直接替换 django-basic-inlines/inlines 标记的一个例子是: &lt;inline type=...

    精选_内联汇编之32位程序_源码打包

    1. **性能优化**:对于计算密集型任务,例如矩阵运算、物理模拟或图形渲染,直接使用汇编可以避免不必要的函数调用开销,提高程序运行速度。 2. **硬件接口**:访问特定的硬件寄存器或设备控制器,如中断处理、DMA...

    谷歌内联框架最新版离线安装

    GCF通过在后台运行Chrome的渲染引擎,使得这些网站在IE上也能正常工作。这极大地提升了用户体验,因为用户不再需要升级浏览器或者使用其他浏览器来访问某些网站。 GCF的离线安装包设计是为了在网络连接不稳定或不...

    扩展官方文本字段以快速构建特殊文本,如内联图像、@somebody、自定义背景等_Dart_C++_下载.zip

    实现这个功能可能涉及使用自定义渲染器,解析文本中的特定标记或URL,并将其替换为图片组件。这样,用户可以插入图片链接,而应用则会解析并显示相应的图像。 3. **@somebody提及机制**: 这是一种常见的社交网络...

    mr:现代(epub)渲染器

    《现代EPUB渲染器——基于JavaScript的技术探索》 在当今数字化阅读盛行的时代,EPUB格式作为开放标准电子书格式之一,被广泛应用于电子阅读设备和软件中。EPUB文件本质上是一种基于XML和ZIP的复合文档,它允许内容...

    youtube-recyclerview,一个使用youtube的android sdk在recyclerview中内联播放youtube视频的黑例子.zip

    8. **性能优化**: 需要注意滚动流畅性,避免在滚动时不必要的计算和渲染,以及合理利用缓存来提高加载速度。 9. **许可证和合规性**: 使用开源项目时,需要遵守项目的许可证规定,确保你的应用符合YouTube服务条款...

    js获取内联样式的方法

    2. `element.currentStyle`:这是IE浏览器特有的一个属性,可以访问元素的最终渲染样式,它包括了内联样式、样式表中定义的样式以及浏览器默认样式。此属性在标准浏览器中并不存在,因此需要进行浏览器兼容性判断。 ...

    CSS 盒模型、块状元素与内联元素、CSS选择器

    ### CSS盒模型、块状元素与内联元素、CSS选择器 #### 一、CSS盒模型 CSS盒模型是理解CSS布局的关键概念之一。它定义了网页元素如何根据其CSS属性进行渲染。盒模型主要由四个部分组成: - **内容(Content)**:这...

    javascript控件开发之渲染对象

    这可以通过在渲染对象上添加事件监听器并在事件触发时调用相应的函数来实现。 4. **自定义组件**:如果你需要创建自己的控件,你需要定义其渲染逻辑,这通常涉及编写`render`方法或类似的函数,该函数根据当前的...

    inline-script-loader:加载依赖项时加载内联脚本

    内联脚本加载器是一种用于JavaScript开发的工具,它的主要功能是在执行代码的过程中动态加载内联脚本。这种加载方式可以提高应用的性能,因为只有在真正需要时才会下载和执行相关的脚本,从而减少了初始页面加载的...

    分布式渲染调度策略优化研究与实现.pdf

    分布式渲染调度策略优化研究与实现这篇论文主要探讨了如何提高分布式渲染任务的执行效率,并在研究...这些研究成果不仅在理论上对分布式渲染调度策略进行了完善,而且在实践上也为相关领域的工程师提供了参考和指导。

    Flex基础培训

    1. **内联式itemRenderer**:直接在列表组件的定义中嵌入自定义渲染器的代码。这种方式简单直接,适合简单的定制需求。 2. **独立itemRenderer**:将项目渲染器定义为单独的MXML文件或ActionScript类。这种方式更加...

    CaTeX:用Dart编写的Flutter快速数学TeX渲染器

    CaTeX是Flutter软件包,仅使用小部件和Flutter内联输出TeX方程(如LaTeX,KaTeX,MathJax等),无插件,无Web视图。等候接听请注意,此程序包当前处于保留状态。 这是因为我们目前主要从事其他工作。 因此,我们不能...

    react-aspen:适用于React应用程序的最先进的嵌套树渲染器

    它使用快TypedArray闪电的TypedArray表示数据,并使用react-window实现超高效渲染。 您可以定义哪些需要呈现和阿斯计算出的怎么样,同时留下你的长相100%incharge。内联重命名内联文件创建受信赖全球各地一些最...

Global site tag (gtag.js) - Google Analytics