Есть ли способ прослушать изменения в видимости flash.display.DisplayObject в загруженном SWF? - PullRequest
4 голосов
/ 16 февраля 2010

Я загружаю внешний SWF (предварительно созданный другим отделом компании, в которой я работаю), используя flash.display.Loader. Затем я просматриваю список отображения, регистрирую все объекты и прослушиваю добавленные / удаленные события для обработки будущих изменений в списке.

var obj:DisplayObjectContainer = loadEvent.currentTarget.content as DisplayObjectContainer;
var count:Number = obj.numChildren;
for (var i:Number = 0; i < count; i++)
{
     registerObject(obj.getChildAt(i));
}
obj.addEventListener(Event.ADDED, onChildAdded);
obj.addEventListener(Event.REMOVED, onChildRemoved);

Дело в том, что интересно, что произойдет, если один из разработчиков оригинальных SWF-файлов использует:

.visible = true / false;

Есть ли способ прослушать изменения свойства .visible? Или какое-либо другое свойство (которое не запускает встроенное событие) в этом отношении?

Ответы [ 4 ]

3 голосов
/ 16 февраля 2010

Не по умолчанию, я не думаю. Но вы можете создать свой собственный класс Event и отправить его из переопределения function set Visible без особых хлопот.

Edit: Итак, a_w имеет правильную идею, и вы можете прикрепить ее обратно в контейнер.

Сделайте обертку так:

public class VisibilityEnabledDisplayObject extends DisplayObject
{
    public function VisibilityEnabledDisplayObject(d:DisplayObject)
    {
        super();
        _d = d;
    }
    public function override get visible(b:Boolean):Boolean
    {
        return this._d.visible;
    }
    public function set visible(b:Boolean):void
    {
        if(this._d.visible != value)
        {
            this._d.visible = value;
            this.dispatchEvent(new Event('visibilityChanged'));
        }
    }
    private var _d:DisplayObject;
}

Затем сделайте ваш цикл похожим на:

for (var i:int = 0; i < count; i++)
{
    var do:DisplayObject = obj.getChildAt(i);
    registerObject(do);
    obj.removeChildAt(i);
    var vedo:VisibilityEnabledDisplayObject = new VisibilityEnabledDisplayObject(do);
    obj.addChildAt(vedo, i);
    // register whatever listener you like with the vedo here
}

Тогда метод установки должен вызываться полиморфно. Возможно, вам придется пропустить весь открытый интерфейс DisplayObject через декоратор VisibilityEnabledDisplayObject, я не могу вспомнить прямо сейчас ...

1 голос
/ 17 февраля 2010

Создайте класс-посредник, который будет манипулировать вашим экранным объектом. через экземпляр этого класса вы можете устанавливать и получать любые свойства и отслеживать изменения. например

public class ExistingDOMediator extends EventDispatcher{
   protected var _view:DisplayObject;
   public function ExistingDOMediator(view:DisplayObject):void{
      super();
      this._view = view;
   }
   public function get visible(value:Boolean):void{
      return this._view.visible;
   }
   public function set visible(value:Boolean):void{
      if(this._view.visible!=value){
         this._view.visible = value;
         this.dispatchEvent(new Event('visibilityChanged'));
      }
   }
}
1 голос
/ 16 февраля 2010

См. Может ли компонент Actionscript прослушивать собственные события propertyChange?

Он говорит, что да.

Если вы используете тег [Bindable] без указания типа события, то когда свойство изменяет свое значение, будет отправлено событие типа: PropertyChangeEvent.PROPERTY_CHANGE, которое является строкой 'propertyChange'.

Поэтому, чтобы иметь возможность зарегистрироваться для прослушивания этого события, вы должны сказать:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);

Причина, по которой ваша функция слушателя никогда не вызывалась, заключается в том, что тип события был неправильным.

Обратите внимание, что метод слушателя будет вызываться при изменении любой из переменных, помеченных как Bindable в вашем классе, а не только «on». Это событие имеет свойство под названием «свойство», которое указывает, какая переменная была изменена.

Чтобы избежать вызова для каждой переменной Bindable, вам нужно указать событие в теге [Bindable]:

[Bindable(event="myOnChangeEvent")]

и отправьте это событие вручную, если учесть, что свойство изменяется (то есть: в установщике), хотя, похоже, это не то, что вы хотели сделать.

1 голос
/ 16 февраля 2010

Для DisplayObject вы хотите прослушивать события addedToStage и removedFromStage.

Для компонентов Flex прослушивайте события show и hide.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...