【发布时间】:2009-07-06 16:18:54
【问题描述】:
当 Flex 组件直接移动时,它的 x 和 y 属性会发生变化,然后会在组件上调度一个“move”事件。没关系。
但是,组件也可能由于其父组件的移动而移动 - 或 其 父组件的移动,等等。现在,当父组件移动时,其子组件只是“移动”而不会更改任何属性或在子组件上调度移动事件。尽管如此,孩子们仍在屏幕上移动。那么如何检测这种广义运动呢?
【问题讨论】:
标签: apache-flex
当 Flex 组件直接移动时,它的 x 和 y 属性会发生变化,然后会在组件上调度一个“move”事件。没关系。
但是,组件也可能由于其父组件的移动而移动 - 或 其 父组件的移动,等等。现在,当父组件移动时,其子组件只是“移动”而不会更改任何属性或在子组件上调度移动事件。尽管如此,孩子们仍在屏幕上移动。那么如何检测这种广义运动呢?
【问题讨论】:
标签: apache-flex
一种解决方法是捕获应用程序中的所有移动事件:
Application.application.addEventListener
(MoveEvent.MOVE, handleMove, true, 0, true);
第三个参数是必需的,因为移动事件不会冒泡,因此必须被捕获。第四个参数不重要,第五个参数打开弱引用,在这种情况下这是一个好主意,因为我们正在创建一个从 Application.application 到 handleMove 的全局引用——这是内存泄漏的秘诀。
当然,这会过于频繁地触发(每次应用程序中的任何东西移动时触发一次),并且在大型应用程序中可能会导致性能问题。如果您知道层次结构中较高的某些组件肯定会保持静止,则可以将侦听器放在该位置而不是全局位置,这样可以减少问题。
不过,如果有一种更简洁的方法来解决这个问题,那就太好了。
【讨论】:
好吧,您已经提出了最通用的解决方案,但我认为孩子有可能通过父母/祖父母,直到它达到一个静止的(由您设置的一些动态属性设置),至少这会省去你弄清楚哪个父母处理哪个孩子的麻烦。
private function addHandlerToStationaryParent(handler:function):void
{
var currentParent:DisplayObjectContainer = parent;
while(currentParent != null)
{
if(currentParent["stationary"] == true)
{
currentParent.addEventListener(MoveEvent.MOVE, handler);
return;
}
}
}
我想这是否是一个更好的解决方案取决于您的偏好。
【讨论】: