Показать сообщение отдельно
Старый 17.12.2013, 16:54
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 16  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Цитата:
виндоусе между маусдауном и апом может пройти хоть 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;
			}
		}
 
	}
 
}