Apache flex Flex-ResizeEvent.RESIZE存在问题

Apache flex Flex-ResizeEvent.RESIZE存在问题,apache-flex,events,resize,Apache Flex,Events,Resize,我的调整大小事件有点小问题。。。我自己创建了一个组件,该组件在每次调整大小事件中都运行一个复杂的方法。问题是:当我最大化或恢复我的窗口时,这个事件会在很短的时间内被调用几次,没有足够的时间让我的方法在另一个方法启动之前完全运行。。。我想知道是否在每次调整大小运动结束时都只运行此方法。 谢谢您将希望将调整大小事件合并到单个事件中。David Coletta简要地谈到了事件融合,但我不记得他是否描述了他是如何做到这一点的 您可以通过多种方式实现这一点,其中一种方式我将在下面的伪代码中进行布局: re

我的调整大小事件有点小问题。。。我自己创建了一个组件,该组件在每次调整大小事件中都运行一个复杂的方法。问题是:当我最大化或恢复我的窗口时,这个事件会在很短的时间内被调用几次,没有足够的时间让我的方法在另一个方法启动之前完全运行。。。我想知道是否在每次调整大小运动结束时都只运行此方法。
谢谢

您将希望将调整大小事件合并到单个事件中。David Coletta简要地谈到了事件融合,但我不记得他是否描述了他是如何做到这一点的

您可以通过多种方式实现这一点,其中一种方式我将在下面的伪代码中进行布局:

resizeHandler(resizeEvent):
   if (resizeEventReceived)
       return
   resizeEventReceived = true
   Timer.startIn(30 /*ms*/).withHandler(doResize)

doResize(timerEvent):
    /* do actual resize processing */
    resizeEventReceived = false

在我看来,您似乎在事件处理程序中执行某些操作,导致触发新的ResizeEvent.RESIZE。由于ActionScript在单个线程中运行,因此在处理程序运行时,任何独立的源都不可能调度该事件,除非您以某种方式触发它。

而不是对ResizeEvent作出反应,ResizeEvent将在resize期间触发每一帧(即,如果点击“最大化”,组件从widh/ehight=0重绘到width/height=MaxValue需要3帧),则调整大小事件将触发三次,您可以“观察”宽度和高度的属性

var widthWatch:ChangeWatcher = ChangeWatcher.watch(this, 'widht', resizeHandler)
var heightWatch:ChangeWatcher = ChangeWatcher.watch(this, 'height' resizeHandler)
实际上,这将观察属性,类似于数据绑定,并在宽度或高度发生变化时执行resizeHandler。这有一个轻微的缺点,即如果宽度和高度同时发生变化,将触发处理程序两次,但这可以通过第三个函数来解决,该函数将在以下情况下由处理程序调用:它不是要调用的计划。代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete(event)">
<mx:Script>
 <![CDATA[
  import mx.binding.utils.ChangeWatcher;

  private var widthWatch:ChangeWatcher;
  private var heightWatch:ChangeWatcher;
  private var resizeExecuting:Boolean = false;

  private function onCreationComplete(event:Event):void
  {
   widthWatch = ChangeWatcher.watch(this,'width',onSizeChange);
   heightWatch = ChangeWatcher.watch(this,'height',onSizeChange);
  }

  private function onSizeChange(event:Event):void
  {
   if(!resizeExecuting)
    callLater(handleResize);
   resizeExecuting = true;
  }

  private function handleResize():void
  {
   //do expensive work here
   resizeExecuting = false;
  }

  private function stopWatching()
  {
   //invoke this to stop watching the properties and prevent the handleResize method from executing
   widthWatch.unwatch();
   heightWatch.unwatch();
  }

 ]]>
</mx:Script>
</mx:Application>


我更喜欢change watcher方法,因为它是在宽度和高度属性更改后触发的,而不是在宽度和高度属性正确更新之前触发的调整大小事件。

我想指出,flex具有完整的组件生命周期,这可能会帮助您:

试试这个:

  • 不要直接计算屏幕更改,而是在updateDisplayList方法中进行计算
  • 接收ResizeEvent时,只调用invalidateDisplayList()方法,该方法设置一个框架标志,该标志将触发updateDisplayList()的执行
  • 您可以在此处阅读有关Flex3组件生命周期的更多信息:

    作为此问题的补充,由于我在Dedoose的图表组件中经常遇到此问题,请使用greenthreading()。在当前绿色线程上保留一个句柄,如果它不完整,您可以在计算过程中停止它,以便重新启动。这允许用户界面响应良好,并同时处理调整大小时的复杂计算。Widt最有可能为width