![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
|
и так, столкнулся с такой вот проблемой как перекрытие событий:
задействован максимально возможный вариант работы с мышкой (активное использование CLICK, MOUSE_DOWN и пр). Например: имеется рабочая область в которой по CLICK выполняются одни действия по DOWN -> MOVE -> UP другие при этом так же нужно учитывать еще одно условие, на рабочей области присутствуют кнопки по нажатию на которые с последствие должны выполняться другие действия по опять же нажатию слышал что в подобных ситуациях можно и нужно использовать собственные события но не очень разберусь как их всё же применить в данной ситуации, может есть у кого какие примеры или просто может пояснить как сделать максимально лаконично и правильно |
|
|||||
|
Регистрация: Feb 2007
Сообщений: 63
|
ловить MOUSE_DOWN, запоминать target, вешать MOVE. при MOUSE_UP отписать MOVE, сравнивать target'ы - если совпали, то вызываем обработчик CLICK.
Последний раз редактировалось ToRR; 25.08.2009 в 14:37. |
|
|||||
|
Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
|
всмысле запоминать target, мы же слушатель привязываем к ему то, в данном случае к чему привязать?
|
|
|||||
|
Регистрация: Feb 2007
Сообщений: 63
|
если у вас слушатели вешаются на каждый объект:
1) изначально вешать на объекты MOUSE_DOWN. 2) при срабатывании MOUSE_DOWN вешать MOUSE_MOVE (если он срабатывает, то запоминаем это - wasMoved = true) и MOUSE_UP. 3) при срабатывании MOUSE_UP проверяем, wasMoved, если false то вызываем обработку обычного клика. Отписываем объект от MOUSE_MOVE и MOUSE_UP. если же у вас 1 обработчик на много объектов, то: 1) изначально вешаем на сцену MOUSE_DOWN. 2) при срабатывании MOUSE_DOWN запоминаем объект, на котором был клик. Вешаем MOUSE_UP. Действия c MOUSE_MOVE тут зависят от того, чего вы хотите достичь. 3) при срабатывании MOUSE_UP сравниваем target ивента с тем, что запомнили - совпали - имеем клик, если объект не таскался. |
|
|||||
|
Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
|
спасибо, это уже интересно, но вот еще вопрос насколько здесь всё таки осмысленно использовать собственные события?
как оказалось я уже активно использую подобную технику это я в плане переменных блокирующих ту или иную операцию |
|
|||||
|
Регистрация: Feb 2007
Сообщений: 63
|
В принципе, никто не мешает унаследоваться от того же Sprite'а, в классе реализовать все эти танцы с MOUSE_DOWN (подписаться в конструкторе), проверками на перетаскивание и т.д.
Наверх диспатчить кастомные(или стандартные MouseEvent.CLICK и т.д.) события, и наследовать все свои классы, требущие этот функционал от вышеописанного. Только в этом классе надо будет реализовать метод, который будет отписывать объекты от внутренних слушателей, чтобы GC смог потом все удалить. Как-то так: public class MySprite extends Sprite { private var wasDragged:Boolean; public function MySprite() { addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); } public function free():void { removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onMouseDown(event:MouseEvent):void { addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onMouseMove(event:MouseEvent):void { wasDragged = true; } private function onMouseUp(event:MouseEvent):void { removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); if (!wasDragged) { dispatchEvent(new MouseEvent(MouseEvent.CLICK....)); } } } |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|