2013-06-18 23 views
7

Io sto usando un Servizio che visualizza una vista utilizzando WindowManager, e l'animazione si verifica ogni volta che cambio le dimensioni della vista utilizzandoCome disattivare "Scala animazione finestra" a livello di programmazione su dispositivi Android 4.0+?

windowManagerLayoutParams.height = newHeight; 
((WindowManager) getSystemService(WINDOW_SERVICE)).updateViewLayout(mMainLayout, windowManagerLayoutParams); 

Se io disattivare manualmente le animazioni di scala, si verifica nessuna animazione. animazione Scala disattivata manualmente in modo simile: http://www.cultofandroid.com/11143/android-4-0-tip-how-to-find-and-disable-animations-for-a-snappier-experience/

C'è un modo per disattivare le animazioni scala delle finestre per la mia applicazione di programmazione?

+0

Potrebbe fornire un breve video per mostrare che cosa esattamente vuoi dire? Ci sono animazioni di layout e ci sono animazioni di attività e ci sono dozzine di altre animazioni diverse là fuori: D – WarrenFaith

+0

È come un'animazione di diapositive. Il tipo di animazione non ha molta importanza, voglio solo disabilitarlo. –

+0

e la risposta dipende non dall'animazione stessa ma dagli eventi che l'animazione ha attivato. Se è per una transizione di attività, la risposta è diversa rispetto a un'animazione di layout pura ... – WarrenFaith

risposta

0

Hai provato Activity#overridePendingTransition(0, 0)?

Partenza the documentation:

chiamata subito dopo uno dei sapori della startActivity (Intento) o finitura() per specificare un'animazione esplicito transizione per eseguire il prossimo.

+1

Sì, l'ho fatto. Non è un'animazione di attività, in quanto non sono coinvolte attività. –

+0

Se si dispone di un'interfaccia utente, la mia ipotesi è che si dovrebbe avere un'attività. –

+2

Non è sempre così. È possibile allegare viste come pannelli/sovrapposizioni tramite il WindowManager che suona come quello che sta facendo .. – clark

12

Ho appena avuto questo stesso problema mentre lavoravo su un overlay di sistema nel pacchetto SystemUI e ho deciso di scavare attraverso l'origine per vedere se riuscivo a trovare una soluzione. WindowManager.LayoutParams ha alcune chicche nascoste che possono risolvere questo problema. Il trucco è quello di utilizzare il membro privateFlags di WindowManager.LayoutParams in questo modo:

windowManagerLayoutParams.privateFlags |= 0x00000040; 

Se si guarda alla linea 1019 di WindowManager.java vedrai che 0x00000040 è il valore per PRIVATE_FLAG_NO_MOVE_ANIMATION. Per me questo ha fermato le animazioni delle finestre che si verificano sulla mia vista quando cambio le dimensioni via updateViewLayout()

Ho avuto il vantaggio di lavorare su un pacchetto di sistema in modo da poter accedere a PrivateFlags direttamente nel mio codice ma avremo bisogno di utilizzare la riflessione se si desidera accedere a questo campo.

+0

Android ha aggiunto questo flag solo nella versione 4.3, quindi le animazioni si verificano ancora su altri dispositivi. –

+0

@RonTesler Qual è il nome di questa bandiera? Per favore, aggiungi il link da Android api.Non ho flag di fount in questa classe [WindowManager.LayoutParams] (http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html) – AndreyNik

+1

La flag è PRIVATE_FLAG_NO_MOVE_ANIMATION, ma come ho affermato nella mia risposta, questa non è un'API pubblica, quindi non c'è alcun collegamento per essa oltre a cercare nel codice sorgente per WindowManager. – clark

4

Come @clark dichiarato questo può essere modificato riflessione usando:

private void disableAnimations() { 
    try { 
     int currentFlags = (Integer) mLayoutParams.getClass().getField("privateFlags").get(mLayoutParams); 
     mLayoutParams.getClass().getField("privateFlags").set(mLayoutParams, currentFlags|0x00000040); 
    } catch (Exception e) { 
     //do nothing. Probably using other version of android 
    } 
} 
Problemi correlati