我的调整大小事件有点问题...我自己创建了一个组件,这个组件在每个resize事件中运行一个复杂的方法。这是问题:当我最大化或恢复我的窗口时,这个事件在很短的时间内被调用了好几次,没有让我的方法有足够的时间在另一个开始之前完全运行...我想知道如果无论如何只在每次调整大小运动结束时运行此方法。 感谢
答案 0 :(得分:20)
而不是对ResizeEvent做出反应,ResizeEvent将在调整大小期间触发每一帧(即如果你点击最大化并且组件需要3帧从widh / ehight = 0重绘到width / height = MaxValue)那么调整大小事件会触发三次,你可以“观察”宽度和高度的属性。
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>
我更喜欢更改观察器方法,因为它在宽度和高度属性发生更改后触发,而不像在宽度和高度属性相关更新之前触发的调整大小事件。
答案 1 :(得分:3)
您需要将调整大小事件合并为单个事件。 David Coletta在this presentation中简要介绍了事件合并,但我不记得他是否描述了他是如何做到的。
您可以通过多种方式执行此操作,其中一种方法我将在下面的伪代码中进行布局:
resizeHandler(resizeEvent):
if (resizeEventReceived)
return
resizeEventReceived = true
Timer.startIn(30 /*ms*/).withHandler(doResize)
doResize(timerEvent):
/* do actual resize processing */
resizeEventReceived = false
答案 2 :(得分:1)
听起来我在你的事件处理程序中正在做一些导致新的ResizeEvent.RESIZE被触发的东西。由于ActionScript在单个线程中运行,因此在处理程序运行时,没有独立源可能会调度该事件,除非您以某种方式触发它。
答案 3 :(得分:1)
我想指出,flex有一个完整的组件生命周期,可能对您有所帮助:
试试这个:
您可以在此处阅读有关Flex3组件生命周期的更多信息: http://www.dlgsoftware.com/primers/Primer_on_Flex3_Component_Lifecycle.htm