所以,我创建了许多UI类,它们都扩展了另一个类ControlBase
。
ControlBase
类包含enabled
属性的getter和setter。
我的目标是,每当禁用一个UI元素(比如一个Button
类)时,所有鼠标事件都会停止。
我醒了mouseEnabled
但是,我希望它能阻止它背后的任何元素,如果这是有道理的。 (所以如果我在另一个按钮的顶部有一个按钮,当禁用顶部按钮时,底部按钮不会被激活)
目前,我已经实现了这一点,但感觉效率可能相当低。我实现它的方法是将此代码放在ControlBase
类构造函数中:
this.addEventListener(MouseEvent.CLICK, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.DOUBLE_CLICK, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.MOUSE_DOWN, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.MOUSE_MOVE, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.MOUSE_OUT, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.MOUSE_OVER, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.MOUSE_UP, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.MOUSE_WHEEL, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.ROLL_OUT, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(MouseEvent.ROLL_OVER, checkMouseEvent, false, int.MAX_VALUE, true);
this.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyboardEvent, false, int.MAX_VALUE, true);
this.addEventListener(KeyboardEvent.KEY_UP, checkKeyboardEvent, false, int.MAX_VALUE, true);
然后还放:
private function checkMouseEvent(e:MouseEvent):void {
if (!enabled) {
e.preventDefault();
e.stopImmediatePropagation();
}
}
private function checkKeyboardEvent(e:KeyboardEvent):void {
if (!enabled) {
e.preventDefault();
e.stopImmediatePropagation();
}
}
在同一个班级。因此,这些事件在任何其他事件之前触发(因为它们具有允许的最大优先级),然后在禁用控件时停止事件的传播。
我觉得它可能效率低下,因为现在正在收听大量的事件。当使用大量UI元素时,这是否会出现问题? 如果是这样,有没有人对更节省内存的系统有任何想法?
谢谢,威尔
编辑:也许我应该覆盖addEventListener
类上的ControlBase
方法,其中包含以下几点:
override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void {
super.addEventListener(type, function(e:Event) {
if (enabled) listener(e);
}, useCapture, priority, useWeakReference);
}
或者这不是解决这个问题的好方法吗?
答案 0 :(得分:1)
我认为按钮所在的背景图层更多的东西会阻止MouseEvents在下面触发。
也许我应该重写ControlBase上的addEventListener方法 类
这不会停止触发事件,因为它只会停止添加事件侦听器,但一旦添加它们,无论是否启用它们仍会触发。