Java时间框架 - 在Animator动画结束时触发事件

时间:2009-07-07 17:48:15

标签: java swing animation

我正在使用Timing Framework中的Animator类来执行简单动画(移动JPanel),大致基于Filthy Rich Clients

中的示例

我已经覆盖了timingEvent(),如下所示

public void timingEvent(float arg0) {

    float fraction = this.animator.getTimingFraction();
    fraction = Math.min(1.0f, fraction);

    if (fraction >= 1.0f) {
        this.mainGUI.initiateSwitchToMainScreenTransition();
    } else if (fraction < 0.5f) {
        this.translateY = (int) (MAX_Y * (2 * fraction));
        repaint();
    }     
}

我覆盖了paint()以使用translateY中的值来移动面板。

动画本身效果很好。

我的问题是调用initiateSwitchToMainScreenTransition(),我希望在动画完成时执行。虽然这有效,但动画结束和调用触发之间存在相当大的延迟(调试已确认问题不是initiateSwitchToMainScreenTransition()所用时间的长度 - 延迟发生在调用之前。)

有没有更好的方法来实现这一目标,即没有延迟?

1 个答案:

答案 0 :(得分:0)

如果您正在实施 org.jdesktop.animation.timing.TimingTarget ,那么有一个end()方法应该在动画完成时调用 - 这似乎对我有用用过它。我认为你不能保证在分数达到1.0之后调用timingEvent。

你的实现似乎没有为定时器的后半部分做任何事情(当分数在0.5和1.0之间时)。如果您希望动画在计时器的整个持续时间内继续,您可以重新排列代码,如下所示:

@Override
public void timingEvent(float fraction) {
    translateY = (int) (MAX_Y * fraction);
    repaint();
}     

@Override
public void end() {
    mainGUI.initiateSwitchToMainScreenTransition();
}