2010-04-19 4 views
5

Mam FlowPanel który próbuję animowanie iz powrotem jak nav iPhone. (Zobacz this post na moje oryginalne pytanie, jak to zrobić)GWT Animacja końcowa wartość nie jest przestrzegana

Tak więc mam to "działa" z kodem pokazanym poniżej. Mówię pracuje w cudzysłowie, bo jestem stwierdzenia, że ​​moja ostateczna pozycja mojej zmieniacza nie jest precyzyjny i zawsze zmienia się podczas przewijania.

GWT.log zawsze mówi rzeczywiste wartości szukam, więc na przykład z wezwaniem do scrollTo poniżej, mój GWT.log mówi:

ScrollStart: 0 scrollStop: -246

Ale kiedy rzeczywiście analizować element w Firebug, jego css, lewa pozycja nie jest dokładnie -246px. Czasami jest on wyłączony nawet o 10 pikseli, więc mój panel właśnie przestał przewijać przed zakończeniem.

Najgorsze jest to, że nav ożywia iz powrotem, tak naprawdę kolejne kliknięcia można wyrzucić go, i muszę piksela idealny pozycjonowanie inaczej całe rzeczy wygląda off.

Nie wiem nawet, od czego zacząć od debugowania tego poza tym, co już zrobiłem. Wszelkie wskazówki są mile widziane.

EDIT: Dodatkowe informacje logowania:
Logging wewnątrz onUpdate pokazuje to:

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 

Dlaczego to się kończy na 0,98% ???

Kod zadzwonić animacja

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

kod animacji

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); 
    } 
} 

Odpowiedz

7

onComplete jest wywoływana, gdy animacja jest zakończona (a onStart jest wywoływana przed jego rozpoczęciem), więc zastępują że jeśli chcesz wykonać czynność, gdy animacja zostanie wykonana w 100%:

public class Scroller extends Animation { 
     ... 

     @Override 
     protected void onComplete() { 
     e.getStyle().setLeft(scrollStop, Style.Unit.PX); 
     } 
} 

Edit Brad notatki, docs nie są bardzo jasne, że onComplete to, co nazywa, gdy animacja jest zakończona. Javadoc mówi Animation.onUpdate jest:

Wywoływana, gdy animacja powinna być aktualizowana. Wartość postępu wynosi między 0,0 a 1,0 włącznie (chyba że zastąpisz metodę interpolacji (podwójną) , aby zapewnić szerszy zakres wartości). Można wykonać następujące operacje: onStart() i onComplete() na na wykonaj procedury konfiguracji i zerwania.

code that calls these methods jest jedyną rzeczą, która wyjaśnia, że ​​onUpdate nazywa się tylko wtedy, gdy animacja zaczęła, ale jeszcze nie skończył - to znaczy, gdy wartość postęp jest> 0, ale < 1.

+0

mam zrobiłem to, właściwie, ale założyłem, że to był hack. Więc GWT nie gwarantuje, że postęp osiągnie 100%? Nie robią tego w oczywisty sposób w dokumentach: – brad

+0

onUpdate nigdy nie trafi 1.0, ponieważ zakończono = curTime> = startTime + czas trwania, jednak docs mówią, że jest 1.0 włącznie. – LINEMAN78

+0

Zgłosiłem zgłoszenie błędu, zobaczymy, co zespół GWT mówi: http://code.google.com/p/google-web-toolkit/issues/detail?id=7393 – LINEMAN78