Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Двойной или тройной клик (http://www.flasher.ru/forum/showthread.php?t=55049)

Alecsandr 23.02.2004 20:35

Двойной или тройной клик
 
Какой Action написать кнопке, чтобы действие выполнялось после двойного или тройного клика ? Заранее спасибо всем откликнувшимся :-)

silin 23.02.2004 21:47

t=0;
Mouse.addListener(mc.onDbl={});
mc.onDbl.onMouseDown=function(){//mc - кнопка(мувик)
if(getTimer()-t<500){//500 мс
trace("double");//действия по двойному клику
}
t=getTimer();
}

Nox Noctis 23.02.2004 22:16

варианта всего два:

1. добавить к приемнику события обработчик onMouseDown() и в нем отслеживать двойное (тройное) нажатие

2. добавить обработчик из п.1 куда-нибудь ОДИН раз (лучше всего в объект Mouse) и выдавать события при помощи ASBroadcaster'а

и в том и в другом случае используется getTimer() для проверки времени которое прошло с момента предыдущего клика.

первый вариант, который предложил silin, занимает обработчик онМаусДаун и требует отслеживания двойного клика в каждом объекте, слушающем двойной (тройной) щелчок

второй вариант чуть позапутаннее в реализации, но более универсален. если сделать так - то событие onDoubleClick не будет по формату ничем отличаться, например, от предопределенного события onMouseDown

вопрос только в том что оптимальнее в данном конкретном случае. я бы использовал второй вариант...

silin 23.02.2004 23:05

можно про "выдавать события при помощи ASBroadcaster'а" примерчик, а то че-то не въехать никак

Nox Noctis 23.02.2004 23:55

я когда-то писал в исходники такую штуковину...
но это было давно и не правда :)

сейчас я бы сделал так:
Код:

// —————————————————————————————————
// doubleclick event
Mouse.addListener(Mouse);
// dblclick time (msec)
Mouse.doubleClickTime = 300;
// global dblclick event generator
Mouse.onMouseDown = function() {
        var md = Mouse.onMouseDown;
        trace("["+md.click+"]"+(getTimer()-md.click)+" :: "+Mouse.doubleClickTime);
        if (md.click && (getTimer()-md.click<=Mouse.doubleClickTime)) {
                this.broadcastMessage("onDoubleClick");
        } else {
                md.click = getTimer();
        }
};
Mouse.onMouseMove = function() {
        Mouse.onMouseDown.click = 0;
};
// —————————————————————————————————
// sample:
// **
Mouse.addListener(this);
// **
this.onDoubleClick = function() {
        trace(this+" : doubleclicked");
};

для использования события необходимо только подписать нужны объект на события мышки, и создать обработчик onDoubleClick.

Mouse.doubleClickTime - это время между кликами в милисекундах

таким образом занят только обработчик Mouse.onMouseDown

кстати, обратите внимание на отсутствие конструкции ASBroadcaster.initialize(Mouse); которая разрешила бы объекту Mouse передавать события). объект Mouse и так передает события.

silin 24.02.2004 00:20

спасибо, так конечно вкуснее
чей-то хелп про broadcastMessage молчит че-то мы такого и не бачили вовсе

silin 24.02.2004 00:36

однако нужны еще комментарии:
если я хочу onDoubleClick к мувику привязать приходится проверять где кличешь
Mouse.addListener(mc);
mc.onDoubleClick = function() {
if(this.hitTest(_xmouse,_ymouse,true)) //иначе срабатывает везде где попало
trace(this+" : doubleclicked");
};
или я чего-то недопонял

Nox Noctis 24.02.2004 08:00

ну, то что хэлп молчит - это далеко не показатель :))
21 век на дворе ! :)

дока по ASBroadcaster на английском

дока по ASBroadcaster на русском у флэш-потрошителя

да, забыл упомянуть, вся эта ботва работает под МХ (6)

Цитата:

если я хочу onDoubleClick к мувику привязать приходится проверять где кличешь
ну да, точно так же как для события onMouseDown требуется проверять где был клик, потому что это событие глобально и оповещения о нем получают все клипы сразу... дабл клик - это точно аналогичное событие.

если нужно именно нажатие на конкретный объект, то можно организовать такую же запутку с событием onPress, но тогда этот обработчик будет уже занят, и событие даблклика будет локально только для этого объекта :)

вобщем надо выбрать что необходимо в конкретном случае


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

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