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

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

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

Регистрация: Dec 2007
Сообщений: 102
По умолчанию Слушатели

как у EventDispatcher посмотреть какой стоит useCapture для определенного типа событий, и что если было вызвано 2 addEventListener с useCapture true и false

или придеться полюбому переопределять addEventListener и складывать в массив подписанных событий? типа
Код AS3:
array.push([type, useCaptureTrue, useCaptureFalse]);


Последний раз редактировалось CROL; 30.04.2011 в 22:33.
Старый 30.04.2011, 22:56
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
useCapture - это свойство события, а не EventDispatcher,
проверка:
Код AS3:
if (event.eventPhase == EventPhase.CAPTURING_PHASE) {...}
Цитата:
что если было вызвано 2 addEventListener с useCapture true и false
один раз событие перехватится в фазе захвата - второй в фазе всплытия.

Может попробуете обяснить что вы конкретно пытаетесь сделать?

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

Регистрация: Dec 2007
Сообщений: 102
Цитата:
Сообщение от expl Посмотреть сообщение
Может попробуете обяснить что вы конкретно пытаетесь сделать?
Пытаюсь сделать подобие событийной модели ДО
Сейчас у меня addEventListener выглядит так:
Код AS3:
override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
		{
			if(useCapture)
			{
				_useCaptureTrue = true;
			} else {
				useCaptureFalse _ = true;
			}
 
			if(!super.hasEventListener(type))
			{
				super.addEventListener(type, listener, false, priority, useWeakReference);
			}
		}
Естественно это ни в какие ворота, щас есть просто глобальные useCaptureTrue и useCaptureFalse для любого вида событий..
Что лучше использовать чтоб было правильней? У меня сейчас мозги смотрят в сторону массива, но может есть идеи получше?

Старый 01.05.2011, 00:43
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Если оставить вопрос "А зачем нужна фаза захвата для невизуальных объектов?"

Главная идея: capture или не capture - это всетки свойство "подписанного слушателя" (я был не прав с событием - у него оно как-бы меняется, как-бы - потому-что событие клонируется)

Поэтому не знаю как вам поможет массив, в котором нет информации о функциях-слушателях

Значит надо:
- связать useCapture со слушателем
- помнить что тот же слушатель может подписаться еще и через useCapture == false;

Сделать поле в listener с названием useCapture мы физически не можем.
Значит надо замепить useCapture по ключу-слушателю, например так:
Код AS3:
    private var _listenerAddedAsUseCapture:Dictionary = new Dictionary();
    private var _listenerAddedAsNotUseCapture:Dictionary = new Dictionary();
    override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
		{
			if(useCapture)
			{
				_listenerAddedAsUseCapture[listener] = listener;
			} else {
				_listenerAddedAsNotUseCapture[listener] = listener;
			}
		}
 
               // При имуляции фазы захвата
               event.eventPhase == EventPhase.CAPTURING_PHASE;// read-only - чтобы стало не рид-онли, видимо, придется расширить класс Event и использовать только собственне эвенты или забить на это поле
               for each (var listener:Function in _listenerAddedAsUseCapture)
               {
                     listener(event);
                }
 
                 // При диспетчинге фазы всплытия
               for each (var listener:Function in _listenerAddedAsNotUseCapture)
               {
                     listener(event);
                }
Может прокатит вариант по-красивее (может удобнее будет рулить 2-мя внутренними диспетчерами, видимо, собственной реализации):
Код AS3:
                 override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
		{
			if(useCapture)
			{
				_captureEventDispatcher.addEventListener(type, listener, true, 0, useWeakReference);
			} else {
				_normalEventDispatcher.addEventListener(type, listener, false, 0, useWeakReference);
			}
		}
 
               // При имуляции фазы захвата
               _captureEventDispatcher.dispatch(event);
 
                 // При диспетчинге фазы всплытия
               _normalEventDispatcher.dispatch(event);
_captureEventDispatcher - это наша реализация, которая будет эмулировать фазу захвата
_normalEventDispatcher - это тоже наша реализация, которая будет эмулировать фазу всплытия

Теоретически так должно быть меньше каши в коде
Но
"В теории теория и практика не разделимы - на практике это не совсем так"


Последний раз редактировалось expl; 01.05.2011 в 00:49.
Старый 01.05.2011, 01:41
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 5  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Цитата:
Что если было вызвано 2 addEventListener с useCapture true и false?
Цитата:
Keep in mind that after the listener is registered, subsequent calls to addEventListener() with a different type or useCapture value result in the creation of a separate listener registration. For example, if you first register a listener with useCapture set to true, it listens only during the capture phase. If you call addEventListener() again using the same listener object, but with useCapture set to false, you have two separate listeners: one that listens during the capture phase and another that listens during the target and bubbling phases.
Цитата:
Как у EventDispatcher посмотреть какой стоит useCapture для определенного типа событий?
Стандартными средствами - никак, к сожалению. Придется перекрывать addEventListener и removeEventListener, чтобы запоминать и удалять информацию о слушателях. Причем это весьма обидно, так как оригинальные методы делают абсолютно то же самое, но используют хранилище, недоступное для пользовательского кода.
__________________
тонкий тролль, осеянный благодатью

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

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

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


 


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


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