gwt gwt-animation

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.