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

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

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

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
По умолчанию addEventListener как выборочно обработать события?

На сцене есть основной клип mcMain - внутри него 3 кнопки. Клик по кнопкам обрабатываются одним обработчиком.

Также на клик по stage подписан обработчик.

Как в случае нажатия на кнопки внутри mcMain не обрабатывать событие от stage. Т.к сейчас выполняются и обработчик кнопок и обработчик клика по stage при клике на любую из кнопок.

Пока вижу решение в одном общем обработчике для кнопок и для stage, и по типу кликнутого объекта выполнять нужные действия.

Но может есть решение по правильнее и красивее?

Для наглядности приведу кусочек кода
Код AS3:
private function init(event:Event = null):void
{
	...........
	mainBG.mcMain_navigateBotton_first.addEventListener(MouseEvent.CLICK, btNavigateClick);
	mainBG.mcMain_navigateBotton_second.addEventListener(MouseEvent.CLICK, btNavigateClick);
	mainBG.mcMain_navigateBotton_third.addEventListener(MouseEvent.CLICK, btNavigateClick);
 
	stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
}
 
private function btNavigateClick(event:MouseEvent):void
{
	//trace(event.target.name);
	var sLabel:String = '_' + String(event.target.name).split('_')[2];
	mainBG.gotoAndStop(sLabel);
}
 
private function stageClickHandler(event:MouseEvent):void 
{
	mainBG.play();
}
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 31.01.2009 в 23:42.
Старый 01.02.2009, 00:08
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
event.stopPropagation();

Старый 01.02.2009, 00:08
Dima_DPE вне форума Посмотреть профиль Отправить личное сообщение для Dima_DPE Найти все сообщения от Dima_DPE
  № 3  
Ответить с цитированием
Dima_DPE

блогер
Регистрация: Aug 2005
Сообщений: 178
Записей в блоге: 4
советую просмотреть тут первую презентацию, там вы найдете ответы на свои вопросы.
или/и почитать тут http://wiki.flash-ripper.com/?title=...82%D0%BE%D0%B2


Последний раз редактировалось Dima_DPE; 01.02.2009 в 00:13.
Старый 01.02.2009, 00:21
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 4  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от silin Посмотреть сообщение
event.stopPropagation();
а к чему это применить?
т.е запретить распространение событию от stage? но при каком условии?

вообщем я ушел читать материаллы по ссылкам

Просмотрев презентацию по ссылке выше много чего там пока не понял,
но понял что можно решить вопрос так:
Код AS3:
private function init(event:Event = null):void
{
	...........
	mainBG.mcMain_navigateBotton_first.addEventListener(MouseEvent.CLICK, btNavigateClick);
	mainBG.mcMain_navigateBotton_second.addEventListener(MouseEvent.CLICK, btNavigateClick);
	mainBG.mcMain_navigateBotton_third.addEventListener(MouseEvent.CLICK, btNavigateClick);
 
	stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
}
 
private function btNavigateClick(event:MouseEvent):void
{
	//trace(event.target.name);
	var sLabel:String = '_' + String(event.target.name).split('_')[2];
	mainBG.gotoAndStop(sLabel);
 
	event.stopPropagation();
}
 
private function stageClickHandler(event:MouseEvent):void 
{
	mainBG.play();
}
является ли это правильным и есть ли еще варианты?
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 01.02.2009 в 00:57.
Старый 01.02.2009, 02:08
Dima_DPE вне форума Посмотреть профиль Отправить личное сообщение для Dima_DPE Найти все сообщения от Dima_DPE
  № 5  
Ответить с цитированием
Dima_DPE

блогер
Регистрация: Aug 2005
Сообщений: 178
Записей в блоге: 4
Вариант, но не супер, вам придется останавливать событие на всех обработчиках, на 25 слайде презентации есть другой вариант решения вашей задачи.

Старый 01.02.2009, 04:45
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 6  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Растолкуйте, пожалуйста, что в данном случае происходит.
Я до конца всю логику данного примера понять не могу.

Попытался сделать так:
Код AS3:
private function init(event:Event = null):void
{
	...........
	mainBG.mcMain_navigateBotton_first.addEventListener(MouseEvent.CLICK, btNavigateClick);
	mainBG.mcMain_navigateBotton_second.addEventListener(MouseEvent.CLICK, btNavigateClick);
	mainBG.mcMain_navigateBotton_third.addEventListener(MouseEvent.CLICK, btNavigateClick);
 
	stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
}
 
private function btNavigateClick(event:MouseEvent):void
{
	if (event.eventPhase != EventPhase.AT_TARGET) return;
 
	var sLabel:String = '_' + String(event.target.name).split('_')[2];
	mainBG.gotoAndStop(sLabel);
}
 
private function stageClickHandler(event:MouseEvent):void 
{
	mainBG.play();
}
но теперь события от кнопок ловятся через раз.
Объясните плиз что происходит в данном случае, хотелось бы понять саму суть.
__________________
trace("Остановите Землю, я сойду!!!");

Старый 01.02.2009, 14:28
Dima_DPE вне форума Посмотреть профиль Отправить личное сообщение для Dima_DPE Найти все сообщения от Dima_DPE
  № 7  
Ответить с цитированием
Dima_DPE

блогер
Регистрация: Aug 2005
Сообщений: 178
Записей в блоге: 4
Вы снова все напутали или не снова, но да ладно. Попробуй сделать так и проследить за трейсом.
Код AS3:
private function stageClickHandler(event:MouseEvent):void 
{
	trace("фаза события: " + event.eventPhase);
	//mainBG.play();
}
В случае клика по самой сцене фаза будет второй, при клике по чему то другому, фаза будет третей, об этом и говорилось на 25 слайде той демонстрации. А в обработчике события для кнопки это проверку уберите.

Старый 01.02.2009, 20:49
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 8  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
спасибо, я уже на эксперементировался
на самом деле все наоборот, при клике на сцене фаза будет третьей, т.к событие поднимается (пузырьковая), у меня основной клип-контейнер на весь размер сцены, а при клике на что либо еще можно проверять если currentTarget равен target то не обрабатывать событие от сцены, но такое решение не есть универсальным, т.к если мувик будет не на всю сцену то и событие от сцены не пройдет.

Вообщем пока единственны правильным вижу event.stopPropagation();
Спасибо всем.
__________________
trace("Остановите Землю, я сойду!!!");

Старый 01.02.2009, 21:38
Dima_DPE вне форума Посмотреть профиль Отправить личное сообщение для Dima_DPE Найти все сообщения от Dima_DPE
  № 9  
Ответить с цитированием
Dima_DPE

блогер
Регистрация: Aug 2005
Сообщений: 178
Записей в блоге: 4
Да незачто. Вот только при клике на слушатель фаза все-таки вторая, а не третья как вы говорите, об этом раз десять говорилось в той презентации, да и самому это проверить легко.

Старый 01.02.2009, 22:32
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 10  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
У меня есть основной мувик, в нем есть три кнопки.
Размер мувика покрывает всю область сцены, поэтому при клике на сцене фаза никак второй не получается, т.к события идут ко всем детям если я правильно все понял (в моем случае к фону), и уже на третьей фазе сцена получает свое событие.

Это по умолчанию, если нет фазы захвата.
Но если в области клика не будет никаких элементов то фаза будет второй, но для моего случая такое условие не подходит.

Или я не правильно все понимаю?
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 01.02.2009 в 22:37.
Создать новую тему Ответ Часовой пояс GMT +4, время: 18:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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