GWT动画的最终值不受尊重

时间:2010-04-19 16:22:32

标签: gwt gwt-animation

我有一个FlowPanel,我试图像iphone导航一样来回动画。 (有关如何执行此操作的原始问题,请参阅this帖子)

所以我让它“正常工作”下面显示的代码。我说在引号中工作,因为我发现我的滚动条的最终位置不精确,滚动时总是会改变。

GWT.log总是说我正在寻找的实际值,所以例如下面调用scrollTo,我的GWT.log说:

  

ScrollStart:0 scrollStop:-246

但是当我实际分析fireBug中的元素时,它的css,左侧位置绝对不是-246px。有时它的关闭时间高达10px,所以我的面板在完成之前就已停止滚动。

最糟糕的是,这个导航器来回动画,所以后续的点击可以真正地将其抛弃,我需要像素完美的定位,否则整个事情就会消失。

除了我已经完成的工作之外,我甚至不知道从哪里开始调试。任何提示都表示赞赏。

编辑:其他日志记录信息:
在onUpdate中记录显示:

Updating: progress: 0.09319577524960648 position: -22.926160711403195
Updating: progress: 0.1328387452821571 position: -32.67833133941065
Updating: progress: 0.609071620698271 position: -149.83161869177468
Updating: progress: 0.7269952498697734 position: -178.84083146796425
Updating: progress: 0.9852532367342712 position: -242.37229623663072
AnimationComplete: final scrollStart/scrollStop: 0/-246

为什么它以0.98%结束?

调用动画的代码

scroller = new Scroller();
scroller.scrollTo(-246,400);

动画代码

public class Scroller extends Animation {

    private FlowPanel scroller;
    private final Element e;

    public Scroller(){
        scroller = new FlowPanel();
        e = scroller.getElement();
    }

    public void scrollTo(int position, int milliseconds) {

        scrollStart = e.getOffsetLeft();
        scrollStop = position;

        GWT.log("ScrollStart: " + scrollStart + " scrollStop: " + scrollStop);
        run(milliseconds);
    }

    @Override
    protected void onUpdate(double progress) {
        double position = scrollStart + (progress * (scrollStop - scrollStart));
        e.getStyle().setLeft(position, Style.Unit.PX);
    }
}

1 个答案:

答案 0 :(得分:7)

动画完成后会调用

onComplete(并且在onStart启动之前调用它),因此如果要在动画完成100%时执行操作,请覆盖它:

public class Scroller extends Animation {
      ...

      @Override
      protected void onComplete() {
        e.getStyle().setLeft(scrollStop, Style.Unit.PX);
      }
}

编辑作为brad笔记,文档不是很清楚onComplete是动画完成时调用的内容。 Javadoc说Animation.onUpdate是:

  

动画时应调用   更新。进步的价值是   介于0.0和1.0之间   (除非你覆盖   插值(double)方法提供   更广泛的价值观)。您可以   将onStart()和onComplete()重写为   执行设置和拆除   程序

code that calls these methods是唯一明确表示只在动画开始但尚未完成时调用onUpdate的事情 - 也就是说,当进度值为>时0但是< 1。