不考虑GWT动画最终值
我有一个FlowPanel,我正试图像iphone导航一样来回设置动画。(关于如何做到这一点,我最初的问题见帖子) 因此,我让它“工作”的代码如下所示。我说用引号工作是因为我发现我的滚动条的最终位置不精确,而且在滚动时总是变化 GWT.log总是显示我要查找的实际值,因此,例如,在下面调用scrollTo时,我的GWT.log会显示: 滚动开始:0滚动停止:-246 但当我实际分析fireBug中的元素时,它的css,左边的位置永远不会精确到-246px。有时它的关闭高达10px,所以我的面板在完成之前刚刚停止滚动 最糟糕的是,这个导航会前后移动,所以后续的点击会真的把它打乱,我需要像素级的完美定位,否则整个事情看起来都不对劲 除了我已经做过的,我甚至不知道从哪里开始调试它。任何提示都将不胜感激 编辑:其他日志信息:不考虑GWT动画最终值,gwt,gwt-animation,Gwt,Gwt Animation,我有一个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);
}
}