Обработка передвижений мыши
Обработка передвижений мыши в AS 3.0 на первый взгляд выглядит очень просто. И документация и десятки примеров в интернете показывают как это сделать:
sample_mc.addEventListener(MouseEvent.MOUSE_MOVE, SampleMouseMove); |
Теперь, когда курсор мыши будет наведен на клип sample_mc, то будет вызвана функция SampleMouseMove, которая получит параметр типа MouseEvent из которого можно будет узнать координаты курсора и много другой информации.
Однако, внутри скрывается несколько нюансов, которые привели к тому, что у меня на правильный обработчик ушло несколько часов времени.
Вот несколько уточнений, которые сэкономят вам время, если вы будете реализовывать похожую функциональность:
Обычно клип состоит из нескольких вложенных в него клипов. Если использовать простую форму записи, то функция SampleMouseMove будет возвращать данные для вложенных клипов, что зачастую неудобно. Чтобы этого не происходило надо у базового клипа установить флаг mouseChildren в false
sample_mc.mouseChildren = false; sample_mc.addEventListener(MouseEvent.MOUSE_MOVE, SampleMouseMove); |
Если перемещение по вложенным клипам все же нужно отследить, то надо понять разницу между свойствами target и currentTarget
private function SampleMouseMove(evt:MouseEvent):void { // Проверяем, что мы находимся на нужном базовом клипе if(evt.currentTarget == sample_mc) { // Проверяем, что мы находимся на нужном вложенном клипе if(evt.target.name == "Test"){} } } |
Можно легко узнать координаты курсора, как внутри самого клипа, так и глобальные
private function SampleMouseMove(evt:MouseEvent):void { // Проверяем координату X курсора внутри клипа sample_mc if(evt.localX < 30) { // Сохраняем глобальную координату X курсора mX = evt.stageX; } } |
Полный исходный код я решил не приводить, потому, что на английском языке есть отличный пример с исходными кодами, где все это очень наглядно представлено.
И еще небольшой совет из текущей работы. Мне обработка передвижения мыши была нужна для того, чтобы выводит подсказку. Подсказка реализована как отдельный клип, который появляется под курсором при наведение его в заданную область. Так, вот, как только мы создаем клип под курсором, то клип, который обрабатывает события получает сообщение MouseEvent.MOUSE_OUT, что в моем случае означало, что подсказку надо убрать. После этого базовому клипу приходило сообщение MouseEvent.MOUSE_MOVE, что вызывало появление подсказки и так далее.
Чтобы избавиться от этого, клип-подсказку пришлось сместить на насколько пикселей в сторону. Одного пикселя не хватило — при движение курсора эффект иногда возникал, а вот два оказалось в самый раз.