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

外部渲染器下

    博客分类:
  • flex
阅读更多

ActionScript itemRenderer

现在, 您将编写另一个 itemRenderer, 这次使用 ActionScript 类。在上一篇文章中, 有一个 TileList 包含这个内联 itemRenderer:

<mx:itemRenderer>
		<mx:Component>
			<mx:HBox verticalAlign="top">
				<mx:Image source="{data.image}" />
				<mx:VBox height="115" verticalAlign="top" verticalGap="0">
					<mx:Text text="{data.title}" fontWeight="bold" width="100%"/>

					<mx:Spacer height="20" />
					<mx:Label text="{data.author}" />
					<mx:Label text="Available {data.date}" />
					<mx:Spacer height="100%" />
					<mx:HBox width="100%" horizontalAlign="right">
						<mx:Button label="Buy" fillColors="[0x99ff99,0x99ff99]">

							<mx:click>
							<![CDATA[
								var e:BuyBookEvent = new BuyBookEvent();
								e.bookData = data;
								dispatchEvent(e);
							]]>
							</mx:click>
						</mx:Button>

					</mx:HBox>
				</mx:VBox>
			</mx:HBox>
		</mx:Component>
	</mx:itemRenderer>

 

您将把它转变为一个 ActionScript 外部 itemRenderer。您需要执行以下步骤:

  1. 新建一个 ActionScript 类。将它命名为 BookTileRenderer.as 并使它扩展 HBox, 就像内联 itemRenderer 那样。

    package
    {
    	import flash.events.MouseEvent;
    	
    	import mx.containers.HBox;
    	import mx.containers.VBox;
    	import mx.controls.Button;
    	import mx.controls.Image;
    	import mx.controls.Label;
    	import mx.controls.Spacer;
    	import mx.controls.Text;
    	
    	public class BookTileRenderer extends HBox
    	{
    		public function BookTileRenderer()
    		{
    			super();
    		}
    		
    	}
    }

     

  2. 创建成员变量, 用于存放子组件的引用。
    private var coverImage:Image;
    private var titleText:Text;
    private var spacer1:Spacer;
    private var authorLabel:Label;
    private var pubdateLabel:Label;
    private var spacer2:Spacer;
    private var buyButton:Button;
     
  3. 覆盖 createChildren() 函数以创建子组件, 并将它们添加到 HBox。
    override protected function createChildren():void
    		{
    			coverImage = new Image();
    			addChild(coverImage);
    			
    			var innerBox:VBox = new VBox();
    			innerBox.explicitHeight = 115;
    			innerBox.percentWidth = 100;
    			innerBox.setStyle("verticalAlign","top");
    			innerBox.setStyle("verticalGap", 0);
    			addChild(innerBox);
    			
    				titleText = new Text();
    				titleText.setStyle("fontWeight","bold");
    				titleText.percentWidth = 100;
    				innerBox.addChild(titleText);
    			
    				spacer1 = new Spacer();
    				spacer1.explicitHeight = 20;
    				innerBox.addChild(spacer1);
    			
    				authorLabel = new Label();
    				innerBox.addChild(authorLabel);
    			
    				pubdateLabel = new Label();
    				innerBox.addChild(pubdateLabel);
    			
    				spacer2 = new Spacer();
    				spacer2.percentHeight = 100;
    				innerBox.addChild(spacer2);
    			
    				var buttonBox:HBox = new HBox();
    				buttonBox.percentWidth = 100;
    				buttonBox.setStyle("horizontalAlign","right");
    				innerBox.addChild(buttonBox);
    			
    					buyButton = new Button();
    					buyButton.label = "Buy";
    					buyButton.setStyle("fillColors",[0x99ff99,0x99ff99]);
    					buyButton.addEventListener(MouseEvent.CLICK, handleBuyClick);
    					buttonBox.addChild(buyButton);
    		}
     我准备通过这一代码显示父子关系。同时, 确保在 Buy 按钮中包含一个事件侦听器。
  4. 覆盖 commitProperties() 函数, 并从数据设置用户界面控制。
    	override protected function commitProperties():void
    		{
    			super.commitProperties();
    			
    			coverImage.source = data.image;
    			titleText.text = data.title;
    			authorLabel.text = data.author;
    			pubdateLabel.text = data.date;
    		}
     
  5. 为 Buy 按钮添加单击事件处理函数。
    private function handleBuyClick( event:MouseEvent ) : void
    		{
    			var e:BuyBookEvent = new BuyBookEvent();
    			e.bookData = data;
    			dispatchEvent(e);
    		}
     
  6. 将主应用程序中的 TileList 修改为使用 itemRenderer ActionScript 类。只需删除 inlineItemRenderer 并将它替换为标记中的 itemRenderer 属性。
    <mx:TileList id="mylist" x="29" y="542" width="694" itemRenderer="BookTileRenderer" 
           dataProvider="{testData.book}" height="232" columnWidth="275" rowHeight="135" >
     

 如果要使用一个现有容器类, 如 HBox, 我不会使用 ActionScript 这样做。您会发现它比使用 MXML 文件复杂, 并且老实说, 性能方面几乎没有任何优势。

可重用的 itemRenderer

以下是一个 itemRenderer 示例, 它使用 CurrencyFormatter 显示一个数值。我称之为 PriceFormatter:

<?xml version="1.0" encoding="utf-8"?>
<mx:Text xmlns:mx="http://www.adobe.com/2006/mxml">

	<mx:Script>
		<![CDATA[
			import mx.controls.dataGridClasses.DataGridListData;
			
			[Bindable] private var formattedValue:String;
			
			override public function set data(value:Object):void
			{
				super.data = value;
				
				formattedValue = cfmt.format( Number(data[(listData as DataGridListData).dataField]) );

			}
		]]>
	</mx:Script>
	
	<mx:CurrencyFormatter precision="2" id="cfmt" />
	
	<mx:text>{formattedValue}</mx:text>
	
</mx:Text>

 

这个 itemRenderer 的关键部分以红色标出, 设置可绑定变量 formattedValue。首先, 您会发现 <mx:CurrentFormatter> 使用 id cfmt 定义为 MXML 标记 (如果您愿意, 也可以使用 ActionScript 这样做)。在上例中, formattedValue 设置为 CurrentFormatter 的 format() 函数的调用结果。

此函数将 Number 作为其参数类型, 所以值被转换为 Number-这是因为列表的 dataProvider 是 XML 并且 XML 中的所有内容是文本; 如果为数据使用 Object 并且您有实际数值, 执行 Number 转变将是无害的。

如您所知, 数据是存放 itemRenderer 所显示项目的属性。使用 [ ] 记号是访问数据项目字段的另一种方法。例如, data['price'] 是价格列。但是为了使这个 itemRenderer 可重用, 您不能为特定字段编码, 所以需要一种更普通的方法。

此时, listData 登台亮相。实施 IDropInListItemRenderer 接口的所有 Flex 组件都有一个 listData 属性。

注意: Text、Label、Button、CheckBox 等大多数控制都实施 IDropInListItemRenderer。HBox、Canvas 等大多数容器实施此接口。如果要在扩展 Container 的 itemRenderer 中使用 listData, 您必须自己实施 IDropInListItemRenderer; 我将在下一篇文章中讨论这个问题。

除了其他内容, 提供给 itemRenderer 的 listData 还包含 rowIndex 和控制, 该控制拥有 itemRenderer-DataGrid、List 或 TileList。将 itemRenderer 用于 DataGrid 时, listData 实际上是一个 DataGridListData 对象-它包含 columnIndex 以及与 DataGridColumn 关联的 dataField。以下是上述语句的明细, 从内部开始:

  • listData as DataGridListData-它将 listData 转换为 DataGridListData 对象, 使您能访问它的 dataField
  • .dataField-该字段用于渲染的列。它使这个 itemRenderer 变得一般。可以将这个 itemRenderer 用于多个列。在本例中, dataField 是“price”。
  • data[ ... ]-它访问项目中特定字段的数据。在本例中, 它是价格列。
  • Number( ... )-它将值转换为 Number, 因为 format() 函数需要一个 Number 参数。
  • cfmt.format( ... )-它将值格式化为货币。
分享到:
评论

相关推荐

    flex中渲染器简介

    Flex 渲染器是Flex框架中的一个重要特性,主要用于在列表控件如List、DataGrid、Tree等中定制数据显示。在Flex中,渲染器允许开发者自定义列表中每一项的外观和行为,以此来提高用户体验和视觉吸引力。本系列将深入...

    VRay[1].Adv.1.5.RC3.渲染器汉化版

    《VRay 1.5 RC3 渲染器汉化版详解》 在计算机图形学领域,渲染器作为核心组件,对于最终图像质量和效果起着决定性的作用。VRay,由 Chaos Group 开发,是一款广泛应用的高质量渲染软件,广泛应用于建筑设计、电影...

    vray 渲染器2008

    在2008年,V-Ray 1.5 SP1是该渲染器的一个重要版本,提供了许多增强的功能和优化,使得3D艺术家能够创建更为逼真和高效的视觉效果。 首先,V-Ray 1.5 SP1的核心渲染技术得到了显著提升。它引入了先进的全局光照算法...

    Go-FauxGL纯Go实现的3D软件渲染器

    总的来说,Go-FauxGL提供了一个独特的机会,让开发者能够在不依赖外部库的情况下探索和实现3D图形渲染,这对于那些对图形编程感兴趣的Go程序员来说,是一个极好的学习和实验平台。通过研究和修改这个项目,你可以...

    19.3 LVGL使用外部SRAM.rar

    这个“19.3 LVGL使用外部SRAM”主题主要关注如何在资源有限的嵌入式设备上,利用LVGL库将图形渲染的数据存储到外部SRAM(Static Random-Access Memory)中,以提高性能和扩展内存空间。 首先,我们需要了解SRAM的...

    外部关联表格的某一个字段的值来符号化一个图层

    3. **创建渲染器**:创建一个独特的值渲染器(`Unique Value Renderer`),该渲染器可以基于属性表中的特定字段(如人口数量)为每个地理要素分配不同的符号。 4. **设置渲染器属性**: - **色彩设置**:创建一个...

    基于c++控制台的3D第一人称射击(FPS)游戏,项目包含软件渲染器、游戏引擎层、游戏逻辑层【c++大作业】

    【作品名称】:基于c++控制台的3D第一人称射击(FPS)游戏,项目包含软件渲染器、游戏引擎层、游戏逻辑层【c++大作业】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大...

    mentalray独立渲染器教程.pdf

    ### mentalray独立渲染器教程知识点解析 #### 一、mental ray独立版本介绍 - **mental ray简介**:mental ray是一款高性能的渲染引擎,被广泛应用于电影特效、建筑可视化及产品设计等多个领域。它以其强大的光线...

    像素:简单HTML画布像素艺术渲染器

    像素 :alien_monster: 一个简单HTML画布像素艺术渲染器。快速开始添加到项目包含在您HTML中。 &lt; script src =" path/to/pixels.js " &gt; &lt;/ script &gt;创建调色板调色板是有效颜色字符串的数组。 const ...

    vue使用three.js引入外部obj,mtl模型.zip

    为了在网页上展示这个3D模型,还需要设置场景、相机和渲染器。通常,我们会在`init()`方法中创建这些: ```javascript const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window....

    retro-ngon:用于HTML5画布的软件3D渲染器。 使用强大的复古效果栅格化n面多边形。 具有:简化的API,pixelvertex着色器,异步渲染,文档等

    复古n-gon渲染器 现代JavaScript中的老式软件3D渲染器。 提供一个简单,简化的API,用于将n边的多边形以及点和线栅格化到HTML5画布(或独立的ImageData对象)中。 您可以查看各种交互式渲染示例。 请注意,尽管...

    stage.gl:迷你WebGL渲染器模板

    `stage.gl`是一个迷你WebGL渲染器模板,主要针对JavaScript开发人员,它提供了一个简洁的基础框架,用于快速搭建WebGL应用。在WebGL技术中,它扮演着简化和加速开发过程的角色,帮助开发者避免从零开始构建复杂的...

    io_export_blend_to_renderer:Blender Addon将Blender场景导出到不同的渲染器

    Blender插件以用于外部渲染器的格式导出Blender场景文件。 与Blender 2.79兼容的插件。 外部渲染器 PBRT 将选定的网格,灯光,摄像机导出为PBRT v3场景格式。 成分 特征 网格 所有选定的网格都将导出到models目录...

    documentation.pdf

    根据给定文件信息,本段内容将详细介绍Mitsuba渲染器的文档内容,包括但不限于Mitsuba渲染器的基本介绍、构建指南、使用方法、场景文件格式和插件参考等重要知识点。 ### Mitsuba渲染器基础 文档首先介绍了Mitsuba...

    threejs给模型添加外部轮廓demo

    在"outline_demo_mine"这个文件中,可能包含了实现以上步骤的代码示例,例如加载模型、创建和配置轮廓、以及设置渲染器的代码片段。你可以通过查看和学习这些代码来理解具体实现细节,并根据自己的需求进行调整。 ...

    VirtualReality:适用于MATLAB的Virtual Reality渲染器

    标题提到的"VirtualReality:适用于MATLAB的Virtual Reality渲染器"正是这个工具箱的一个实例,它允许用户创建和探索虚拟世界,同时进行数据可视化和实验模拟。 MATLAB中的Virtual Reality渲染器是一个强大的组件,...

    pdfrenderer:客户端PDF渲染器

    客户端PDF渲染器 增强客户端PDFKit: 添加HTML原语,例如h1,h2,h3,p,img,br,hr,表。 可以采用一个SimpleSchema,对其进行解析并呈现。 支持国际化。 可以渲染外部图像或CollectionFS中的图像。 支持常规...

Global site tag (gtag.js) - Google Analytics