Actionscript 3 AS3创建禁用状态的有效方法

Actionscript 3 AS3创建禁用状态的有效方法,actionscript-3,Actionscript 3,因此,我创建了许多UI类,它们都扩展了另一个类ControlBase。 ControlBase类包含启用的属性的getter和setter 我的目标是,每当一个UI元素,比如说一个按钮类被禁用时,所有鼠标事件都会停止 我意识到鼠标启用了mouseEnabled,但是,如果有意义的话,我希望它能够阻止它后面的任何元素。(因此,如果我在另一个按钮的顶部有一个按钮,当顶部按钮被禁用时,底部按钮不会被激活) 目前,我已经做到了这一点,但感觉可能效率很低。我实现它的方法是将此代码放入ControlBase

因此,我创建了许多UI类,它们都扩展了另一个类
ControlBase
ControlBase
类包含启用的
属性的getter和setter

我的目标是,每当一个UI元素,比如说一个
按钮
类被禁用时,所有鼠标事件都会停止

我意识到鼠标启用了
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元素时,这会造成问题吗? 如果是这样的话,有没有人对一个内存效率更高的系统有什么想法

谢谢,威尔

编辑:也许我应该在
ControlBase
类上用以下内容重写
addEventListener
方法:

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);
}

或者这不是一个很好的方法吗?

我会想,在你的按钮所在的背景层上,有一些东西可以防止鼠标事件在下面触发

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


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

当然,如果我在添加任何添加的函数之前覆盖addEventListener函数,以使用启用的检查来包装这些函数,那么它们会工作吗?尽管如此,我猜想通过创建新的匿名函数,它将破坏removrEventListener函数。@WillBennion如果按钮第一次初始化时,它被启用,事件将始终工作,如果它被禁用,它将始终被禁用,因为检查是在添加事件侦听器时进行的,而不是在抛出事件时进行的