Flex在匿名方法移除自身的侦听方法
作者:kevinLee 类型:原创 来源:csdn.net
Question:
有时我们为了减少不必要的参数传递,使用匿名方法。但假若匿名方法是个事件的侦听者时,在侦听方法结束时,为了节省内存,我们得当添加的侦听方法移除掉。
问题就产生了,因为是匿名方法,在removeEventListener(Event.Type, Funtion) 中前两个方法是必须的,第二个方法是填什么就成了问题。
Solution:
在自定义的PopupMange类中,处理弹出时,添加了Zoom效果,使窗口的出现更为自然些。
private static var zoomShow:Zoom = new Zoom();
private static var zoomHide:Zoom = new Zoom();
public static function popShowEffect(target:IFlexDisplayObject):void
{
zoomShow.zoomHeightFrom = 0;
zoomShow.zoomHeightTo = 1;
zoomShow.zoomWidthFrom = 0;
zoomShow.zoomWidthTo = 1;
zoomShow.play([target]);
}
public static function popHideEffect(target:IFlexDisplayObject):void
{
zoomHide.zoomHeightFrom = 1;
zoomHide.zoomHeightTo = 0;
zoomHide.zoomWidthFrom = 1;
zoomHide.zoomWidthTo = 0;
zoomHide.play([target]);
}
public static function createPopUp(parent:DisplayObject, className:Class, modal:Boolean = false, childList:String = null):IFlexDisplayObject
{
popShowEffect(popUp);
return mx.managers.PopUpManager.createPopUp(parent, className, modal, childList);
}
private static var zoomHide:Zoom = new Zoom();
public static function popShowEffect(target:IFlexDisplayObject):void
{
zoomShow.zoomHeightFrom = 0;
zoomShow.zoomHeightTo = 1;
zoomShow.zoomWidthFrom = 0;
zoomShow.zoomWidthTo = 1;
zoomShow.play([target]);
}
public static function popHideEffect(target:IFlexDisplayObject):void
{
zoomHide.zoomHeightFrom = 1;
zoomHide.zoomHeightTo = 0;
zoomHide.zoomWidthFrom = 1;
zoomHide.zoomWidthTo = 0;
zoomHide.play([target]);
}
public static function createPopUp(parent:DisplayObject, className:Class, modal:Boolean = false, childList:String = null):IFlexDisplayObject
{
popShowEffect(popUp);
return mx.managers.PopUpManager.createPopUp(parent, className, modal, childList);
}
但在removePopup()时,我们同样使用效果,但效果结束时,才是真正的移除弹出的窗口。这时,需要给Zoom对象添加EffectEvent.EFFECT_END事件侦听者,同时当侦听器执行完,移除该侦听者。
解决办法如下:
public static function removePopUp(popUp:IFlexDisplayObject):void
{
popHideEffect(popUp);
zoomHide.addEventListener(EffectEvent.EFFECT_END,function(evt:EffectEvent):void
{
if (popUp!= null)
{
popUp.removeEventListener(MoveEvent.MOVE, doMove);
}
mx.managers.PopUpManager.removePopUp(popUp);
evt.target.removeEventListener(EffectEvent.EFFECT_END, arguments.callee);
});
}
{
popHideEffect(popUp);
zoomHide.addEventListener(EffectEvent.EFFECT_END,function(evt:EffectEvent):void
{
if (popUp!= null)
{
popUp.removeEventListener(MoveEvent.MOVE, doMove);
}
mx.managers.PopUpManager.removePopUp(popUp);
evt.target.removeEventListener(EffectEvent.EFFECT_END, arguments.callee);
});
}
- 最近更新
