当Flex组件直接移动,以便其x和y属性发生更改时,将在组件上调度“move”事件。这一切都很好。
但是,组件也可能因其父组件移动而移动 - 或其父移动,依此类推。现在当父组件移动时,其子组件只是“移动”而没有任何属性更改或移动子组件上的事件。孩子们仍然在屏幕上移动。那你怎么能发现这种广义运动呢?
答案 0 :(得分:1)
一种解决方法是捕获应用程序中的所有移动事件:
Application.application.addEventListener
(MoveEvent.MOVE, handleMove, true, 0, true);
第三个参数是必需的,因为移动事件不会冒泡,因此必须被捕获。第四个参数是不重要的,第五个参数打开弱引用,在这种情况下这是一个好主意,因为我们正在创建一个从Application.application到handleMove的全局引用 - 一个内存泄漏的配方。
当然,这会经常发生(每次应用程序中的任何内容移动一次),并且在大型应用程序中可能会导致性能问题。如果您知道层次结构中有一些组件肯定会保持不变,那么您可以将侦听器置于该点而不是全局,这可以减少问题。
尽管如此,有一种更清洁的方法可以解决这个问题。
答案 1 :(得分:0)
嗯,你已经提出了最一般的解决方案,但我认为孩子可以通过父母/祖父母,直到它到达一个静止的(由你设置的某个动态属性设置),至少这样会在找出哪个父母处理哪个孩子时,省去了一些麻烦。
private function addHandlerToStationaryParent(handler:function):void
{
var currentParent:DisplayObjectContainer = parent;
while(currentParent != null)
{
if(currentParent["stationary"] == true)
{
currentParent.addEventListener(MoveEvent.MOVE, handler);
return;
}
}
}
我想你是否愿意这是否是一个更好的解决方案。