在Flex中,如何检测组件何时移动?

时间:2009-07-06 16:18:55

标签: flex

当Flex组件直接移动,以便其x和y属性发生更改时,将在组件上调度“move”事件。这一切都很好。

但是,组件也可能因其父组件移动而移动 - 或父移动,依此类推。现在当父组件移动时,其子组件只是“移动”而没有任何属性更改或移动子组件上的事件。孩子们仍然在屏幕上移动。那你怎么能发现这种广义运动呢?

2 个答案:

答案 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;
        }
    }
}

我想你是否愿意这是否是一个更好的解决方案。