【问题标题】:In Flex, how can I detect when a component moves?在 Flex 中,如何检测组件何时移动?
【发布时间】:2009-07-06 16:18:54
【问题描述】:

当 Flex 组件直接移动时,它的 x 和 y 属性会发生变化,然后会在组件上调度一个“move”事件。没关系。

但是,组件也可能由于其父组件的移动而移动 - 或 父组件的移动,等等。现在,当父组件移动时,其子组件只是“移动”而不会更改任何属性或在子组件上调度移动事件。尽管如此,孩子们仍在屏幕上移动。那么如何检测这种广义运动呢?

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    一种解决方法是捕获应用程序中的所有移动事件:

    Application.application.addEventListener
      (MoveEvent.MOVE, handleMove, true, 0, true);
    

    第三个参数是必需的,因为移动事件不会冒泡,因此必须被捕获。第四个参数不重要,第五个参数打开弱引用,在这种情况下这是一个好主意,因为我们正在创建一个从 Application.application 到 handleMove 的全局引用——这是内存泄漏的秘诀。

    当然,这会过于频繁地触发(每次应用程序中的任何东西移动时触发一次),并且在大型应用程序中可能会导致性能问题。如果您知道层次结构中较高的某些组件肯定会保持静止,则可以将侦听器放在该位置而不是全局位置,这样可以减少问题。

    不过,如果有一种更简洁的方法来解决这个问题,那就太好了。

    【讨论】:

      【解决方案2】:

      好吧,您已经提出了最通用的解决方案,但我认为孩子有可能通过父母/祖父母,直到它达到一个静止的(由您设置的一些动态属性设置),至少这会省去你弄清楚哪个父母处理哪个孩子的麻烦。

      private function addHandlerToStationaryParent(handler:function):void
      {
          var currentParent:DisplayObjectContainer = parent;
          while(currentParent != null)
          {
              if(currentParent["stationary"] == true)
              {
                   currentParent.addEventListener(MoveEvent.MOVE, handler);
                   return;
              }
          }
      }
      

      我想这是否是一个更好的解决方案取决于您的偏好。

      【讨论】:

      • 您仍然必须将 true 作为第三个参数传递给 addEventListener 以启用捕获。此外,最好将事件侦听器添加到固定祖先的直接子代 - 否则您可能会从固定祖先的不相关子代中捕获事件。
      猜你喜欢
      • 2010-10-11
      • 2018-11-24
      • 1970-01-01
      • 2013-01-10
      • 2019-08-09
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多