Итак, у меня есть несколько классов пользовательского интерфейса, которые я создал, которые расширяют другой класс ControlBase
. Класс ControlBase
содержит геттер и сеттер для объекта enabled
.AS3 эффективный способ сделать отключенное состояние
То, что я хочу достичь, заключается в том, что всякий раз, когда элемент пользовательского интерфейса, скажем, класс 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();
}
}
в том же классе. Таким образом, эти события срабатывают перед любым другим событием (поскольку они имеют максимально допустимый приоритет), а затем останавливают распространение события, если элемент управления отключен.
Я чувствую, что это может быть неэффективно, хотя из-за большого количества событий, которые сейчас слушаются. Будет ли это проблемой, когда используется большое количество элементов пользовательского интерфейса? Если да, есть ли у кого-нибудь идеи для более эффективной системы памяти?
Спасибо, Уилл
Edit: Может быть, я должен переопределить addEventListener
метод на ControlBase
класса с Somethin вдоль линий:
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);
}
Или это не лучший способ идти о это?
Конечно, если я переопределяю функцию addEventListener, чтобы обернуть любые добавленные функции с включенной проверкой, прежде чем добавлять их, которые будут работать? Хотя, я думаю, создав новые анонимные функции, он сломает функцию removerEventListener. –
@WillBennion, если при первой инициализации кнопки она активирована, события всегда будут работать, если она была отключена, она всегда будет отключена, так как проверка находится в точке добавления слушателя событий, а не в момент, когда события бросаются – Tom