2014-12-12 2 views
2

Итак, у меня есть несколько классов пользовательского интерфейса, которые я создал, которые расширяют другой класс 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); 
} 

Или это не лучший способ идти о это?

ответ

1

Я бы подумал, что что-то еще по линиям фонового слоя, на котором расположены ваши кнопки, предотвратит запуск MouseEvents ниже.

Может быть, я должен переопределить метод addEventListener на ControlBase класса

Это не остановить события, которые инициированы, как он останавливается только слушатель события добавляются, но как только они добавили бы еще вызвать, независимо от включен ли.

+0

Конечно, если я переопределяю функцию addEventListener, чтобы обернуть любые добавленные функции с включенной проверкой, прежде чем добавлять их, которые будут работать? Хотя, я думаю, создав новые анонимные функции, он сломает функцию removerEventListener. –

+0

@WillBennion, если при первой инициализации кнопки она активирована, события всегда будут работать, если она была отключена, она всегда будет отключена, так как проверка находится в точке добавления слушателя событий, а не в момент, когда события бросаются – Tom