2010-04-19 13 views
5

Tengo un FlowPanel que intento animar de un lado a otro como un navegador de iphone. (Vea la publicación this para mi pregunta original sobre cómo hacer esto)GWT El valor final de la animación no se respeta

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 que los valores reales que estoy buscando, por lo que, por ejemplo, con la llamada a continuación 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.

EDIT: la información de registro adicional:
Logging dentro de la 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é se terminan a 0,98% ???

código para llamar a la animación

scroller = new Scroller(); 
scroller.scrollTo(-246,400); 

Código 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); 
    } 
} 

Respuesta

7

onComplete se llama cuando se termina la animación (y onStart se llama antes de que comience), por lo que se sobrepase el caso Desea 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 Animation.onUpdate es:

llama cuando la animación se debe actualiza. 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() a realizar la configuración y derribar procedimientos.

El code that calls these methods es el único que tiene claro que onUpdate sólo se invoca cuando la animación se ha iniciado pero aún no ha terminado - es decir, cuando el valor de progreso es> 0, pero < 1.

+0

tengo hecho esto, en realidad, pero supuse que era un truco. ¿Entonces GWT no garantiza que el progreso llegue al 100%? No lo hacen tan obvio en los documentos – brad

+0

onUpdate nunca llegará a 1.0 porque finished = curTime> = startTime + duration, sin embargo, los documentos dicen que es 1.0 inclusive. – LINEMAN78

+0

Envié un informe de error, veremos lo que dice el equipo de GWT: http://code.google.com/p/google-web-toolkit/issues/detail?id=7393 – LINEMAN78

Cuestiones relacionadas