6

Sto animando una vista in un'attività dopo che onGlobalLayoutFinished è stato chiamato sulla vista. La mia animazione sta saltando ~ 300 ms valore di frame all'inizio. Se ritarda l'animazione di oltre ~ 300 ms, non salta nessun fotogramma. Che cosa sta succedendo nell'attività che sta causando questo? Come posso fermarlo o come posso ascoltarlo quando è finito?L'animazione all'inizio dell'attività salta i fotogrammi

Ho creato un'app semplicemente semplice per dimostrare questo comportamento.

contenuto di <application> in AndroidManifest.xml:

<activity 
    android:name=".main.TestLagActivity" 
    android:label="Test Lag Activity"> 
    <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

TestLagActivity.java:

public class TestLagActivity extends ActionBarActivity { 
    private View mRedSquareView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test_lag); 

    mRedSquareView = findViewById(R.id.activity_test_lag_redSquareView); 

    if (mRedSquareView.getViewTreeObserver() != null) { 
     mRedSquareView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      mRedSquareView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      animate(); 
     } 
     }); 
    } 
    } 

    private void animate() { 
    ObjectAnimator xAnimator = ObjectAnimator.ofFloat(mRedSquareView, "x", 0, 1000); 
    xAnimator.setDuration(1000); 
    xAnimator.start(); 
    } 
} 

activity_test_lag.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

    <View 
     android:id="@+id/activity_test_lag_redSquareView" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:background="#FF0000"/> 

</FrameLayout> 

In questa demo, un quadrato rosso si sposta da sinistra a destra di 1000 pixel su 1000 millisecondi. Se non è impostato alcun ritardo, salta all'incirca i primi 300 pixel. Se è impostato un ritardo, si anima senza intoppi. Si prega di vedere i video qui sotto.

Nessun ritardo (salta fotogrammi): https://www.youtube.com/watch?v=dEwvllhvvN0

400ms ritardo (non salta fames): https://www.youtube.com/watch?v=zW0akPhl_9I&feature=youtu.be

Eventuali commenti sono benvenuti.

+1

È davvero necessario mostrare i metodi onPause e onSaveInstanceState e potenzialmente la gerarchia delle viste. Potresti avere un blocco logico personalizzato in onPause prima di onSaveInstanceState o potresti avere una vista personalizzata che blocca in onSaveInstanceState. – dcow

+0

"onPause e onSaveInstanceState normalmente avvengono entro 20 ms l'uno dall'altro in MainActivity" ... cosa stai facendo in CreatActivity in modo diverso? –

+0

@dcow Avrei dovuto accennare che i metodi sono vuoti, oltre alle istruzioni del registro. – clocksmith

risposta

2

Questo accade a causa dell'animazione di transizione dell'attività, che viene riprodotta mentre si sta creando l'attività. Di conseguenza, l'animazione personalizzata inizia mentre il sistema è impegnato a disegnare la transizione.

Non ho ancora trovato una soluzione pulita. Per ora, sto semplicemente aspettando per tutta la durata della transizione prima di iniziare la mia animazione, ma è ben lungi dall'essere perfetto:

// The duration of the animation was found here: 
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.5_r1/frameworks/base/core/res/res/anim/activity_open_enter.xml 
new Handler().postDelayed(runnable, android.R.integer.config_shortAnimTime); 

Si potrebbe anche attività di disabilitare l'inserimento, invece, con:

overridePendingTransition(0, 0); 

Sto ancora cercando un modo per ascoltare l'ora esatta della transizione. Ti terremo aggiornato se mai trovo una soluzione.

Problemi correlati