Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.02.2011, 17:47
demy вне форума Посмотреть профиль Отправить личное сообщение для demy Найти все сообщения от demy
  № 1  
Ответить с цитированием
demy
 
Аватар для demy

Регистрация: Sep 2009
Сообщений: 105
Отправить сообщение для demy с помощью ICQ
Question События мыши и их перекрытие

Здравствуйте.
Вопрос, казалось бы, простой, но ответа так и не нашла.
Как сделать так, чтобы при слушателях, например, клика и MOUSE_DOWN - срабатывал либо клик, либо маус-даун?
Я сделала булевы переменные - мол, не надо, я зажала и двигаю, а не кликаю.
Код AS3:
private function moveButtonOn(event:MouseEvent) {
	moving = true;
        ...
}
private function fixTip(event:MouseEvent) {
	if(!moving && !deleting) {
             ...
        }
}
А все равно они срабатывают вместе и переменная не успевает смениться.
Подскажите, как исправить?


Последний раз редактировалось demy; 09.02.2011 в 17:53.
Старый 09.02.2011, 17:57
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 2  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Воспользоватся одним обработчиком?
Код AS3:
private function mouseHandler(event:MouseEvent):void{
	if (event.type == MouseEvent.MOUSE_DOWN) {
		//
	}else if (event.type == MouseEvent.CLICK) {
		//
	}
}

Старый 09.02.2011, 18:06
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 3  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
Сообщение от Bgg Посмотреть сообщение
Воспользоватся одним обработчиком?
А ведь тут тоже оба события срабатывают.

Старый 09.02.2011, 18:26
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Повесить слушатель только на MOUSE_DOWN. Считать сколько милисекунд зажата кнопка, и если дольше положенного диспатчить клик. Ну или просто вызывать функцию обработчик клика.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 09.02.2011, 18:32
demy вне форума Посмотреть профиль Отправить личное сообщение для demy Найти все сообщения от demy
  № 5  
Ответить с цитированием
demy
 
Аватар для demy

Регистрация: Sep 2009
Сообщений: 105
Отправить сообщение для demy с помощью ICQ
Побаловалась с идеей:
Код AS3:
stage.addEventListener(MouseEvent.MOUSE_DOWN, onClick);
stage.addEventListener(MouseEvent.MOUSE_UP, onClick);
stage.addEventListener(MouseEvent.CLICK, onClick);
 
function onClick(event:MouseEvent) {
	var moving = false;
	if (event.type == MouseEvent.MOUSE_DOWN) {
		moving = true;
	}
	if (event.type == MouseEvent.MOUSE_UP) {
		moving = false;
	}
	if (!moving) {
		trace("Ухты!");
	}
}
Получается, что отпускание отменяет зажатие - и остается чистый клик.
Отсюда появилась извращенская идея с массивом отметок событий... но идея не сработала.
Параллельное выполнение... такое параллельное...

Нужно не только перекрыть MOUSE_DOWN, но и клик по окончанию перетаскивания - то есть перекрытие в обе стороны.
Вот как его реализовать - все еще без понятия...


Последний раз редактировалось demy; 09.02.2011 в 18:37.
Старый 09.02.2011, 18:37
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 6  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
А если подписываться и отписываться на нужные события?

Старый 09.02.2011, 18:49
demy вне форума Посмотреть профиль Отправить личное сообщение для demy Найти все сообщения от demy
  № 7  
Ответить с цитированием
demy
 
Аватар для demy

Регистрация: Sep 2009
Сообщений: 105
Отправить сообщение для demy с помощью ICQ
При зажатии срабатывает только down;
при отпускании срабатывает up, click;
при клике срабатывают down, up, click.

Чего-то голова уже не соображает - как их организовать?

Вообще закрадываются подозрения, что поскольку разница между событиями перетаскивания и клика только в длительности
(down, ..., up, click vs down, up, click), придется как-то с этим работать... А таймер очень-очень не хочется.
Правда еще тут же возникает идея - задействовать MOUSE_MOVE - так мы отделим перетаскивание, если мышь
между зажатием и отпускание выдает MOUSE_MOVE.
Но сразу же понятно, что тогда я клик от движения уже не отделю.

И вот окажется, что мы сейчас велосипед изобретаем... =)


Последний раз редактировалось demy; 09.02.2011 в 18:56.
Старый 09.02.2011, 18:50
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Код AS3:
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
 
private var moving:Boolean = false;
...
private function onMouseDown(event:MouseEvent):void
{
    stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
private function onMouseUp(event:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
    if (!moving)
    {
        trace("click");
    }
    moving = false;
}
private function onMouseMove(event:MouseEvent):void
{
   moving = true;
}

Старый 09.02.2011, 19:54
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 9  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
2 alatar - А если у нас не клик а длительное нажатие? Тогда вся теория с маусмувом накроется тазиком.

Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.utils.getTimer;
 
/**
 * @author Dukobpa3
 */
	public class Main extends Sprite 
	{
 
		private var counter:int = 0;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
 
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
			stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
 
			this.graphics.lineStyle(2);
			this.graphics.moveTo(mouseX, mouseY);
 
		}
 
		private function onMove(e:MouseEvent):void 
		{
			this.graphics.lineStyle(2);
			this.graphics.lineTo(mouseX, mouseY);
		}
 
		private function onDown(event:MouseEvent):void 
		{			
			counter = getTimer();//засекаем время начала клика
 
			trace("Мышь нажата");
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);//Это так, для демонстрации прикрутил, можно и не двигать.
 
			event.updateAfterEvent();
		}
 
		private function onUp(event:MouseEvent):void 
		{
			counter -= getTimer();//засекаем конец этого нехитрого действия
 
			if (-counter <= 500) {//если отпустили раньше чем через полсекунды - значит клик
				trace ("Это был клик: " + String( -counter));
				this.graphics.clear();
			}
			else {//иначе обрабатываем завершение движения мыши
				trace("Это был маусМув");
			}
 
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
		}
	}
 
}
Добавлено через 4 минуты
А велосипед да. Помню месяца полтора назад это на форуме уже обсуждалось. Поиск по форуму может помочь...

Кстати и ответы там те же были) Если бы не лень, то дал бы ссылку. Поиск по форуму
__________________
Кто к нам с чем для чего - тот у нас того от того.


Последний раз редактировалось Dukobpa3; 09.02.2011 в 19:56.
Старый 09.02.2011, 20:09
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 10  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
2 alatar - А если у нас не клик а длительное нажатие?
А с каких пор это перестало считаться кликом?

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:14.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
MouseEvent , перекрывание , события мыши
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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