`
qs421qs
  • 浏览: 12200 次
社区版块
存档分类
最新评论

Flex在匿名方法移除自身的侦听方法

 
阅读更多

  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); }  但在removePopup()时,我们同样使用效果,但效果结束时,才是真正的移除弹出的窗口。
  这时,需要给Zoom对象添加EffectEvent.EFFECT_END事件侦听者,同时当侦听器执行完,移除该侦听者。
  解决办法如下: public static function removePopUp(popUp:IFlexDisplayObject):void { popHideEffect(popUp); zoomHide.addEventListener(EffectEvent.EFFECT_END,f unction(evt:EffectEvent):void { if (popUp!= null) { popUp.removeEventListener(MoveEvent.MOVE, doMove); } mx.managers.PopUpManager.removePopUp(popUp); evt.target.removeEventListener(EffectEvent.EFFECT_ END, arguments.callee); }); }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics