5

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

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

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

滚动开始:0 滚动停止:-246

但是当我实际分析 fireBug 中的元素时,它的 css,left 位置永远不会正好是-246px。有时它会偏离 10 像素,所以我的面板在完成之前刚刚停止滚动。

最糟糕的部分是这个导航来回动画,所以随后的点击真的可以把它扔掉,我需要像素完美的定位,否则整个事情看起来都没有。

除了我已经做过的事情之外,我什至不知道从哪里开始调试它。任何提示表示赞赏。

编辑:附加日志信息:
在 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);
    }
}
4

1 回答 1

7

onComplete在动画完成时onStart被调用(并在它开始之前被调用),所以如果你想在动画 100% 完成时采取行动,请覆盖它:

public class Scroller extends Animation {
      ...

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

编辑正如布拉德所说,文档不是很清楚 onComplete 是动画完成时调用的内容。Javadoc 说Animation.onUpdate是:

在应该更新动画时调用。progress 的值介于 0.0 和 1.0 之间(除非您重写 interpolate(double) 方法以提供更广泛的值)。您可以覆盖 onStart() 和 onComplete() 以执行设置和拆卸过程。

调用这些方法的代码是唯一清楚地表明 onUpdate 仅在动画开始但尚未完成时调用 - 即当进度值 > 0 但 < 1 时。

于 2010-04-19T18:51:28.850 回答