Да, это должно быть возможно с некоторой модификацией.
Вместо того, чтобы заниматься мероприятием, вы можете остановить его, прежде чем он достигнет своей первоначальной цели, клонировать его, а затем набросить клон после задержки.
Если вы не знаете, как события работают в списке отображения (все, что вы можете видеть) во флэш-памяти, позвольте мне сначала объяснить это.
Когда вы нажимаете кнопку, запускается 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
}
Вам может понадобиться для прослушивания нескольких типов событий (клавиатурные события), но большая часть кода может быть сделано достаточно общего для их включения.
Надеюсь, что поможет и извините за долгое чтение.
Очень хороший ответ! –
Ваше приветствие, счастливое кодирование. –