不考虑GWT动画最终值

不考虑GWT动画最终值,gwt,gwt-animation,Gwt,Gwt Animation,我有一个FlowPanel,我正试图像iphone导航一样来回设置动画。(关于如何做到这一点,我最初的问题见帖子) 因此,我让它“工作”的代码如下所示。我说用引号工作是因为我发现我的滚动条的最终位置不精确,而且在滚动时总是变化 GWT.log总是显示我要查找的实际值,因此,例如,在下面调用scrollTo时,我的GWT.log会显示: 滚动开始:0滚动停止:-246 但当我实际分析fireBug中的元素时,它的css,左边的位置永远不会精确到-246px。有时它的关闭高达10px,所以我的面板在

我有一个FlowPanel,我正试图像iphone导航一样来回设置动画。(关于如何做到这一点,我最初的问题见帖子)

因此,我让它“工作”的代码如下所示。我说用引号工作是因为我发现我的滚动条的最终位置不精确,而且在滚动时总是变化

GWT.log总是显示我要查找的实际值,因此,例如,在下面调用scrollTo时,我的GWT.log会显示:

滚动开始:0滚动停止:-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%结束

调用动画的代码

动画代码


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

public class Scroller extends Animation {
      ...

      @Override
      protected void onComplete() {
        e.getStyle().setLeft(scrollStop, Style.Unit.PX);
      }
}
编辑正如brad所指出的,文档并不十分清楚动画完成时是否称为onComplete。Javadoc说:

应在播放动画时调用 更新。进步的价值在于 介于0.0和1.0之间 (除非您覆盖 内插(双)法提供 更广泛的价值范围)。你可以 将onStart()和onComplete()重写为 执行安装和拆卸 程序


这是唯一一件可以明确说明onUpdate仅在动画已开始但尚未完成时调用的事情,也就是说,当进度值大于0但小于1时。

我已经这样做了,但我认为这是一个黑客行为。所以GWT不能保证进度达到100%??他们没有在docsonUpdate中说明这一点,因为finished=curTime>=startTime+duration,所以更新将永远不会达到1.0,但是文档说它包含1.0。我提交了一份错误报告,我们将看到GWT团队的说法:
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);
    }
}
public class Scroller extends Animation {
      ...

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