Цитата:
виндоусе между маусдауном и апом может пройти хоть 10 минут(мало ли на мой объект будет кликать дама бальзаковского возраста), и он обработает его как клик
|
В виндовсе нет клика вообще. И обработкой кликов виндовс не занимается.
Событие клика формируется на уровне приложения, т.е. логически. Традиционно, обрабатываются системные уведмления WM_LBUTTONDOWN|WM_LBUTTONUP, без каких-то там таймингов. Нажали-отпустили и все. Лишь бы отпустили над кнопкой же. И будет вам клик. Медленный или быстрый клик в этом контексте вообще рассматривать не уместно. Ибо клик - он и в африке клик. Так должно быть, по крайней мере пользователю любого возраста будет понятно, что происходит, когда он тыкает мышкой по кнопкам.
Собственно, silin все уже озвучил - по DOWN запускаем DRAG (MOVE), потом в UP смотрим, был ли драг: если нет - то значит был клик
.
Код AS3:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
public class Main extends Sprite
{
private var touchP:Point;
private var currP:Point;
private var drag:Boolean;
private var tol:Number = 10;
private var body:Sprite;
public function Main():void
{
body = new Sprite();
body.graphics.beginFill(0);
body.graphics.drawRect(100, 100, 100, 40);
addChild(body);
body.addEventListener(MouseEvent.MOUSE_DOWN, body_mouseDown);
}
private function body_mouseDown(e:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
touchP = new Point(stage.mouseX, stage.mouseY);
currP = new Point(stage.mouseX, stage.mouseY);
drag = false;
}
private function stage_mouseUp(e:MouseEvent):void
{
if (!drag)
{
trace("CLICK");
}
stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
}
private function stage_mouseMove(e:MouseEvent):void
{
body.x += stage.mouseX - currP.x;
body.y += stage.mouseY - currP.y;
currP = new Point(stage.mouseX, stage.mouseY);
if (Point.distance(currP, touchP) > tol)
{
drag = true;
}
}
}
}