我有一个FlowPanel,我试图像iphone导航一样来回动画.(有关如何执行此操作的原始问题,请参阅此帖子)
所以我让它"正常工作"下面显示的代码.我说在引号中工作,因为我发现我的滚动条的最终位置不精确,滚动时总是会改变.
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
Run Code Online (Sandbox Code Playgroud)
为什么它以0.98%结束?
调用动画的代码
scroller = new Scroller();
scroller.scrollTo(-246,400);
Run Code Online (Sandbox Code Playgroud)
动画代码
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);
}
}
Run Code Online (Sandbox Code Playgroud)
onComplete在动画结束onStart时调用(并在启动之前调用),因此如果要在动画完成100%时执行操作,请覆盖它:
public class Scroller extends Animation {
...
@Override
protected void onComplete() {
e.getStyle().setLeft(scrollStop, Style.Unit.PX);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑作为brad笔记,文档不是很清楚,onComplete是动画完成时调用的内容.Javadoc说Animation.onUpdate是:
应该更新动画时调用.进度值介于0.0和1.0之间(除非您覆盖插值(双精度)方法以提供更宽范围的值).您可以覆盖onStart()和onComplete()以执行设置和拆除过程.
调用这些方法的代码是唯一明确表示只在动画启动但尚未完成时调用onUpdate的东西 - 也就是说,当进度值> 0但<1时.