有没有办法在加载的SWF中监听flash.display.DisplayObject可见性的变化?

时间:2010-02-16 20:38:25

标签: actionscript-3 flex3

我正在使用flash.display.Loader加载外部SWF(由我工作的公司的其他部门预先制作)。然后,我遍历显示列表,注册所有对象并侦听添加/删除的事件,以处理对列表的未来更改。

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 个答案:

答案 0 :(得分:3)

不是默认情况下,我不这么认为。但是你可以创建自己的Event类并从覆盖function set Visible发送它而不会有太多麻烦。

修改 好的,所以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
}

然后应该多态调用setter方法。您可能必须通过VisibilityEnabledDisplayObject装饰器传递整个公共DisplayObject接口,我现在不记得了......

答案 1 :(得分:1)

对于DisplayObject,您希望收听addedToStageremovedFromStage个事件。

对于Flex组件,请收听showhide个事件。

答案 2 :(得分:1)

请参阅Can an Actionscript component listen to its own propertyChange events?

它说是。

如果使用[Bindable]标签而未指定事件类型,则当属性更改其值时,将调度类型为:PropertyChangeEvent.PROPERTY_CHANGE的事件,即字符串'propertyChange'。

因此,为了能够注册听取该事件,您需要说:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);

从未调用过侦听器函数的原因是事件类型不正确。

请注意,当类中标记为Bindable的任何变量发生更改时,将调用侦听器方法,而不仅仅是“on”。此事件带有一个名为“property”的属性,指示哪个变量已更改。

为避免在每个Bindable变量上调用,您需要在[Bindable]标记中指定一个事件:

[Bindable(event="myOnChangeEvent")]

并在您考虑该属性正在发生变化时手动调度该事件(即:在setter中),尽管这似乎不是您想要做的事情。

答案 3 :(得分:1)

创建一个中介类,它将操纵您的显示对象。通过该类的实例,您可以设置并获取任何属性并监视更改。例如

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'));
      }
   }
}