我需要更新我的動畫每幀,在iOS上我有CADisplayLink
,WinPhone我有CompositionTarget
,但我該怎麼做在Android上?什麼是Android相關的CADisplayLink(iOS)或CompositionTarget(WP)
目前我使用Timer
以及Handler
,但我相信有一種方法可以將回調與刷新率同步。
我需要更新我的動畫每幀,在iOS上我有CADisplayLink
,WinPhone我有CompositionTarget
,但我該怎麼做在Android上?什麼是Android相關的CADisplayLink(iOS)或CompositionTarget(WP)
目前我使用Timer
以及Handler
,但我相信有一種方法可以將回調與刷新率同步。
嗯,看起來像ViewTreeObserver
可能會幫助你。試試這個代碼:
final ViewTreeObserver vto = myView.getViewTreeObserver();
vto.addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
@Override
public void onDraw() {
// Do whatever you need to do...
}
});
夫婦的注意事項:
onDraw
有一堆,你可以在裏面做什麼限制。具體來說,你不能修改視圖樹。如果這是您需要做的事情,請改爲參閱ViewTreeObserver.OnPreDrawListener
。我知道的最直接的等價物是Choreographer
(截至API 16)。
它看起來像你的動畫是如何寫的決定了最好的方式來同步它。編舞並不總是有用的。如果您的動畫是在AFAIK包含的「動畫框架」之外編寫的,編排器很有用,而且可能是XML定義的動畫?究竟什麼是無證的。
Choreographer
看起來像它主要用於同步GLSurfaceView
動畫。
FWIW,它似乎像Android的UI框架呈現與GLSurfaceView鎖定步驟。我的猜測是SurfaceFlinger在合成輸出幀之前執行每個阻擋幀的出列。 – nmr
不錯,這對我來說已經夠好了。 – horeaper
這與「CADisplayLink」的不同之處在於,只有在繪製視圖時纔會回調,只有在視圖無效時纔會發生這種情況。相反,在繪製的每個幀上調用「CADisplayLink」。爲了模仿'CADisplayLink'我做了上述操作,並在我的自定義視圖的'onDraw()'方法中調用'invalidate()'。 – mvds