2013-01-25 8 views

risposta

2

Hm, sembra che ViewTreeObserver ti possa aiutare. Prova di questo codice:

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

paio di note:

  • onDraw ha mucchio di limiti di ciò che si può fare in esso. In particolare, non è possibile modificare l'albero delle viste. Se è qualcosa che devi fare, guarda invece lo ViewTreeObserver.OnPreDrawListener.
  • L'anteprima della fotocamera e la riproduzione multimediale sono disegnate su un percorso separato e molto probabilmente non sono sincronizzate con questo listener, quindi non si è in grado di usarlo per fare cose in sincrono con i singoli fotogrammi.
+0

Bello, questo è abbastanza buono per me ora. – horeaper

+1

Questo differisce da 'CADisplayLink' in quanto viene richiamato solo se la vista è disegnata, cosa che accade solo se la vista è invalidata, * dopo * il disegno è terminato. Al contrario, 'CADisplayLink' viene chiamato su ogni frame disegnato. Per simulare 'CADisplayLink', faccio quanto sopra, e richiama' invalidate() 'anche nel metodo' onDraw() 'della mia vista personalizzata. – mvds

3

L'equivalente più diretto di cui sono a conoscenza è Choreographer (come da API 16).

Sembra che il modo in cui sono scritte le animazioni determini il modo migliore per sincronizzarlo. Coreografo non è generalmente utile. Choreographer è utile se la tua animazione è scritta al di fuori del "framework di animazione" che AFAIK include ViewPropertyAnimator e ... forse animazioni definite XML? Esattamente ciò che non è documentato.

Choreographer sembra che sia principalmente utile per sincronizzare le animazioni GLSurfaceView.

+0

FWIW, sembra che il framework UI di Android renda il lock-step con GLSurfaceView. La mia ipotesi è che SurfaceFlinger esegua un dequeue del frame di blocco prima di compositing sui frame di output. – nmr

Problemi correlati