flex itemRenderer使用(二)外部渲染器
在本系列的第 1 部分中, 我向您展示了如何创建内联 itemRenderer-这种 itemRenderer 的 MXML 标记和 ActionScript 代码与使用该 itemRenderer 的列表位于同一文件中。代码与文件中的其余代码内联。
您应该还记得我说过, 应该将内联 itemRenderer 视作单独的类。事实上, Flex 编译器提取这些内联代码并为您创建类。内联 itemRenderer 的优势在于代码与列表位于同一位置, 但是如果 itemRenderer 变得复杂时, 这又变成了劣势。本文中我将向您展示如何自己创建类。
将 itemRenderer 提取到一个外部文件有几个优势:
?itemRenderer 可轻松用于多个列表中
?代码更容易维护
?可以使用 Flex Builder 的“设计”视图草拟出最初的 itemRenderer
第一章说过, 应该将内联 itemRenderer 视作单独的类。事实上, Flex 编译器提取这些内联代码并为您创建类。内联 itemRenderer 的优势在于代码与列表位于同一位置, 但是如果 itemRenderer 变得复杂时, 这又变成了劣势。本文中我将向您展示如何自己创建类。
将 itemRenderer 提取到一个外部文件有几个优势:
? itemRenderer 可轻松用于多个列表中
?代码更容易维护
?可以使用 Flex Builder 的“设计”视图草拟出最初的 itemRenderer
MXML itemRenderer
在第 1 部分中, 您看到有一个复杂的 itemRenderer 用于 DataGrid:
<mx:DataGridColumn headerText="Title" dataField="title"><mx:itemRenderer><mx:Component><mx:HBox paddingLeft="2"><mx:Script><![CDATA[override public function set data( value:Object ) : void {super.data = value;var today:Number = (new Date()).time;var pubDate:Number = Date.parse(data.date);if( pubDate > today ) setStyle("backgroundColor",0xff99ff);else setStyle("backgroundColor",0xffffff);}]]></mx:Script><mx:Image source="{data.image}" width="50" height="50" scaleContent="true" /><mx:Text width="100%" text="{data.title}" /></mx:HBox></mx:Component></mx:itemRenderer></mx:DataGridColumn>
<?xml version="1.0" encoding="utf-8"?><mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300"><mx:Script><![CDATA[override public function set data( value:Object ) : void {super.data = value;var today:Number = (new Date()).time;var pubDate:Number = Date.parse(data.date);if( pubDate > today ) setStyle("backgroundColor",0xff99ff);else setStyle("backgroundColor",0xffffff);}]]></mx:Script><mx:Image source="{data.image}" width="50" height="50" scaleContent="true" /><mx:Text width="100%" text="{data.title}" /></mx:HBox>
<mx:DataGridColumn headerText="Title" dataField="title"itemRenderer="GridColumnSimpleRenderer">
<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>
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();}}}
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;
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);}
override protected function commitProperties():void{super.commitProperties();coverImage.source = data.image;titleText.text = data.title;authorLabel.text = data.author;pubdateLabel.text = data.date;}
private function handleBuyClick( event:MouseEvent ) : void{var e:BuyBookEvent = new BuyBookEvent();e.bookData = data;dispatchEvent(e);}
<mx:TileList id="mylist" x="29" y="542" width="694" itemRenderer="BookTileRenderer" dataProvider="{testData.book}" height="232" columnWidth="275" rowHeight="135" >
<?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>