检测调整大小事件何时结束

时间:2012-06-13 12:37:37

标签: actionscript-3 resize

有什么方法可以检测resizeHandlers完成时刻吗?像这样的东西:

this.addEventListener(Event.RESIZE_COMPLETE, resizeHandler);

我希望有人有办法让这成为可能,所以我可以删除我的enterframehandler:)

3 个答案:

答案 0 :(得分:3)

基本上你需要做的是设置一个计时器,它将在最后Event.RESIZE之后计算时间。一旦经过足够的时间(例如,50ms左右),您可以假设用户已停止连续调整舞台大小。此代码可以模拟您的需求:

private var timer:Timer;
private var resizeInterval:Number = 50; //amount of time you believe is enough to say that continuous resizing is ended after last discrete Event.RESIZE

private function init():void
{
  timer = new Timer(resizeInterval);
  timer.addEventListener(TimerEvent.TIMER, timerHandler);
  stage.addEventListener(Event.RESIZE, resizeHandler);
}

private function resizeHandler(e:Event):void
{
  if (timer.running) {
    timer.reset();
  }
  timer.start();
}
private function timerHandler(e:Event):void
{
  timer.stop();
  resizeCompletehandler();
}

答案 1 :(得分:1)

根据浏览器/操作系统调度

Event.RESIZE

在某些情况下,每次用户更改浏览器窗口大小时都会触发它,有时会按间隔调度,有时会在用户释放鼠标按钮时调度。

无法知道调整大小已经完成......

答案 2 :(得分:0)

在Adobe AIR for Desktop中,此Timer模式不适用于示例timerInterval,因为调整大小事件在100ms至150ms之间触发。 timerInterval必须大于最大的典型调整大小事件间隔,才能可靠地检测到调整大小过程的结束。

这是用户调整舞台大小时的跟踪输出:

[trace] 15:02:27:128 onResize() - nativeWindows.width: 911
[trace] 15:02:27:239 onResize() - nativeWindows.width: 884
[trace] 15:02:27:358 onResize() - nativeWindows.width: 866
[trace] 15:02:27:475 onResize() - nativeWindows.width: 844
[trace] 15:02:27:593 onResize() - nativeWindows.width: 820
[trace] 15:02:27:677 onResize() - nativeWindows.width: 805
[trace] 15:02:27:762 onResize() - nativeWindows.width: 799
[trace] 15:02:27:842 onResize() - nativeWindows.width: 788
[trace] 15:02:27:935 onResize() - nativeWindows.width: 778
... 

但是,跟踪输出过程本身可能会稍微污染测量结果。

我认为RESIZE事件间隔在Flash Player和AIR运行时之间可能会有所不同,因此请确保在选择resizeInterval之前先进行测试。我在AIR桌面应用中使用了250ms的时间,效果很好。

但是,如果当用户在拖动窗口后释放鼠标时AIR仅触发MOUSE_UP事件,则我们根本不需要这样做。然后,可以在第一个RESIZE事件中添加MOUSE_UP的事件侦听器,并等待用户释放鼠标捕获,但是在用户调整窗口大小后,Adobe AIR运行时不会触发阶段MOUSE_UP事件。我希望Flash Player中具有相同的行为。

谢谢您的回答。确实有效。我只是希望有更好的方法。