Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как разобрать события мыши. (http://www.flasher.ru/forum/showthread.php?t=120733)

SunShadow 29.01.2009 12:40

Как разобрать события мыши?
 
Клиент попросил сделать разную реакцию объекта на мышиные события. Стал тестировать CLICK, MOUSE_DOWN, MOUSE_UP, DOUBLE_CLICK. Сначала срабатывает мышь вниз, затем мышь вверх после этого клик. Если после первого клика коротко по времени сделать второй клик то срабатывает еще раз вниз, вверх и двойной клик уже вместо обычного клика. При этом можно нажать кнопку и ждать полчаса а потом отпустить ее и сделать сразу второй клик тоже будет событие двойной клик.
У меня задача при нажатии на кнопку делать плавное увеличение параметра. Когда кнопку отпускают прекратить увеличение. При простом клике делать увеличение параметра скачками. И есть обект который надо выделять кликом и при двойном клике активировать.
Пока кроме как через секундомер который будет проверять как давно кнопку на мыше нажали, когда последний клик был и т.п. не могу придумать как отличать одно событие от другого.

Приходилось кому то это делать? какие приемы использовали поделитесь:umnik2:

wvxvw 29.01.2009 12:55

Я думаю что ваш подход он и есть правельный.

Arif flasher 13.03.2009 14:45

все еще нужна помощь по этому вопросу? подход не правильный через секундомер геморрой будет. Лучше ентер_фрейм использовать.
Могу поподробнее обьяснить если надо

SunShadow 13.03.2009 14:51

Будьте любезны) я через секундомер делал)
Скорость между кадрами не постоянная величина, а вот время по getTimer() дает достаточно достоверное значение между событиями. Я воспользовался этим способом

Arif flasher 13.03.2009 15:21

эх, я перепутал, сори. я не так понял вопрос. ага, таймер лучше подходит для определение клик это или маус_вниз.

SunShadow 13.03.2009 17:22

Эх а я так надеялся на красивое решение)

SunShadow 09.04.2009 13:55

Нашел решение по данной теме. Все гениальное оказалось просто.
Решаем следующую задачу. Есть карта. Когда на ней нажимают кнопку и начинают двигать мышь необходимо двигать карту. На самой карте находятся объекты которые также реагируют на клик по ним мышкой и могут выполнять действие от выделения до обновления карты, это уже зависит от объекта.
Вот какое решение получилось в итоге:
Заводим значение минимальноеДопустимоеСмещение - это чтобы не запускать движение карты когда мышка непроизвольно дернулась после нажатия, и логическую флагДвижения. Объекты на карте отрабатывают свои клики как положено. Далее на самой карте фиксируем два обработчика для событий MOUSE_DOWN, и CLICK причем последний в фазе Capture
Код AS3:

addEventListener(MouseEvent.MOUSE_DOWN, hnMouseDownMap);
addEventListener(MouseEvent.CLICK, hnMouseClickMap,true);

в hnMouseDownMap будем сбрасывать флаг движения и готовить все необходимые механизмы для отслеживания движения
Код AS3:

private function hnMouseDownMap(e:MouseEvent):void 
                {
                        startX = mouseX;
                        startY = mouseY;
                        vMoving = new _Vector();
                        addEventListener(MouseEvent.MOUSE_MOVE, hnMouseMoveMap);
                        addEventListener(MouseEvent.MOUSE_UP, hnMouseUpMap);
                }

Если далее при движении мыши будет зафиксировано смещение мыши больше чем наше минимальноеДопустимоеСмещение то устанавливаем флаг флагДвижения.
При клике по карте в фазе Capture отлавливаем событие и если было зафиксировано движение (флагДвижения в истине) то отменяем распространение клика на потомков
Код AS3:

private function hnMouseClickMap(e:MouseEvent):void{
if (флагДвижения)
{
e.stopPropagation();
}
}

Вот наши потомки клик и не получили когда нам это не нужно. Если все необходимо делать на одном объекте то вполне можно применять вариант с таймером.:moder:


Часовой пояс GMT +4, время: 00:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.