MovieClip во Flash Проблемы MOUSE_OVER - PullRequest
1 голос
/ 15 августа 2011

Я создаю небольшое приложение во Flash CS5 и столкнулся с проблемой.Я импортировал довольно сложный файл Adobe Illustrator, созданный дизайнером, в свое приложение.Этот файл полон всевозможных изображений, текста и других компонентов, которыми я могу управлять внутри Flash.

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

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

Как я могу вызвать этиобъекты, ведущие себя как один мувиклип, так что при наведении мыши на любую область мувиклипа будет запускаться только прослушиватель события MOUSE_OVER один раз?

Ответы [ 4 ]

2 голосов
/ 15 августа 2011

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

movieclip.addEventListener(MouseEvent.ROLL_OVER, onRollOverHandler);

function onRollOverHandler(e:MouseEvent):void
{
    // this will run once when you move your mouse over the movieclip
}

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

movieclip.addEventListener(MouseEvent.ROLL_OUT, onRollOutHandler);

function onRollOutHandler(e:MouseEvent):void
{
    // this will run once when you move your mouse off of the movieclip
}
1 голос
/ 17 августа 2011

Если объекты в вашем MovieClip не должны быть активными, вы можете использовать

yourMC.mouseChildren=false;
yourMC.addEventListener(MouseEvent.MOUSE_OVER,yourOverHandlerFunction);
0 голосов
/ 16 августа 2011

Как примечание стороны, это вызвано пузырением события. Я фанат пользовательских событий MOUSE_OVER, чтобы предотвратить это.

0 голосов
/ 15 августа 2011

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

Есть несколько способов обойти это:

  1. Создайте клип переднего плана и слушайте его. На мой взгляд, это лучший вариант.
  2. Вы можете использовать параметр useCapture, который, по моему опыту, решит многие из этих проблем. Вместо addEventListener(name, callback) вы бы позвонили addEventListener(name, callback, true). Это также верно для removeEventListener.
  3. Ручное отслеживание событий! Это оружие последней инстанции, обеспечивающее максимальную надежность за счет худших характеристик и самой большой головной боли. Это будет связано с более или менее глобальным прослушивателем событий и тестами попаданий. Используйте только если отчаянно.
...