El valor final de GWT Animation no se respeta
gwt-animation (1)
Tengo un FlowPanel que intento animar de un lado a otro como un navegador de iphone. (Vea esta publicación para mi pregunta original sobre cómo hacer esto)
Así que lo tengo "trabajando" con el código que se muestra a continuación. Digo trabajando entre comillas porque estoy descubriendo que mi posición final de mi desplazamiento no es precisa y siempre cambia cuando se desplaza.
El GWT.log siempre dice los valores reales que estoy buscando, así que por ejemplo con la siguiente llamada para scrollTo, mi GWT.log dice:
ScrollStart: 0 scrollStop: -246
Pero cuando realmente analizo el elemento en fireBug, su posición css, left nunca es exactamente -246px. A veces está tan lejos como 10px por lo que mi panel ha dejado de desplazarse antes de terminar.
La peor parte es que este navegador se mueve hacia adelante y hacia atrás, por lo que los clics posteriores realmente pueden tirarlo, y necesito un posicionamiento perfecto para los píxeles, de lo contrario, todo se ve apagado.
Ni siquiera sé por dónde empezar con la depuración de este que no sea lo que ya he hecho. Cualquier consejo es apreciado.
EDITAR: Información de registro adicional:
El inicio de sesión en onUpdate muestra esto:
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
¿Por qué termina en 0.98%?
Código para llamar animación
scroller = new Scroller();
scroller.scrollTo(-246,400);
Código de animación
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
llama a onComplete
cuando finaliza la animación (y onStart
se llama antes de que comience), por lo que se anula si quieres realizar una acción cuando la animación está completa al 100%:
public class Scroller extends Animation {
...
@Override
protected void onComplete() {
e.getStyle().setLeft(scrollStop, Style.Unit.PX);
}
}
Editar Como notas de brad, los documentos no son muy claros que se llama onComplete cuando termina la animación. El Javadoc dice que Animation.onUpdate es:
Llamado cuando la animación debe ser actualizada. El valor del progreso es entre 0.0 y 1.0 inclusive (a menos que anule el método de interpolación (doble) para proporcionar un rango más amplio de valores). Puede anular onStart () y onComplete () para realizar los procedimientos de configuración y derribo.
El código que llama a estos métodos es lo único que deja en claro que solo se llama a onUpdate cuando la animación se ha iniciado pero aún no se ha completado, es decir, cuando el valor de progreso es> 0 pero <1.