Главная > Разное > Обработка передвижений мыши

Обработка передвижений мыши

Обработка передвижений мыши в 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, что вызывало появление подсказки и так далее.
Чтобы избавиться от этого, клип-подсказку пришлось сместить на насколько пикселей в сторону. Одного пикселя не хватило — при движение курсора эффект иногда возникал, а вот два оказалось в самый раз.

Поделиться в соц. сетях

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.