2010-04-19 72 views
5

我有一個FlowPanel,我試圖來回像iPhone導航一樣來回。 (請參閱this我原來的問題後如何做到這一點)GWT動畫最終值不被尊重

所以我有它「工作」的代碼如下所示。我說在引號中工作是因爲我發現我的滾動條的最終位置不精確,滾動時總是發生變化。

的GWT.log總是說我要找的實際值,因此例如與下面scrollTo的號召,我GWT.log說:

ScrollStart:0 scrollStop:-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%???

代碼來調用動畫

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

動畫代碼

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

回答

7

onComplete被當動畫結束(和onStart被調用開始之前)調用,因此重寫,如果你想在動畫完成時採取行動:

public class Scroller extends Animation { 
     ... 

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

編輯作爲brad筆記,文檔不是很清楚,onComplete是動畫完成時調用的內容。 Javadoc說Animation.onUpdate是:

調用動畫應該是 更新。進度值爲012到,範圍在0.0到1.0之間,包括 (除非您重寫 插值(雙重)方法以提供 更寬範圍的值)。你可以用 覆蓋onStart()和onComplete()到 執行安裝程序並拆除 程序。

code that calls these methods是明確指出,當動畫已經開始的onUpdate只調用但尚未完成的唯一的事情 - 那就是,當進度值> 0,但< 1.

+0

我已經做到這一點,其實,但我認爲這是一個黑客。所以GWT不保證進度會達到100%?他們沒有在文檔中明顯表示 – brad 2010-04-19 20:15:54

+0

onUpdate將永遠不會達到1.0,因爲finished = curTime> = startTime + duration,但是文檔說它是1.0(含)。 – LINEMAN78 2012-05-30 23:17:31

+0

我提交了一個錯誤報告,我們將看看GWT團隊所說的內容: http://code.google.com/p/google-web-toolkit/issues/detail?id=7393 – LINEMAN78 2012-05-30 23:26:55