|
|
|||||
События мыши и их перекрытие
Здравствуйте.
Вопрос, казалось бы, простой, но ответа так и не нашла. Как сделать так, чтобы при слушателях, например, клика и MOUSE_DOWN - срабатывал либо клик, либо маус-даун? Я сделала булевы переменные - мол, не надо, я зажала и двигаю, а не кликаю. private function moveButtonOn(event:MouseEvent) { moving = true; ... } private function fixTip(event:MouseEvent) { if(!moving && !deleting) { ... } } Подскажите, как исправить? Последний раз редактировалось demy; 09.02.2011 в 17:53. |
|
|||||
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Воспользоватся одним обработчиком?
|
|
|||||
Повесить слушатель только на MOUSE_DOWN. Считать сколько милисекунд зажата кнопка, и если дольше положенного диспатчить клик. Ну или просто вызывать функцию обработчик клика.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Побаловалась с идеей:
stage.addEventListener(MouseEvent.MOUSE_DOWN, onClick); stage.addEventListener(MouseEvent.MOUSE_UP, onClick); stage.addEventListener(MouseEvent.CLICK, onClick); function onClick(event:MouseEvent) { var moving = false; if (event.type == MouseEvent.MOUSE_DOWN) { moving = true; } if (event.type == MouseEvent.MOUSE_UP) { moving = false; } if (!moving) { trace("Ухты!"); } } Отсюда появилась извращенская идея с массивом отметок событий... но идея не сработала. Параллельное выполнение... такое параллельное... Нужно не только перекрыть MOUSE_DOWN, но и клик по окончанию перетаскивания - то есть перекрытие в обе стороны. Вот как его реализовать - все еще без понятия... Последний раз редактировалось demy; 09.02.2011 в 18:37. |
|
|||||
При зажатии срабатывает только down;
при отпускании срабатывает up, click; при клике срабатывают down, up, click. Чего-то голова уже не соображает - как их организовать? Вообще закрадываются подозрения, что поскольку разница между событиями перетаскивания и клика только в длительности (down, ..., up, click vs down, up, click), придется как-то с этим работать... А таймер очень-очень не хочется. Правда еще тут же возникает идея - задействовать MOUSE_MOVE - так мы отделим перетаскивание, если мышь между зажатием и отпускание выдает MOUSE_MOVE. Но сразу же понятно, что тогда я клик от движения уже не отделю. И вот окажется, что мы сейчас велосипед изобретаем... =) Последний раз редактировалось demy; 09.02.2011 в 18:56. |
|
|||||
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); private var moving:Boolean = false; ... private function onMouseDown(event:MouseEvent):void { stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); } private function onMouseUp(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); if (!moving) { trace("click"); } moving = false; } private function onMouseMove(event:MouseEvent):void { moving = true; } |
|
|||||
2 alatar - А если у нас не клик а длительное нажатие? Тогда вся теория с маусмувом накроется тазиком.
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.utils.getTimer; /** * @author Dukobpa3 */ public class Main extends Sprite { private var counter:int = 0; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown); stage.addEventListener(MouseEvent.MOUSE_UP, onUp); this.graphics.lineStyle(2); this.graphics.moveTo(mouseX, mouseY); } private function onMove(e:MouseEvent):void { this.graphics.lineStyle(2); this.graphics.lineTo(mouseX, mouseY); } private function onDown(event:MouseEvent):void { counter = getTimer();//засекаем время начала клика trace("Мышь нажата"); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);//Это так, для демонстрации прикрутил, можно и не двигать. event.updateAfterEvent(); } private function onUp(event:MouseEvent):void { counter -= getTimer();//засекаем конец этого нехитрого действия if (-counter <= 500) {//если отпустили раньше чем через полсекунды - значит клик trace ("Это был клик: " + String( -counter)); this.graphics.clear(); } else {//иначе обрабатываем завершение движения мыши trace("Это был маусМув"); } stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove); } } } А велосипед да. Помню месяца полтора назад это на форуме уже обсуждалось. Поиск по форуму может помочь... Кстати и ответы там те же были) Если бы не лень, то дал бы ссылку. Поиск по форуму
__________________
Кто к нам с чем для чего - тот у нас того от того. Последний раз редактировалось Dukobpa3; 09.02.2011 в 19:56. |
Часовой пояс GMT +4, время: 12:14. |
|
« Предыдущая тема | Следующая тема » |
Теги |
MouseEvent , перекрывание , события мыши |
Опции темы | |
Опции просмотра | |
|
|