PDA

Просмотр полной версии : Двойной или тройной клик


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 на английском (http://chattyfig.figleaf.com/flashcoders-wiki/index.php?Flash%20MX%20built%20in%20ASBroadcaster%20%28undocumented%20feature%29)

— дока по ASBroadcaster на русском у флэш-потрошителя (http://www.flash-ripper.com/articles/flash/2002_05_22_asbroadcaster.htm)

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

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

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

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