定制Flex菜单图标

摘要:
默认菜单上的图标必须通过iconField和iconFunction指定,但这两种方法都必须使用嵌入的资源类名来指定图标。如果要使用动态图片作为菜单的图标,则必须自定义MenuItemRenderer。this.contains){this.addChild;}}重写updateDisplayList方法:overrideprotectedfunctionupdateDisplay列表:void{super.updateDispplayList;if{return;}varimageAsset:IImageAsset=实用程序。获取图像资产;如果{return;}如果{typeIcon.x+=imageAsset.width;}如果{label.x+=imageAsset.width;}}重写measuredIconWidth方法:overridepublicfunctiongetmeasured IconWith():编号{variageAsset:IImageAsset=Utils.getImageAsset;如果{return 0;}否则{varhorizontalGap:Number=getStyle;returnimageAsset.width+horizonalGap;}}最后,使用自定义的CustomMenuItemRenderer指定菜单的ItemRender。请注意,图标的名称是使用iconName指定的。

默认Menu上的Icon必须通过iconField和iconFunction去指定,但是这两种方式都必须用嵌入资源Class名字去指定Icon,如果想用动态的图片(比如URL)作为Menu的Icon,就必须定制一把MenuItemRenderer。

定制Flex菜单图标第1张

首先写个类CustomMenuItemRenderer继承MenuItemRenderer,里面增加一个如下变量作为自定义Icon的组件:

private var image:UIComponent = new UIComponent();

然后里面重写measure方法(计算MenuItem的宽高):

override protected function measure():void {
	super.measure();

	if (separatorIcon || listData == null) {
		return;
	}

	var imageAsset:IImageAsset = Utils.getImageAsset(data.@iconName);
	if(imageAsset == null){
		return;
	}
	measuredWidth += imageAsset.width;
	if(imageAsset.height > measuredHeight){
		measuredHeight = imageAsset.height;
	}
}

重写commitProperties方法(重画并增加Icon,指定Icon宽高):

override protected function commitProperties():void {
	super.commitProperties();

	if (separatorIcon || listData == null) {
		return;
	}

	var imageAsset:IImageAsset = Utils.getImageAsset(data.@iconName);
	if(imageAsset == null){
		return;
	}
	image.width = imageAsset.width;
	image.height = imageAsset.height;
	image.graphics.beginBitmapFill(imageAsset.getBitmapData());
	image.graphics.drawRect(0, 0, image.width, image.height);
	image.graphics.endFill();
	if(!this.contains(image)){
		this.addChild(image);
	}
}

重写updateDisplayList方法(指定Icon的位置,由于Icon在左边,所以super一把后,再移动Labe等的位置):

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
	super.updateDisplayList(unscaledWidth, unscaledHeight);

	if (separatorIcon || listData == null) {
		return;
	}

	var imageAsset:IImageAsset = Utils.getImageAsset(data.@iconName);
	if(imageAsset == null){
		return;
	}
	if(typeIcon){
		typeIcon.x += imageAsset.width;
	}
	if(label){
		label.x += imageAsset.width;
	}
}

重写measuredIconWidth方法(计算Icon的宽度):

override public function get measuredIconWidth():Number {
	var imageAsset:IImageAsset = Utils.getImageAsset(data.@iconName);
	if(imageAsset == null){
		return 0 ;
	}else{
		var horizontalGap:Number = getStyle("horizontalGap");
		return imageAsset.width + horizontalGap;
	}
}

最后用自定义的CustomMenuItemRenderer指定Menu的ItemRenderer,注意使用iconName指定icon的名字(这里为TWaver注册图片的名字)。也可以用别的名字,注意把CustomMenuItemRenderer里面的@iconName换一下

var menu:Menu = Menu.createMenu(network, myMenuData, false);
menu.labelField = "@label";
menu.itemRenderer = new ClassFactory(CustomMenuItemRenderer);
var point:Point = network.getLogicalPoint(event.mouseEvent);
network.callLater(function():void{
	menu.show(point.x, point.y);
});

指定Menu数据的XML文件如下:

	<mx:XML format="e4x" id="myMenuData">
		<root>
			<menuitem label="www.servasoftware.com" iconName="databox_icon">
				<menuitem label="TWaver" type="check" toggled="true">
					<menuitem label="Java" type="radio" groupName="one"/>
					<menuitem label="Web" type="radio" groupName="one" toggled="true"/>
					<menuitem label="Flex" type="radio" groupName="one" iconName="bus_icon"/>
					<menuitem label="Silverlight" type="radio" groupName="one"/>
				</menuitem>
				<menuitem type="separator"/>
				<menuitem label="2BizBox" iconName="data_icon"/>
			</menuitem>
			<menuitem label="www.2bizbox.com"/>
			<menuitem label="twaver.servasoft.com"/>
		</root>
	</mx:XML>
</code>
需要源代码请留言更多关于MenuItemRenderer的用法参见官方文档:
http://livedocs.adobe.com/flex/3/html/help.html?content=menucontrols_3.html

免责声明:文章转载自《定制Flex菜单图标》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)Delphi7中编译提示“Unsafe type 'PChar'”的原因及处理办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

百度文库破解方法

通过这些步骤,我们可以轻松破解百度文库下载,简单实用。互联网上有很多种下载设备,它们很容易使用和解决。...

字符串解压缩类库(zip、GZIP、QuickLz、snappy、lzf、jzlib)介绍

它旨在提供高压缩速度和合理的压缩比=-1){out.write;}字节[]未压缩=输出。到字节数组();--返回提取字符串的字节数组。介绍使用预先选择的解压缩类库-GZIP压缩字符串=“这是一个用于测试的字符串”;ByteArrayOutputStreamout=新的ByteArray输出流();GZipOutputStreamgout=newGZipOut...

unity, 设置帧率上限

使用unity制作演示,并移除所有昂贵的特效。在真正的机器上运行仍然会导致问题。最大显示帧速率为30。默认情况下,IOS设备上统一的原始帧速率限制为30。应用targetFrameRate=60;更改为最大值60。请注意,此设置对编辑器没有影响。...

使用事务和SqlBulkCopy批量插入数据

类似与MicrosoftSQLServer包中名为bcp的命令行应用程序。但是使用SqlBulkCopy类可以编写托管代码解决方案,性能上优于bcp命令行应用程序,更优于如Insert方式向SQLServer表加载大量数据。SqlBulkCopy可以应用到大批量数据的转移上,而不管数据源是什么。之前在做winform开发的时候,发现当datagridview...

浅析前端常见文件下载的9种场景:Blob基础知识/组成/Blob URL、a标签下载、showSaveFilePicker API下载(兼容性差)、FileSaver.js库下载、Zip下载(JSZip库)、附件形式下载(设置Content-Disposition)、base64格式下载(需转为blob)、分块传输下载、HTTP范围请求下载、大文件分块并行下载

它主要涉及九种文件下载场景。在浏览器端文件下载场景中,JavaScript中的blob类型对象表示一个不可变的原始数据类文件对象。在JavaScript中,您可以通过blob构造函数创建blob对象,blob构造函数表示要放入blob的数组内容的MIME类型。行终止符将更改为适合主机操作系统文件系统的新行字符,允许Blob和file对象用作图像的URL源、下...

ios 苹果和百度地图的相关使用

同时由于苹果使用的是高德,不会像谷歌地图一样在国内乌龟一样的访问速度,确实做一些地图相关的东西,非常有吸引力。只是实现了显示一个百度地图的view。百度地图使用的是Objective-C++,这意味这必须要有一个.mm文件。...