GWT:为什么在LayoutPanel上的animate()之前执行DeferredCommand?

时间:2011-01-13 16:57:30

标签: gwt

我试图通过animate()和DeferredCommand了解事件循环的时间。我的LayoutPanel左侧有一个导航栏(如Outlook),然后屏幕的其余部分可以在两个面板之间垂直分割之间切换,或者底部面板(分割时)可以设置为填充屏幕的其余部分。我有他们之间的布局和基本动画工作,但我试图延迟使用DeferredCommand调整底部屏幕的大小。这样做的原因是,当从底部面板的全屏到半屏时,我想调整底部面板之后将其缩小到一半尺寸。如果没有发生这种情况,则将底部面板调整为halfsize,同时仍然全屏显示,然后动画发生。

但是,这正是正在发生的事情,我试图通过DeferredCommand避免这种情况。因此看起来DeferredCommand在animate之前执行。

这是代码段

setWidgetTopHeight(...make top panel half size)
setWidgetTopHeight(...make lower panel half size, positioned halfway down)
animate(500); 
DeferredCommand.addCommand(new Command() {
    public void execute() {
         ...resize Widget inside lower Panel
    }
});

在animate中调整大小的下面板是在DeferredCommand中调整大小的实际窗口小部件周围的FlowPanel。这可能是问题的一部分吗?

1 个答案:

答案 0 :(得分:3)

animate()由连续数量的ScheduledCommands(或等效的)实现 - 即动画不会在浏览器事件循环的单次迭代中完成。请注意,在GWT 2.1中不推荐使用DeferredCommand - Scheduler提供相同的功能。动画完成后执行操作的正确方法是使用AnimationCallback

animate(500, new Layout.AnimationCallback() {
  @Override
  public void onAnimationComplete() {
    // Perform post-animation action.
  }

  @Override
  public void onLayout(Layout.Layer layer, double progress) {
    // Ignored.
  }
});