博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定制Flex菜单图标
阅读量:6554 次
发布时间:2019-06-24

本文共 2477 字,大约阅读时间需要 8 分钟。

hot3.png

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

22005727_KVCc.png

首先写个类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文件如下:

需要源代码请留言更多关于MenuItemRenderer的用法参见官方文档:

转载于:https://my.oschina.net/monolog/blog/404802

你可能感兴趣的文章
yarn磁盘监控参数
查看>>
jquery javascript获得网页的高度和宽度
查看>>
mysql设置自增id清零 auto_increment
查看>>
linux(Centos7)服务器硬件改动,进入Emergency模式
查看>>
Easyui Treegrid 分页解决方案
查看>>
hihoCoder1038
查看>>
hdu3976(Electric resistance) 高斯消元
查看>>
BZOJ3874:[AHOI2014&JSOI2014]宅男计划(爬山法)
查看>>
【模板】NTT
查看>>
413. Arithmetic Slices(数组中等差递增子区间的个数)
查看>>
unity调用打印机打印
查看>>
python爬虫知识点总结(二十七)Scrapy分布式原理以及Scrapy-Reids源码解析
查看>>
redux&&createStore
查看>>
开发文档学习英文
查看>>
c++ 类的继承与派生
查看>>
[转] Sublime Text3 配置 NodeJs 环境
查看>>
【leetcode】449. Serialize and Deserialize BST
查看>>
HTTP-web服务器接收到client请求后的处理过程(很详细)
查看>>
Mobile开发之meta篇
查看>>
Flutter-BLoC-第二讲
查看>>