我正在使用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属性的变化? 或者任何其他财产(不会触发内置事件)?
答案 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
,您希望收听addedToStage
和removedFromStage
个事件。
对于Flex组件,请收听show
和hide
个事件。
答案 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')); } } }