2009-03-17 2 views
0

Есть ли у кого-нибудь опыт подключения к событиям. , поэтому мы можем изменить его поведение без изменения его первоначального значения.AS3, подключение ваших событий

Так что скажем, мы хотим изменить поведение каждого щелчка определенного набора кнопок меню, которые, если вы нажмете на них, вы будете ждать 30 секунд до вызова первоначального обратного вызова.

Я работаю над проектом, который создаст слой поверх существующего приложения Air, которое позволит Управлять строить, чтобы позволить микроплатежам обеспечить полный доступ к определенным функциям.

И я предполагал использовать привязку для захвата ваших событий, поэтому нам не нужно редактировать наше приложение, а просто расширять его. (исправьте меня, если я ошибаюсь :-)) I

ответ

3

Да, это должно быть возможно с некоторой модификацией.

Вместо того, чтобы заниматься мероприятием, вы можете остановить его, прежде чем он достигнет своей первоначальной цели, клонировать его, а затем набросить клон после задержки.

Если вы не знаете, как события работают в списке отображения (все, что вы можете видеть) во флэш-памяти, позвольте мне сначала объяснить это.

Когда вы нажимаете кнопку, запускается MouseEvent, она начинается в фазе захвата, где она начинается на сцене, вызывающей все регистраторы событий, зарегистрированные для события «CLICK», в порядке приоритета, установленного при регистрации слушателей. Если листереры имеют одинаковый приоритет (по умолчанию 0), они вызываются в случайном порядке (правильно, порядок, в котором они зарегистрированы). После того, как все слушатели сцены были названы следующим displayObject в списке кнопок, вызывается предки, и то же самое происходит снова. Это продолжается до самого внутреннего объекта отображения, который позволяет событиям мыши (может быть меткой текстового поля внутри кнопки). Здесь завершается фаза захвата и начинается целевая фаза. Все слушатели на самом внутреннем объекте вызываются в целевой фазе. Затем начинается пузырящаяся фаза, где все листеры называются родителями и бабушками и дедушками вплоть до стадии так же, как и раньше (но изнутри выходят наружу).

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

И как мы можем это использовать?

Ну, когда вы регистрируетесь и слушаете события, вы указываете фазу и приоритет.По умолчанию используется фаза барботирования и приоритет 0. Итак, если мы зарегистрируем прослушиватель событий щелчка на этапе для фазы захвата с приоритетом int.MAX_VALUE, мы получим событие перед любой другой листерой, за исключением, возможно, другого идентичного слушателя. Следующий код предотвратит запись кликов другими слушателями.

stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE); 

function stageClick(e:MouseEvent):void 
{ 
    e.stopImmediatePropagation(); 
} 

Это вызывает некоторые другие проблемы, во-первых, вы не хотите делать это ради всего.

  • Одно решение будет иметь иметь список всех кнопок, которые должны иметь их события изменены и проверки против него с e.target.
  • Другим решением было бы иметь все кнопки , требующие задержки реализовать интерфейс (назовем его IButtonDelay). А затем простую проверку , если e.target является IButtondelay.
  • Третье решение было бы только прослушивания событий на родителей с указанной (как строки меню), так как это маловероятно, что вы бы использовали событие , прежде чем он достигнет этого родителя в любом случае.

Для первых двух решений вы должны предотвратить взаимодействие с мышью для кнопок кнопок для упрощения обнаружения (DisplayObjectContainer.mouseChildren = false). Независимо от того, что вы выберете здесь, вам нужно будет задержать простой таймер. А затем снова запустите событие после задержки.

e.target.dispatchEvent(e.clone()); 

Это вызывает проблему не отсрочки повторного события. Мое предложение состояло в том, чтобы вместо этого создать объект события, который наследуется от MouseEvent вместо простого клона. MouseEvent очень просто копировать, он имеет только несколько свойств. Поэтому, когда вы фиксируете его во второй раз, вы можете проверить, есть ли обычный щелчок мыши или дублирование.

Используя решение с inface на кнопках, это будет что-то вроде:

stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE); 

function stageClick(e:MouseEvent):void 
{ 
    if(e.target is IDelayButton && !e is DelayedMouseEvent) 
    { 
     e.stopImmediatePropagation(); 
     DelayEvent(e); 
    } 
} 

function DelayEvent(e:MouseEvent):void 
{ 
    //You code for the delaying, cloning and refiring the event here 
} 

Вам может понадобиться для прослушивания нескольких типов событий (клавиатурные события), но большая часть кода может быть сделано достаточно общего для их включения.

Надеюсь, что поможет и извините за долгое чтение.

+0

Очень хороший ответ! –

+0

Ваше приветствие, счастливое кодирование. –

0

Сверху моей головы, я думаю, вы можете это сделать: используйте обработчик событий для события click и используйте Timer, чтобы дождаться столько, сколько вы хотите ИЛИ позвонить, сделать некоторую обработку, а затем по завершении последнего вызвать действие, соответствующее click.

Или, что-то мне не хватает?

2

Я не думаю, что вы сможете изменить систему событий таким образом, не изменяя при этом приложение (если вы можете изменить приложение, это не так сложно сделать пользовательскую кнопку, которая позволяет это поведение)

Простейшим решением является, возможно, добавить еще одну кнопку Sprite/Button поверх кнопки, которую вы хотите заблокировать, - таким образом вам не нужно менять приложение, и многое другое блокирует. Только недостаток: поведение мыши на исходной кнопке не будет работать, поскольку оно не получает никаких событий мыши.

Смежные вопросы