AS3做出禁用状态的有效方法

时间:2014-12-12 09:58:28

标签: actionscript-3

所以,我创建了许多UI类,它们都扩展了另一个类ControlBaseControlBase类包含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);
}

或者这不是解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:1)

我认为按钮所在的背景图层更多的东西会阻止MouseEvents在下面触发。

  

也许我应该重写ControlBase上的addEventListener方法   类

这不会停止触发事件,因为它只会停止添加事件侦听器,但一旦添加它们,无论是否启用它们仍会触发。