2013-01-25 42 views

回答

2

嗯,看起來像ViewTreeObserver可能會幫助你。試試這個代碼:

final ViewTreeObserver vto = myView.getViewTreeObserver(); 
vto.addOnDrawListener(new ViewTreeObserver.OnDrawListener() { 
    @Override 
    public void onDraw() { 
     // Do whatever you need to do... 
    } 
}); 

夫婦的注意事項:

  • onDraw有一堆,你可以在裏面做什麼限制。具體來說,你不能修改視圖樹。如果這是您需要做的事情,請改爲參閱ViewTreeObserver.OnPreDrawListener
  • 攝像頭預覽和媒體播放都是在單獨的路徑上繪製的,並且很可能不會與此偵聽器同步,因此您無法使用它來執行與各個幀同步的內容。
+0

不錯,這對我來說已經夠好了。 – horeaper

+1

這與「CADisplayLink」的不同之處在於,只有在繪製視圖時纔會回調,只有在視圖無效時纔會發生這種情況。相反,在繪製的每個幀上調用「CADisplayLink」。爲了模仿'CADisplayLink'我做了上述操作,並在我的自定義視圖的'onDraw()'方法中調用'invalidate()'。 – mvds

3

我知道的最直接的等價物是Choreographer(截至API 16)。

它看起來像你的動畫是如何寫的決定了最好的方式來同步它。編舞並不總是有用的。如果您的動畫是在AFAIK包含的「動畫框架」之外編寫的,編排器很有用,而且可能是XML定義的動畫?究竟什麼是無證的。

Choreographer看起來像它主要用於同步GLSurfaceView動畫。

+0

FWIW,它似乎像Android的UI框架呈現與GLSurfaceView鎖定步驟。我的猜測是SurfaceFlinger在合成輸出幀之前執行每個阻擋幀的出列。 – nmr