GWT动画最终值不被尊重

问题描述:

我有一个FlowPanel,我试图来回像iPhone导航一样来回。 (请参阅this我原来的问题后如何做到这一点)GWT动画最终值不被尊重

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

的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); 
    } 
} 

onComplete被当动画结束(和onStart被调用开始之前)调用,因此重写,如果你想在动画完成时采取行动:

public class Scroller extends Animation { 
     ... 

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

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

调用动画应该是 更新。进度值为012到,范围在0.0到1.0之间,包括 (除非您重写 插值(双重)方法以提供 更宽范围的值)。你可以用 覆盖onStart()和onComplete()到 执行安装程序并拆除 程序。

code that calls these methods是明确指出,当动画已经开始的onUpdate只调用但尚未完成的唯一的事情 - 那就是,当进度值> 0,但< 1.

+0

我已经做到这一点,其实,但我认为这是一个黑客。所以GWT不保证进度会达到100%?他们没有在文档中明显表示 – brad 2010-04-19 20:15:54

+0

onUpdate将永远不会达到1.0,因为finished = curTime> = startTime + duration,但是文档说它是1.0(含)。 – LINEMAN78 2012-05-30 23:17:31

+0

我提交了一个错误报告,我们将看看GWT团队所说的内容: http://code.google.com/p/google-web-toolkit/issues/detail?id=7393 – LINEMAN78 2012-05-30 23:26:55