我试图通过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。这可能是问题的一部分吗?
答案 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.
}
});