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

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

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

Регистрация: May 2008
Сообщений: 102
По умолчанию Конфликт CLICK и MOUSE_DOWN

Проблема известная, но нормального решения в инете не смог найти.

Создаем листнеры:

Код AS3:
this.addEventListener(MouseEvent.MOUSE_DOWN , handleStartDrag );
this.addEventListener(MouseEvent.MOUSE_UP , handleStopDrag );
this.addEventListener(MouseEvent.CLICK , layerClick );
Вместе с CLICK генерится и событие MOUSE_DOWN

в handleStartDrag начинается драг поля на котором "бегают" анимированные объекты. По логике нам нужно, чтобы при драге останавливалась анимация у этих объектов. в handleStopDrag анимация стартует снова.

Соответственно когда просто кликаешь на это поле - срабатывает и layerClick и handleStartDrag. Если кликать очень быстро все анимашки как бы дергаются. Стопятся и стартуют все время.

Как тут можно выкрутиться? Как разделить CLICK и MOUSE_DOWN?


Последний раз редактировалось dimarik; 03.11.2011 в 23:01. Причина: 95 постов и не научились теги расставлять.
Старый 03.11.2011, 18:51
Hidest вне форума Посмотреть профиль Отправить личное сообщение для Hidest Найти все сообщения от Hidest
  № 2  
Ответить с цитированием
Hidest
 
Аватар для Hidest

Регистрация: Jun 2006
Адрес: Москва
Сообщений: 461
По таймеру проверять, сколько прошло времени между MouseDown и MouseUp - если меньше определенного времени (подбор) -то это клик, если больше - то зажали и держат.

Старый 03.11.2011, 19:01
ekeeper вне форума Посмотреть профиль Отправить личное сообщение для ekeeper Найти все сообщения от ekeeper
  № 3  
Ответить с цитированием
ekeeper

Регистрация: May 2008
Сообщений: 102
Сейчас попробую, но есть сомнения.

Старый 03.11.2011, 19:09
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 4  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
Цитата:
Сообщение от Hidest Посмотреть сообщение
По таймеру проверять, сколько прошло времени между MouseDown и MouseUp - если меньше определенного времени (подбор) -то это клик, если больше - то зажали и держат.
+ добавить stage.addEventListener(MouseEvent.MOUSE_MOVE, ...) который реально начинает драг со всеми вытекающими

да, кстати, MOUSE_UP у вас скорее всего неправильно будет обрабатываться (MOUSE_UP'у не обязательно предшествует MOUSE_DOWN по этому объекту)


Последний раз редактировалось fljot; 03.11.2011 в 20:02.
Старый 03.11.2011, 19:28
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 5  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
А MOUSE_UP уже отменили?
click - Это савокупность MOUSE_DOWN и MOUSE_UP
не совсем понимаю зачем их делить

Старый 03.11.2011, 22:43
Vektor вне форума Посмотреть профиль Отправить личное сообщение для Vektor Найти все сообщения от Vektor
  № 6  
Ответить с цитированием
Vektor
 
Аватар для Vektor

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
Может лучше DOUBLE_CLICK.
Код AS3:
this.addEventListener(MouseEvent.DOUBLE_CLICK , layerClick );
Кстати, а при DOUBLE_CLICK, MOUSE_DOWN и MOUSE_UP срабатывают?

Или
Код AS3:
mcName.addEventListener(MouseEvent.CLICK, layerClick );
__________________
Книги и желание лучшие учителя.


Последний раз редактировалось Vektor; 03.11.2011 в 22:50.
Старый 03.11.2011, 22:52
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 7  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Может лучше DOUBLE_CLICK.
Не лучше. Дабл клик работает не так как простой клик.
Для того, чтобы он работал более менее нормально, надо на всех детях контейнера включать
Код AS3:
doubleClickEnabled = true;
Иначе, если двойной щелчок происходит на каком-то ребенке контейнера, событие не доставится.
Цитата:
Кстати, а при DOUBLE_CLICK, MOUSE_DOWN и MOUSE_UP срабатывают?
Конечно срабатывают.

Старый 03.11.2011, 23:17
Vektor вне форума Посмотреть профиль Отправить личное сообщение для Vektor Найти все сообщения от Vektor
  № 8  
Ответить с цитированием
Vektor
 
Аватар для Vektor

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
Хорошо, запомню.
__________________
Книги и желание лучшие учителя.

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

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Код AS3:
this.addEventListener(MouseEvent.MOUSE_DOWN , handleStartDrag );
this.addEventListener(MouseEvent.MOUSE_UP , handleStopDrag );
this.addEventListener(MouseEvent.CLICK , layerClick );
this.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
 
var isDrag:Boolean = false;
 
private function handleMouseMove(event:MouseEvent):void {
    isDrag = event.buttonDown;
}
 
private function handleStartDrag(event:MouseEvent):void {
    if (isDrag) {
        // ...
        // someObject.x = event.stageX;
        // ...
    }
}
Как-то так, идея в том чтобы обрабатывать драг не при нажатии, а при нажатии и перемещении

Добавлено через 4 минуты
Цитата:
Сообщение от goodguy Посмотреть сообщение
Дабл клик работает не так как простой клик.
Для того, чтобы он работал более менее нормально, надо на всех детях контейнера включать
Код AS3:
doubleClickEnabled = true;
Иначе, если двойной щелчок происходит на каком-то ребенке контейнера, событие не доставится.
Кажется проще запретить обрабатывать события мыши дочерним объектам, установив родителю
Код AS3:
mouseChildren = false

Старый 04.11.2011, 03:11
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 10  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
Цитата:
Сообщение от strangedk Посмотреть сообщение
Код AS3:
this.addEventListener(MouseEvent.MOUSE_DOWN , handleStartDrag );
this.addEventListener(MouseEvent.MOUSE_UP , handleStopDrag );
this.addEventListener(MouseEvent.CLICK , layerClick );
this.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
 
var isDrag:Boolean = false;
 
private function handleMouseMove(event:MouseEvent):void {
    isDrag = event.buttonDown;
}
 
private function handleStartDrag(event:MouseEvent):void {
    if (isDrag) {
        // ...
        // someObject.x = event.stageX;
        // ...
    }
}
Это не даст требуемого результата.

Блин что тут вообще обсуждать, топик выеденого яйца не стоит

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

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

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


 


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


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